mirror of
https://github.com/neovim/neovim.git
synced 2025-09-13 14:58:18 +00:00
tabpage: disallow go-to-previous in cmdline-win #11692
After cbc8d72fde
when editing
the command in the command editing window (q:, q/, q?) it was possible
to switch to the previous tab. Doing so put Nvim in a bad state.
Moreover, switching tabs via the other available mechanisms (gt, gT,
<C-W>gt, <C-W>gT) is not possible when in the command editing window.
Here, the behavior is prevented. It is no longer possible to switch to
the previous tab when editing the command in the command editing window.
The solution is to share code between gt, gT, and g<Tab>. Specifically,
goto_tabpage_lastused now calls through goto_tabpage rather than
directly calling goto_tabpage_tp. Doing so works well because all the
validation enjoyed by gt and gT is present in goto_tabpage.
This commit is contained in:

committed by
Justin M. Keyes

parent
25afa10f92
commit
29b1a4761a
@@ -4113,8 +4113,9 @@ void goto_tabpage_tp(tabpage_T *tp, int trigger_enter_autocmds, int trigger_leav
|
||||
// Go to the last accessed tab page, if there is one.
|
||||
void goto_tabpage_lastused(void)
|
||||
{
|
||||
if (valid_tabpage(lastused_tabpage)) {
|
||||
goto_tabpage_tp(lastused_tabpage, true, true);
|
||||
int index = tabpage_index(lastused_tabpage);
|
||||
if (index < tabpage_index(NULL)) {
|
||||
goto_tabpage(index);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -480,4 +480,40 @@ describe('tabpage/previous', function()
|
||||
-- does_not_switch_to_previous_after_entering_operator_pending('<C-W>g<Tab>'))
|
||||
it('does not switch to previous via <C-Tab> after entering operator pending',
|
||||
does_not_switch_to_previous_after_entering_operator_pending('<C-Tab>'))
|
||||
|
||||
local function cmdline_win_prevents_tab_switch(characters, completion_visible)
|
||||
return function()
|
||||
-- Add three tabs for a total of four
|
||||
command('tabnew')
|
||||
command('tabnew')
|
||||
command('tabnew')
|
||||
|
||||
-- The previous tab is now the third.
|
||||
eq(3, eval('tabpagenr(\'#\')'))
|
||||
|
||||
-- Edit : command line in command-line window
|
||||
feed('q:')
|
||||
|
||||
local cmdline_win_id = eval('win_getid()')
|
||||
|
||||
-- At this point switching to the previous tab should have no effect.
|
||||
feed(characters)
|
||||
|
||||
-- Attempting to switch tabs maintains the current window.
|
||||
eq(cmdline_win_id, eval('win_getid()'))
|
||||
eq(completion_visible, eval('complete_info().pum_visible'))
|
||||
|
||||
-- The current tab is still the fourth.
|
||||
eq(4, eval('tabpagenr()'))
|
||||
|
||||
-- The previous tab is still the third.
|
||||
eq(3, eval('tabpagenr(\'#\')'))
|
||||
end
|
||||
end
|
||||
it('cmdline-win prevents tab switch via g<Tab>',
|
||||
cmdline_win_prevents_tab_switch('g<Tab>', 0))
|
||||
it('cmdline-win prevents tab switch via <C-W>g<Tab>',
|
||||
cmdline_win_prevents_tab_switch('<C-W>g<Tab>', 1))
|
||||
it('cmdline-win prevents tab switch via <C-Tab>',
|
||||
cmdline_win_prevents_tab_switch('<C-Tab>', 0))
|
||||
end)
|
||||
|
Reference in New Issue
Block a user