diff options
| author | Frank LENORMAND <lenormf@gmail.com> | 2021-07-22 16:12:18 +0300 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2022-03-06 10:13:14 +1100 |
| commit | 85b78dda2e29d70b620836b04224b104426bdbae (patch) | |
| tree | 68f3f68019d52c11ec0bb7f70344bc46ad941f01 /src | |
| parent | 70610017284af7effd675bd927ae25b084b3e4b9 (diff) | |
src: Select the data inserted by `!` and `<a-!>`
Closes #1468
Diffstat (limited to 'src')
| -rw-r--r-- | src/normal.cc | 11 | ||||
| -rw-r--r-- | src/selection.cc | 3 | ||||
| -rw-r--r-- | src/selection.hh | 2 |
3 files changed, 12 insertions, 4 deletions
diff --git a/src/normal.cc b/src/normal.cc index ca7063fd..15f07211 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -765,6 +765,7 @@ void insert_output(Context& context, NormalParams params) auto& selections = context.selections(); auto& buffer = context.buffer(); const size_t old_main = selections.main_index(); + Vector<BufferRange> ins_range; selections.for_each([&](size_t index, Selection& sel) { selections.set_main_index(index); @@ -772,10 +773,16 @@ void insert_output(Context& context, NormalParams params) cmdline, context, content(context.buffer(), sel), ShellManager::Flags::WaitForStdout); - insert(buffer, sel, paste_pos(buffer, sel, mode, false), out); + auto range = insert(buffer, sel, paste_pos(buffer, sel, mode, false), out); + ins_range.push_back(range); }); - selections.set_main_index(old_main); + selections.set(ins_range | transform([&buffer](auto& range) { + if (range.empty()) + return Selection{range.begin, range.end}; + return Selection{range.begin, + buffer.char_prev(range.end)}; + }) | gather<Vector>(), old_main); }); } diff --git a/src/selection.cc b/src/selection.cc index d408ddfd..cbf9bef2 100644 --- a/src/selection.cc +++ b/src/selection.cc @@ -399,11 +399,12 @@ void replace(Buffer& buffer, Selection& sel, StringView content) max = range.end > range.begin ? buffer.char_prev(range.end) : range.begin; } -void insert(Buffer& buffer, Selection& sel, BufferCoord pos, StringView content) +BufferRange insert(Buffer& buffer, Selection& sel, BufferCoord pos, StringView content) { auto range = buffer.insert(pos, content); sel.anchor() = buffer.clamp(update_insert(sel.anchor(), range.begin, range.end)); sel.cursor() = buffer.clamp(update_insert(sel.cursor(), range.begin, range.end)); + return range; } void SelectionList::replace(ConstArrayView<String> strings) diff --git a/src/selection.hh b/src/selection.hh index 1aebe41f..43ea412b 100644 --- a/src/selection.hh +++ b/src/selection.hh @@ -75,7 +75,7 @@ void merge_overlapping_selections(Vector<Selection>& selections, size_t& main); void clamp_selections(Vector<Selection>& sel, const Buffer& buffer); void replace(Buffer& buffer, Selection& sel, StringView content); -void insert(Buffer& buffer, Selection& sel, BufferCoord pos, StringView content); +BufferRange insert(Buffer& buffer, Selection& sel, BufferCoord pos, StringView content); struct SelectionList { |
