ops: save and restore clipboard batch status when entering cmdline window

This commit is contained in:
Björn Linse 2017-10-10 18:42:01 +02:00
parent 68f3da5f61
commit 4b3e51d4ee
3 changed files with 35 additions and 2 deletions

View File

@ -5718,6 +5718,7 @@ static int ex_window(void)
i = RedrawingDisabled; i = RedrawingDisabled;
RedrawingDisabled = 0; RedrawingDisabled = 0;
int save_count = save_batch_count();
/* /*
* Call the main loop until <CR> or CTRL-C is typed. * Call the main loop until <CR> or CTRL-C is typed.
@ -5726,6 +5727,7 @@ static int ex_window(void)
normal_enter(true, false); normal_enter(true, false);
RedrawingDisabled = i; RedrawingDisabled = i;
restore_batch_count(save_count);
int save_KeyTyped = KeyTyped; int save_KeyTyped = KeyTyped;

View File

@ -5755,7 +5755,6 @@ void start_batch_changes(void)
return; return;
} }
clipboard_delay_update = true; clipboard_delay_update = true;
clipboard_needs_update = false;
} }
/// Counterpart to start_batch_changes(). /// Counterpart to start_batch_changes().
@ -5767,12 +5766,37 @@ void end_batch_changes(void)
} }
clipboard_delay_update = false; clipboard_delay_update = false;
if (clipboard_needs_update) { if (clipboard_needs_update) {
// must be before, as set_clipboard will invoke
// start/end_batch_changes recursively
clipboard_needs_update = false;
// unnamed ("implicit" clipboard) // unnamed ("implicit" clipboard)
set_clipboard(NUL, y_previous); set_clipboard(NUL, y_previous);
clipboard_needs_update = false;
} }
} }
int save_batch_count(void)
{
int save_count = batch_change_count;
batch_change_count = 0;
clipboard_delay_update = false;
if (clipboard_needs_update) {
clipboard_needs_update = false;
// unnamed ("implicit" clipboard)
set_clipboard(NUL, y_previous);
}
return save_count;
}
void restore_batch_count(int save_count)
{
assert(batch_change_count == 0);
batch_change_count = save_count;
if (batch_change_count > 0) {
clipboard_delay_update = true;
}
}
/// Check whether register is empty /// Check whether register is empty
static inline bool reg_empty(const yankreg_T *const reg) static inline bool reg_empty(const yankreg_T *const reg)
FUNC_ATTR_PURE FUNC_ATTR_PURE

View File

@ -392,6 +392,13 @@ describe('clipboard', function()
eq('---', eval('getreg("*")')) eq('---', eval('getreg("*")'))
end) end)
it('works in the cmdline window', function()
feed('q:itext<esc>yy')
eq({{'text', ''}, 'V'}, eval("g:test_clip['*']"))
command("let g:test_clip['*'] = [['star'], 'c']")
feed('p')
eq('textstar', meths.get_current_line())
end)
end) end)
describe('clipboard=unnamedplus', function() describe('clipboard=unnamedplus', function()