diff options
| author | Maxime Coste <mawww@kakoune.org> | 2017-11-07 23:58:56 +0800 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2017-11-08 00:02:49 +0800 |
| commit | 04993de68765d64e6da882e4fd055fdc07bd736b (patch) | |
| tree | 18fc70a8ed9021685f382eecf533602b1d0ee28e /src | |
| parent | d45f16b6c813842690e06ca70102be345ce80596 (diff) | |
Fix pipe logic in the case where the selections were accessed in the cmdline
When using an env var that needed the selections in the pipe command line,
say $kak_selection, the selection update code would run, modifying the
selections to adapt to eventual changes. But the rest of the pipe logic
was assuming the selections would not change, leading to bugs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/normal.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/normal.cc b/src/normal.cc index 363ebc8a..483be93c 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -512,9 +512,11 @@ void pipe(Context& context, NormalParams) return; Buffer& buffer = context.buffer(); - SelectionList& selections = context.selections(); - const int old_main = selections.main_index(); - auto restore_main = on_scope_end([&] { selections.set_main_index(old_main); }); + SelectionList selections = context.selections(); + auto restore_sels = on_scope_end([&, old_main = selections.main_index()] { + selections.set_main_index(old_main); + context.selections() = std::move(selections); + }); if (replace) { ScopedEdition edition(context); @@ -531,6 +533,10 @@ void pipe(Context& context, NormalParams) const bool insert_eol = in.back() != '\n'; if (insert_eol) in += '\n'; + + // Needed in case we read selections inside the cmdline + context.selections_write_only() = selections; + String out = ShellManager::instance().eval( cmdline, context, in, ShellManager::Flags::WaitForStdout).first; |
