diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-12-15 20:52:57 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-12-15 20:52:57 +0000 |
| commit | f83d5672f830d49e9ff9fa2f5df8144d0e362e56 (patch) | |
| tree | 65d38c6e50a821ce6fb365a65a817ade60646556 /src | |
| parent | ea95632709a6ae3df76772e83e1497a9fcfee52d (diff) | |
Fix replace_with_char behaviour, keep the same selections
Diffstat (limited to 'src')
| -rw-r--r-- | src/normal.cc | 11 | ||||
| -rw-r--r-- | src/selection.hh | 7 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/normal.cc b/src/normal.cc index 6bdab3c1..052d1fd5 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -374,9 +374,14 @@ void replace_with_char(Context& context, int) return; ScopedEdition edition(context); Buffer& buffer = context.buffer(); - SelectionList selections = context.selections(); - select_all_matches(buffer, selections, Regex{"."}); - insert<InsertMode::Replace>(buffer, selections, codepoint_to_str(key.key)); + SelectionList& selections = context.selections(); + std::vector<String> strings; + for (auto& sel : selections) + { + CharCount count = char_length(buffer, sel); + strings.emplace_back(key.key, count); + } + insert<InsertMode::Replace>(buffer, selections, strings); }, "replace with char", "enter char to replace with\n"); } diff --git a/src/selection.hh b/src/selection.hh index e8278625..aad74f95 100644 --- a/src/selection.hh +++ b/src/selection.hh @@ -51,6 +51,13 @@ inline BufferIterator erase(Buffer& buffer, const Range& range) utf8::next(buffer.iterator_at(range.max()))); } +inline CharCount char_length(const Buffer& buffer, const Range& range) +{ + return utf8::distance(buffer.iterator_at(range.min()), + utf8::next(buffer.iterator_at(range.max()))); +} + + inline void avoid_eol(const Buffer& buffer, BufferCoord& coord) { const auto column = coord.column; |
