123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 |
- local t = require('test.testutil')
- local n = require('test.functional.testnvim')()
- local clear = n.clear
- local command = n.command
- local dedent = t.dedent
- local eval = n.eval
- local eq = t.eq
- local feed = n.feed
- local api = n.api
- local exec_capture = n.exec_capture
- describe('TabNewEntered', function()
- describe('au TabNewEntered', function()
- describe('with * as <afile>', function()
- it('matches when entering any new tab', function()
- clear()
- command('au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")')
- eq('tabnewentered:2:2', api.nvim_exec('tabnew', true))
- eq('tabnewentered:3:3', api.nvim_exec('tabnew test.x2', true))
- end)
- end)
- describe('with FILE as <afile>', function()
- it('matches when opening a new tab for FILE', function()
- clear()
- command('au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"')
- eq('tabnewentered:match', api.nvim_exec('tabnew Xtest-tabnewentered', true))
- end)
- end)
- describe('with CTRL-W T', function()
- it('works when opening a new tab with CTRL-W T', function()
- clear()
- command('au! TabNewEntered * echom "entered"')
- command('tabnew test.x2')
- command('split')
- eq('entered', api.nvim_exec('execute "normal \\<C-W>T"', true))
- end)
- end)
- describe('with tab split #4334', function()
- it('works when create a tab by using tab split command', function()
- clear()
- command('au! TabNewEntered * let b:entered = "entered"')
- command('tab split')
- eq('entered', api.nvim_exec('echo b:entered', true))
- end)
- end)
- end)
- end)
- describe('TabEnter', function()
- before_each(clear)
- it('has correct previous tab when entering any new tab', function()
- command('augroup TEMP')
- command('au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
- command('augroup END')
- eq('tabenter:2:1', api.nvim_exec('tabnew', true))
- eq('tabenter:3:2', api.nvim_exec('tabnew test.x2', true))
- command('augroup! TEMP')
- end)
- it('has correct previous tab when entering any preexisting tab', function()
- command('tabnew')
- command('tabnew')
- command('augroup TEMP')
- command('au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
- command('augroup END')
- eq('tabenter:1:3', api.nvim_exec('tabnext', true))
- eq('tabenter:2:1', api.nvim_exec('tabnext', true))
- command('augroup! TEMP')
- end)
- end)
- describe('tabpage/previous', function()
- before_each(clear)
- local function switches_to_previous_after_new_tab_creation_at_end(characters)
- 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('#')"))
- -- Switch to the previous (third) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- > [No Name]
- Tab page 4
- # [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after new tab creation at end',
- switches_to_previous_after_new_tab_creation_at_end('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab>. after new tab creation at end',
- switches_to_previous_after_new_tab_creation_at_end('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab>. after new tab creation at end',
- switches_to_previous_after_new_tab_creation_at_end('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR>. after new tab creation at end',
- switches_to_previous_after_new_tab_creation_at_end(':tabn #<CR>')
- )
- local function switches_to_previous_after_new_tab_creation_in_middle(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the second tab
- command('tabnext 2')
- -- Add a new tab after the second tab
- command('tabnew')
- -- The previous tab is now the second.
- eq(2, eval("tabpagenr('#')"))
- -- Switch to the previous (second) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- > [No Name]
- Tab page 3
- # [No Name]
- Tab page 4
- [No Name]
- Tab page 5
- [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the third.
- eq(3, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after new tab creation in middle',
- switches_to_previous_after_new_tab_creation_in_middle('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after new tab creation in middle',
- switches_to_previous_after_new_tab_creation_in_middle('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after new tab creation in middle',
- switches_to_previous_after_new_tab_creation_in_middle('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after new tab creation in middle',
- switches_to_previous_after_new_tab_creation_in_middle(':tabn #<CR>')
- )
- local function switches_to_previous_after_switching_to_next_tab(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the next (first) tab
- command('tabnext')
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- -- Switch to the previous (fourth) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- # [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- [No Name]
- Tab page 4
- > [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the first.
- eq(1, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after switching to next tab',
- switches_to_previous_after_switching_to_next_tab('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to next tab',
- switches_to_previous_after_switching_to_next_tab('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to next tab',
- switches_to_previous_after_switching_to_next_tab('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to next tab',
- switches_to_previous_after_switching_to_next_tab(':tabn #<CR>')
- )
- local function switches_to_previous_after_switching_to_last_tab(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the next (first) tab
- command('tabnext')
- -- Switch to the last (fourth) tab.
- command('tablast')
- -- The previous tab is now the second.
- eq(1, eval("tabpagenr('#')"))
- -- Switch to the previous (second) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- > [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- [No Name]
- Tab page 4
- # [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous after switching to last tab',
- switches_to_previous_after_switching_to_last_tab('g<Tab>')
- )
- it(
- 'switches to previous after switching to last tab',
- switches_to_previous_after_switching_to_last_tab('<C-W>g<Tab>')
- )
- it(
- 'switches to previous after switching to last tab',
- switches_to_previous_after_switching_to_last_tab('<C-Tab>')
- )
- it(
- 'switches to previous after switching to last tab',
- switches_to_previous_after_switching_to_last_tab(':tabn #<CR>')
- )
- local function switches_to_previous_after_switching_to_previous_tab(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the previous (third) tab
- command('tabprevious')
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- -- Switch to the previous (fourth) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- # [No Name]
- Tab page 4
- > [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the third.
- eq(3, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after switching to previous tab',
- switches_to_previous_after_switching_to_previous_tab('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to previous tab',
- switches_to_previous_after_switching_to_previous_tab('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to previous tab',
- switches_to_previous_after_switching_to_previous_tab('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to previous tab',
- switches_to_previous_after_switching_to_previous_tab(':tabn #<CR>')
- )
- local function switches_to_previous_after_switching_to_first_tab(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the previous (third) tab
- command('tabprevious')
- -- Switch to the first tab
- command('tabfirst')
- -- The previous tab is now the third.
- eq(3, eval("tabpagenr('#')"))
- -- Switch to the previous (third) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- # [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- > [No Name]
- Tab page 4
- [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the first.
- eq(1, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after switching to first tab',
- switches_to_previous_after_switching_to_first_tab('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to first tab',
- switches_to_previous_after_switching_to_first_tab('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to first tab',
- switches_to_previous_after_switching_to_first_tab('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to first tab',
- switches_to_previous_after_switching_to_first_tab(':tabn #<CR>')
- )
- local function switches_to_previous_after_numbered_tab_switch(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the second tab
- command('tabnext 2')
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- -- Switch to the previous (fourth) tab
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- # [No Name]
- Tab page 3
- [No Name]
- Tab page 4
- > [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the second.
- eq(2, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after numbered tab switch',
- switches_to_previous_after_numbered_tab_switch('g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after numbered tab switch',
- switches_to_previous_after_numbered_tab_switch('<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after numbered tab switch',
- switches_to_previous_after_numbered_tab_switch('<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after numbered tab switch',
- switches_to_previous_after_numbered_tab_switch(':tabn #<CR>')
- )
- local function switches_to_previous_after_switching_to_previous(characters1, characters2)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Switch to the second tab
- command('tabnext 2')
- -- Switch to the previous (fourth) tab
- feed(characters1)
- -- The previous tab is now the second.
- eq(2, eval("tabpagenr('#')"))
- -- Switch to the previous (second) tab
- feed(characters2)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- > [No Name]
- Tab page 3
- [No Name]
- Tab page 4
- # [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the fourth.
- eq(4, eval("tabpagenr('#')"))
- end
- end
- it(
- 'switches to previous via g<Tab> after switching to previous via g<Tab>',
- switches_to_previous_after_switching_to_previous('g<Tab>', 'g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to previous via g<Tab>',
- switches_to_previous_after_switching_to_previous('g<Tab>', '<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to previous via g<Tab>',
- switches_to_previous_after_switching_to_previous('g<Tab>', '<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to previous via g<Tab>',
- switches_to_previous_after_switching_to_previous('g<Tab>', ':tabn #<CR>')
- )
- it(
- 'switches to previous via g<Tab> after switching to previous via <C-W>g<Tab>',
- switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', 'g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to previous via <C-W>g<Tab>',
- switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', '<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to previous via <C-W>g<Tab>',
- switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', '<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to previous via <C-W>g<Tab>',
- switches_to_previous_after_switching_to_previous('<C-W>g<Tab>', ':tabn #<CR>')
- )
- it(
- 'switches to previous via g<Tab> after switching to previous via <C-Tab>',
- switches_to_previous_after_switching_to_previous('<C-Tab>', 'g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to previous via <C-Tab>',
- switches_to_previous_after_switching_to_previous('<C-Tab>', '<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to previous via <C-Tab>',
- switches_to_previous_after_switching_to_previous('<C-Tab>', '<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to previous via <C-Tab>',
- switches_to_previous_after_switching_to_previous('<C-Tab>', ':tabn #<CR>')
- )
- it(
- 'switches to previous via g<Tab> after switching to previous via :tabn #<CR>',
- switches_to_previous_after_switching_to_previous(':tabn #<CR>', 'g<Tab>')
- )
- it(
- 'switches to previous via <C-W>g<Tab> after switching to previous via :tabn #<CR>',
- switches_to_previous_after_switching_to_previous(':tabn #<CR>', '<C-W>g<Tab>')
- )
- it(
- 'switches to previous via <C-Tab> after switching to previous via <C-Tab>',
- switches_to_previous_after_switching_to_previous(':tabn #<CR>', '<C-Tab>')
- )
- it(
- 'switches to previous via :tabn #<CR> after switching to previous via :tabn #<CR>',
- switches_to_previous_after_switching_to_previous(':tabn #<CR>', ':tabn #<CR>')
- )
- local function does_not_switch_to_previous_after_closing_current_tab(characters)
- return function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('tabnew')
- -- Close the current (fourth tab)
- command('wincmd c')
- -- The previous tab is now the "zeroth" -- there isn't one.
- eq(0, eval("tabpagenr('#')"))
- -- At this point, switching to the "previous" (i.e. fourth) tab would mean
- -- switching to either a dangling or a null pointer.
- feed(characters)
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- > [No Name]]=]),
- exec_capture('tabs')
- )
- -- The previous tab is now the "zero".
- eq(0, eval("tabpagenr('#')"))
- end
- end
- it(
- 'does not switch to previous via g<Tab> after closing current tab',
- does_not_switch_to_previous_after_closing_current_tab('g<Tab>')
- )
- it(
- 'does not switch to previous via <C-W>g<Tab> after closing current tab',
- does_not_switch_to_previous_after_closing_current_tab('<C-W>g<Tab>')
- )
- it(
- 'does not switch to previous via <C-Tab> after closing current tab',
- does_not_switch_to_previous_after_closing_current_tab('<C-Tab>')
- )
- it(
- 'does not switch to previous via :tabn #<CR> after closing current tab',
- does_not_switch_to_previous_after_closing_current_tab(':tabn #<CR>')
- )
- local function does_not_switch_to_previous_after_entering_operator_pending(characters)
- 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('#')"))
- -- Enter operator pending mode.
- feed('d')
- eq('no', eval('mode(1)'))
- -- At this point switching to the previous tab should have no effect
- -- other than leaving operator pending mode.
- feed(characters)
- -- Attempting to switch tabs returns us to normal mode.
- eq('n', eval('mode()'))
- -- 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(
- 'does not switch to previous via g<Tab> after entering operator pending',
- does_not_switch_to_previous_after_entering_operator_pending('g<Tab>')
- )
- -- NOTE: When in operator pending mode, attempting to switch to previous has
- -- the following effect:
- -- - Ctrl-W exits operator pending mode
- -- - g<Tab> switches to the previous tab
- -- In other words, the effect of "<C-W>g<Tab>" is to switch to the
- -- previous tab even from operator pending mode, but only thanks to the
- -- fact that the suffix after "<C-W>" in "<C-W>g<Tab>" just happens to
- -- be the same as the normal mode command to switch to the previous tab.
- -- it('does not switch to previous via <C-W>g<Tab> after entering operator pending',
- -- 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>')
- )
- -- NOTE: When in operator pending mode, pressing : leaves operator pending
- -- mode and enters command mode, so :tabn #<CR> does in fact switch
- -- tabs.
- -- it('does not switch to previous via :tabn #<CR> after entering operator pending',
- -- does_not_switch_to_previous_after_entering_operator_pending(':tabn #<CR>'))
- 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))
- it(
- 'cmdline-win prevents tab switch via :tabn #<CR>',
- cmdline_win_prevents_tab_switch(':tabn #<CR>', 0)
- )
- it(':tabs indicates correct prevtab curwin', function()
- -- Add three tabs for a total of four
- command('tabnew')
- command('tabnew')
- command('split')
- command('vsplit')
- feed('<C-w>p')
- command('tabnew')
- -- The previous tab is now the three.
- eq(3, eval("tabpagenr('#')"))
- eq(
- dedent([=[
- Tab page 1
- [No Name]
- Tab page 2
- [No Name]
- Tab page 3
- [No Name]
- # [No Name]
- [No Name]
- Tab page 4
- > [No Name]]=]),
- exec_capture('tabs')
- )
- end)
- end)
|