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:
parent
d45f16b6c8
commit
04993de687
|
@ -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;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
%<a-s>|[ $kak_selection = "bar" ] && echo "yes"<ret>
|
3
test/regression/0-crash-on-pipe-with-selection-access/in
Normal file
3
test/regression/0-crash-on-pipe-with-selection-access/in
Normal file
|
@ -0,0 +1,3 @@
|
|||
foo
|
||||
bar
|
||||
baz
|
|
@ -0,0 +1 @@
|
|||
yes
|
Loading…
Reference in New Issue
Block a user