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.
This commit is contained in:
Maxime Coste 2017-11-07 23:58:56 +08:00
parent d45f16b6c8
commit 04993de687
4 changed files with 14 additions and 3 deletions

View File

@ -512,9 +512,11 @@ void pipe(Context& context, NormalParams)
return; return;
Buffer& buffer = context.buffer(); Buffer& buffer = context.buffer();
SelectionList& selections = context.selections(); SelectionList selections = context.selections();
const int old_main = selections.main_index(); auto restore_sels = on_scope_end([&, old_main = selections.main_index()] {
auto restore_main = on_scope_end([&] { selections.set_main_index(old_main); }); selections.set_main_index(old_main);
context.selections() = std::move(selections);
});
if (replace) if (replace)
{ {
ScopedEdition edition(context); ScopedEdition edition(context);
@ -531,6 +533,10 @@ void pipe(Context& context, NormalParams)
const bool insert_eol = in.back() != '\n'; const bool insert_eol = in.back() != '\n';
if (insert_eol) if (insert_eol)
in += '\n'; in += '\n';
// Needed in case we read selections inside the cmdline
context.selections_write_only() = selections;
String out = ShellManager::instance().eval( String out = ShellManager::instance().eval(
cmdline, context, in, cmdline, context, in,
ShellManager::Flags::WaitForStdout).first; ShellManager::Flags::WaitForStdout).first;

View File

@ -0,0 +1 @@
%<a-s>|[ $kak_selection = "bar" ] && echo "yes"<ret>

View File

@ -0,0 +1,3 @@
foo
bar
baz

View File

@ -0,0 +1 @@
yes