diff options
Diffstat (limited to 'test/functional/ui/popupmenu_spec.lua')
-rw-r--r-- | test/functional/ui/popupmenu_spec.lua | 6213 |
1 files changed, 3721 insertions, 2492 deletions
diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua index c681453294..a6cd216d84 100644 --- a/test/functional/ui/popupmenu_spec.lua +++ b/test/functional/ui/popupmenu_spec.lua @@ -5,6 +5,7 @@ local clear, feed = helpers.clear, helpers.feed local source = helpers.source local insert = helpers.insert local meths = helpers.meths +local async_meths = helpers.async_meths local command = helpers.command local funcs = helpers.funcs local eq = helpers.eq @@ -1023,1870 +1024,11 @@ describe('ui/ext_popupmenu', function() end) end) +describe("builtin popupmenu 'pumblend'", function() + before_each(clear) -describe('builtin popupmenu', function() - local screen - before_each(function() - clear() - screen = Screen.new(32, 20) - screen:attach() - screen:set_default_attr_ids({ - -- popup selected item / scrollbar track - ['s'] = {background = Screen.colors.WebGray}, - -- popup non-selected item - ['n'] = {background = Screen.colors.LightMagenta}, - -- popup scrollbar knob - ['c'] = {background = Screen.colors.Grey0}, - [1] = {bold = true, foreground = Screen.colors.Blue}, - [2] = {bold = true}, - [3] = {reverse = true}, - [4] = {bold = true, reverse = true}, - [5] = {bold = true, foreground = Screen.colors.SeaGreen}, - [6] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, - [7] = {background = Screen.colors.Yellow}, -- Search - [8] = {foreground = Screen.colors.Red}, - }) - end) - - it('with preview-window above', function() - feed(':ped<CR><c-w>4+') - feed('iaa bb cc dd ee ff gg hh ii jj<cr>') - feed('<c-x><c-n>') - screen:expect([[ - aa bb cc dd ee ff gg hh ii jj | - aa | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {3:[No Name] [Preview][+] }| - aa bb cc dd ee ff gg hh ii jj | - aa^ | - {s:aa }{c: }{1: }| - {n:bb }{c: }{1: }| - {n:cc }{c: }{1: }| - {n:dd }{c: }{1: }| - {n:ee }{c: }{1: }| - {n:ff }{c: }{1: }| - {n:gg }{s: }{1: }| - {n:hh }{s: }{4: }| - {2:-- }{5:match 1 of 10} | - ]]) - end) - - it('with preview-window below', function() - feed(':ped<CR><c-w>4+<c-w>r') - feed('iaa bb cc dd ee ff gg hh ii jj<cr>') - feed('<c-x><c-n>') - screen:expect([[ - aa bb cc dd ee ff gg hh ii jj | - aa^ | - {s:aa }{c: }{1: }| - {n:bb }{c: }{1: }| - {n:cc }{c: }{1: }| - {n:dd }{c: }{1: }| - {n:ee }{c: }{1: }| - {n:ff }{c: }{1: }| - {n:gg }{s: }{1: }| - {n:hh }{s: }{4: }| - aa bb cc dd ee ff gg hh ii jj | - aa | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {3:[No Name] [Preview][+] }| - {2:-- }{5:match 1 of 10} | - ]]) - end) - - it('with preview-window above and tall and inverted', function() - feed(':ped<CR><c-w>8+') - feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') - feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') - feed('kk<cr>ll<cr>mm<cr>nn<cr>oo<cr>') - feed('<c-x><c-n>') - screen:expect([[ - aa | - bb | - cc | - dd | - {s:aa }{c: }{3:ew][+] }| - {n:bb }{c: } | - {n:cc }{c: } | - {n:dd }{c: } | - {n:ee }{c: } | - {n:ff }{c: } | - {n:gg }{c: } | - {n:hh }{c: } | - {n:ii }{c: } | - {n:jj }{c: } | - {n:kk }{c: } | - {n:ll }{s: } | - {n:mm }{s: } | - aa^ | - {4:[No Name] [+] }| - {2:-- }{5:match 1 of 15} | - ]]) - end) - - it('with preview-window above and short and inverted', function() - feed(':ped<CR><c-w>4+') - feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') - feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') - feed('<c-x><c-n>') - screen:expect([[ - aa | - bb | - cc | - dd | - ee | - ff | - gg | - hh | - {s:aa }{c: }{3:ew][+] }| - {n:bb }{c: } | - {n:cc }{c: } | - {n:dd }{c: } | - {n:ee }{c: } | - {n:ff }{c: } | - {n:gg }{c: } | - {n:hh }{c: } | - {n:ii }{s: } | - aa^ | - {4:[No Name] [+] }| - {2:-- }{5:match 1 of 10} | - ]]) - end) - - it('with preview-window below and inverted', function() - feed(':ped<CR><c-w>4+<c-w>r') - feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') - feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') - feed('<c-x><c-n>') - screen:expect([[ - {s:aa }{c: } | - {n:bb }{c: } | - {n:cc }{c: } | - {n:dd }{c: } | - {n:ee }{c: } | - {n:ff }{c: } | - {n:gg }{s: } | - {n:hh }{s: } | - aa^ | - {4:[No Name] [+] }| - aa | - bb | - cc | - dd | - ee | - ff | - gg | - hh | - {3:[No Name] [Preview][+] }| - {2:-- }{5:match 1 of 10} | - ]]) - end) - - -- oldtest: Test_pum_with_preview_win() - it('preview window opened during completion', function() - exec([[ - funct Omni_test(findstart, base) - if a:findstart - return col(".") - 1 - endif - return [#{word: "one", info: "1info"}, #{word: "two", info: "2info"}, #{word: "three", info: "3info"}] - endfunc - set omnifunc=Omni_test - set completeopt+=longest - ]]) - feed('Gi<C-X><C-O>') - screen:expect([[ - ^ | - {n:one }{1: }| - {n:two }{1: }| - {n:three }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- }{8:Back at original} | - ]]) - feed('<C-N>') - screen:expect([[ - 1info | - | - {1:~ }| - {3:[Scratch] [Preview] }| - one^ | - {s:one }{1: }| - {n:two }{1: }| - {n:three }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4:[No Name] [+] }| - {2:-- }{5:match 1 of 3} | - ]]) - end) - - it('with vsplits', function() - insert('aaa aab aac\n') - feed(':vsplit<cr>') - screen:expect([[ - aaa aab aac │aaa aab aac| - ^ │ | - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {4:[No Name] [+] }{3:<Name] [+] }| - :vsplit | - ]]) - - feed('ibbb a<c-x><c-n>') - screen:expect([[ - aaa aab aac │aaa aab aac| - bbb aaa^ │bbb aaa | - {1:~ }{s: aaa }{1: }│{1:~ }| - {1:~ }{n: aab }{1: }│{1:~ }| - {1:~ }{n: aac }{1: }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {4:[No Name] [+] }{3:<Name] [+] }| - {2:-- }{5:match 1 of 3} | - ]]) - - feed('<esc><c-w><c-w>oc a<c-x><c-n>') - screen:expect([[ - aaa aab aac│aaa aab aac | - bbb aaa │bbb aaa | - c aaa │c aaa^ | - {1:~ }│{1:~}{s: aaa }{1: }| - {1:~ }│{1:~}{n: aab }{1: }| - {1:~ }│{1:~}{n: aac }{1: }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| - {3:<Name] [+] }{4:[No Name] [+] }| - {2:-- }{5:match 1 of 3} | - ]]) - end) - - it('with split and scroll', function() - screen:try_resize(60,14) - command("split") - command("set completeopt+=noinsert") - command("set mouse=a") - insert([[ - Lorem ipsum dolor sit amet, consectetur - adipisicing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. - Ut enim ad minim veniam, quis nostrud - exercitation ullamco laboris nisi ut aliquip ex - ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum - dolore eu fugiat nulla pariatur. Excepteur sint - occaecat cupidatat non proident, sunt in culpa - qui officia deserunt mollit anim id est - laborum. - ]]) - - screen:expect([[ - reprehenderit in voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - occaecat cupidatat non proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - ^ | - {4:[No Name] [+] }| - Lorem ipsum dolor sit amet, consectetur | - adipisicing elit, sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {3:[No Name] [+] }| - | - ]]) - - feed('ggOEst <c-x><c-p>') - screen:expect([[ - Est ^ | - L{n: sunt }{s: }sit amet, consectetur | - a{n: in }{s: }sed do eiusmod tempor | - i{n: culpa }{s: }re et dolore magna aliqua. | - U{n: qui }{s: }eniam, quis nostrud | - e{n: officia }{s: }co laboris nisi ut aliquip ex | - {4:[No}{n: deserunt }{s: }{4: }| - L{n: mollit }{s: }sit amet, consectetur | - a{n: anim }{s: }sed do eiusmod tempor | - i{n: id }{s: }re et dolore magna aliqua. | - U{n: est }{s: }eniam, quis nostrud | - e{n: laborum }{c: }co laboris nisi ut aliquip ex | - {3:[No}{s: Est }{c: }{3: }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - meths.input_mouse('wheel', 'down', '', 0, 9, 40) - screen:expect([[ - Est ^ | - L{n: sunt }{s: }sit amet, consectetur | - a{n: in }{s: }sed do eiusmod tempor | - i{n: culpa }{s: }re et dolore magna aliqua. | - U{n: qui }{s: }eniam, quis nostrud | - e{n: officia }{s: }co laboris nisi ut aliquip ex | - {4:[No}{n: deserunt }{s: }{4: }| - U{n: mollit }{s: }eniam, quis nostrud | - e{n: anim }{s: }co laboris nisi ut aliquip ex | - e{n: id }{s: }at. Duis aute irure dolor in | - r{n: est }{s: }oluptate velit esse cillum | - d{n: laborum }{c: }ulla pariatur. Excepteur sint | - {3:[No}{s: Est }{c: }{3: }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - feed('e') - screen:expect([[ - Est e^ | - L{n: elit } sit amet, consectetur | - a{n: eiusmod } sed do eiusmod tempor | - i{n: et }ore et dolore magna aliqua. | - U{n: enim }veniam, quis nostrud | - e{n: exercitation }mco laboris nisi ut aliquip ex | - {4:[No}{n: ex }{4: }| - U{n: ea }veniam, quis nostrud | - e{n: esse }mco laboris nisi ut aliquip ex | - e{n: eu }uat. Duis aute irure dolor in | - r{s: est }voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - meths.input_mouse('wheel', 'up', '', 0, 9, 40) - screen:expect([[ - Est e^ | - L{n: elit } sit amet, consectetur | - a{n: eiusmod } sed do eiusmod tempor | - i{n: et }ore et dolore magna aliqua. | - U{n: enim }veniam, quis nostrud | - e{n: exercitation }mco laboris nisi ut aliquip ex | - {4:[No}{n: ex }{4: }| - L{n: ea } sit amet, consectetur | - a{n: esse } sed do eiusmod tempor | - i{n: eu }ore et dolore magna aliqua. | - U{s: est }veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - feed('s') - screen:expect([[ - Est es^ | - L{n: esse } sit amet, consectetur | - a{s: est } sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {4:[No Name] [+] }| - Lorem ipsum dolor sit amet, consectetur | - adipisicing elit, sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - meths.input_mouse('wheel', 'down', '', 0, 9, 40) - screen:expect([[ - Est es^ | - L{n: esse } sit amet, consectetur | - a{s: est } sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {4:[No Name] [+] }| - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - ea commodo consequat. Duis aute irure dolor in | - reprehenderit in voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - feed('<bs>') - screen:expect([[ - Est e^ | - L{n: elit } sit amet, consectetur | - a{n: eiusmod } sed do eiusmod tempor | - i{n: et }ore et dolore magna aliqua. | - U{n: enim }veniam, quis nostrud | - e{n: exercitation }mco laboris nisi ut aliquip ex | - {4:[No}{n: ex }{4: }| - U{n: ea }veniam, quis nostrud | - e{n: esse }mco laboris nisi ut aliquip ex | - e{n: eu }uat. Duis aute irure dolor in | - r{s: est }voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | - ]]) - - feed('<c-p>') - screen:expect([[ - Est eu^ | - L{n: elit } sit amet, consectetur | - a{n: eiusmod } sed do eiusmod tempor | - i{n: et }ore et dolore magna aliqua. | - U{n: enim }veniam, quis nostrud | - e{n: exercitation }mco laboris nisi ut aliquip ex | - {4:[No}{n: ex }{4: }| - U{n: ea }veniam, quis nostrud | - e{n: esse }mco laboris nisi ut aliquip ex | - e{s: eu }uat. Duis aute irure dolor in | - r{n: est }voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 22 of 65} | - ]]) - - meths.input_mouse('wheel', 'down', '', 0, 9, 40) - screen:expect([[ - Est eu^ | - L{n: elit } sit amet, consectetur | - a{n: eiusmod } sed do eiusmod tempor | - i{n: et }ore et dolore magna aliqua. | - U{n: enim }veniam, quis nostrud | - e{n: exercitation }mco laboris nisi ut aliquip ex | - {4:[No}{n: ex }{4: }| - r{n: ea }voluptate velit esse cillum | - d{n: esse }nulla pariatur. Excepteur sint | - o{s: eu }t non proident, sunt in culpa | - q{n: est }unt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 22 of 65} | - ]]) - - - funcs.complete(4, {'ea', 'eeeeeeeeeeeeeeeeee', 'ei', 'eo', 'eu', 'ey', 'eå', 'eä', 'eö'}) - screen:expect([[ - Est eu^ | - {s: ea }t amet, consectetur | - {n: eeeeeeeeeeeeeeeeee }d do eiusmod tempor | - {n: ei } et dolore magna aliqua. | - {n: eo }iam, quis nostrud | - {n: eu } laboris nisi ut aliquip ex | - {4:[N}{n: ey }{4: }| - {n: eå }uptate velit esse cillum | - {n: eä }la pariatur. Excepteur sint | - {n: eö }on proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- Keyword Local completion (^N^P) }{5:match 1 of 9} | - ]]) - - funcs.complete(4, {'ea', 'eee', 'ei', 'eo', 'eu', 'ey', 'eå', 'eä', 'eö'}) - screen:expect([[ - Est eu^ | - {s: ea }r sit amet, consectetur | - {n: eee }, sed do eiusmod tempor | - {n: ei }bore et dolore magna aliqua. | - {n: eo } veniam, quis nostrud | - {n: eu }amco laboris nisi ut aliquip ex | - {4:[N}{n: ey }{4: }| - {n: eå } voluptate velit esse cillum | - {n: eä } nulla pariatur. Excepteur sint | - {n: eö }at non proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]]) - - feed('<c-n>') - screen:expect([[ - Esteee^ | - {n: ea }r sit amet, consectetur | - {s: eee }, sed do eiusmod tempor | - {n: ei }bore et dolore magna aliqua. | - {n: eo } veniam, quis nostrud | - {n: eu }amco laboris nisi ut aliquip ex | - {4:[N}{n: ey }{4: }| - {n: eå } voluptate velit esse cillum | - {n: eä } nulla pariatur. Excepteur sint | - {n: eö }at non proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]]) - - funcs.complete(6, {'foo', 'bar'}) - screen:expect([[ - Esteee^ | - Lo{s: foo }sit amet, consectetur | - ad{n: bar }sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {4:[No Name] [+] }| - reprehenderit in voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - occaecat cupidatat non proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]]) - - feed('<c-y>') - screen:expect([[ - Esteefoo^ | - Lorem ipsum dolor sit amet, consectetur | - adipisicing elit, sed do eiusmod tempor | - incididunt ut labore et dolore magna aliqua. | - Ut enim ad minim veniam, quis nostrud | - exercitation ullamco laboris nisi ut aliquip ex | - {4:[No Name] [+] }| - reprehenderit in voluptate velit esse cillum | - dolore eu fugiat nulla pariatur. Excepteur sint | - occaecat cupidatat non proident, sunt in culpa | - qui officia deserunt mollit anim id est | - laborum. | - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]]) - end) - - it('can be moved due to wrap or resize', function() - feed('isome long prefix before the ') - command("set completeopt+=noinsert,noselect") - command("set linebreak") - funcs.complete(29, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - some long prefix before the ^ | - {1:~ }{n: word }| - {1:~ }{n: choice}| - {1:~ }{n: text }| - {1:~ }{n: thing }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<c-p>') - screen:expect([[ - some long prefix before the | - thing^ | - {n:word }{1: }| - {n:choice }{1: }| - {n:text }{1: }| - {s:thing }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<c-p>') - screen:expect([[ - some long prefix before the text| - {1:^~ }{n: word }| - {1:~ }{n: choice}| - {1:~ }{s: text }| - {1:~ }{n: thing }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - screen:try_resize(30,8) - screen:expect([[ - some long prefix before the | - text^ | - {n:word }{1: }| - {n:choice }{1: }| - {s:text }{1: }| - {n:thing }{1: }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - screen:try_resize(50,8) - screen:expect([[ - some long prefix before the text^ | - {1:~ }{n: word }{1: }| - {1:~ }{n: choice }{1: }| - {1:~ }{s: text }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - screen:try_resize(25,10) - screen:expect([[ - some long prefix before | - the text^ | - {1:~ }{n: word }{1: }| - {1:~ }{n: choice }{1: }| - {1:~ }{s: text }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - screen:try_resize(12,5) - screen:expect([[ - some long | - prefix | - bef{n: word } | - tex{n: }^ | - {2:-- INSERT -} | - ]]) - - -- can't draw the pum, but check we don't crash - screen:try_resize(12,2) - screen:expect([[ - text^ | - {2:-- INSERT -} | - ]]) - - -- but state is preserved, pum reappears - screen:try_resize(20,8) - screen:expect([[ - some long prefix | - before the text^ | - {1:~ }{n: word }{1: }| - {1:~ }{n: choice }{1: }| - {1:~ }{s: text }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) - - it('with VimResized autocmd', function() - feed('isome long prefix before the ') - command("set completeopt+=noinsert,noselect") - command("autocmd VimResized * redraw!") - command("set linebreak") - funcs.complete(29, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - some long prefix before the ^ | - {1:~ }{n: word }| - {1:~ }{n: choice}| - {1:~ }{n: text }| - {1:~ }{n: thing }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - screen:try_resize(16,10) - screen:expect([[ - some long | - prefix before | - the ^ | - {1:~ }{n: word }| - {1:~ }{n: choice }| - {1:~ }{n: text }| - {1:~ }{n: thing }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) - - it('with rightleft window', function() - command("set rl wildoptions+=pum") - feed('isome rightleft ') - screen:expect([[ - ^ tfelthgir emos| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {2:-- INSERT --} | - ]]) - - command("set completeopt+=noinsert,noselect") - funcs.complete(16, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - ^ tfelthgir emos| - {1: }{n: drow}{1: ~}| - {1: }{n: eciohc}{1: ~}| - {1: }{n: txet}{1: ~}| - {1: }{n: gniht}{1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {2:-- INSERT --} | - ]]) - - feed('<c-n>') - screen:expect([[ - ^ drow tfelthgir emos| - {1: }{s: drow}{1: ~}| - {1: }{n: eciohc}{1: ~}| - {1: }{n: txet}{1: ~}| - {1: }{n: gniht}{1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {2:-- INSERT --} | - ]]) - - feed('<c-y>') - screen:expect([[ - ^ drow tfelthgir emos| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {2:-- INSERT --} | - ]]) - - -- not rightleft on the cmdline - feed('<esc>:sign ') - screen:expect{grid=[[ - drow tfelthgir emos| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - :sign ^ | - ]]} - - feed('<tab>') - screen:expect{grid=[[ - drow tfelthgir emos| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: ~}| - {1: }{s: define }{1: ~}| - {1: }{n: jump }{1: ~}| - {1: }{n: list }{1: ~}| - {1: }{n: place }{1: ~}| - {1: }{n: undefine }{1: ~}| - {1: }{n: unplace }{1: ~}| - :sign define^ | - ]]} - end) - - it('with multiline messages', function() - screen:try_resize(40,8) - feed('ixx<cr>') - command('imap <f2> <cmd>echoerr "very"\\|echoerr "much"\\|echoerr "error"<cr>') - funcs.complete(1, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - xx | - word^ | - {s:word }{1: }| - {n:choice }{1: }| - {n:text }{1: }| - {n:thing }{1: }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<f2>') - screen:expect([[ - xx | - word | - {s:word }{1: }| - {4: }| - {6:very} | - {6:much} | - {6:error} | - {5:Press ENTER or type command to continue}^ | - ]]) - - feed('<cr>') - screen:expect([[ - xx | - word^ | - {s:word }{1: }| - {n:choice }{1: }| - {n:text }{1: }| - {n:thing }{1: }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<c-n>') - screen:expect([[ - xx | - choice^ | - {n:word }{1: }| - {s:choice }{1: }| - {n:text }{1: }| - {n:thing }{1: }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - command("split") - screen:expect([[ - xx | - choice^ | - {n:word }{1: }| - {s:choice }{4: }| - {n:text } | - {n:thing } | - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]]) - - meths.input_mouse('wheel', 'down', '', 0, 6, 15) - screen:expect{grid=[[ - xx | - choice^ | - {n:word }{1: }| - {s:choice }{4: }| - {n:text } | - {n:thing }{1: }| - {3:[No Name] [+] }| - {2:-- INSERT --} | - ]], unchanged=true} - end) - - it('with kind, menu and abbr attributes', function() - screen:try_resize(40,8) - feed('ixx ') - funcs.complete(4, {{word='wordey', kind= 'x', menu='extrainfo'}, 'thing', {word='secret', abbr='sneaky', menu='bar'}}) - screen:expect([[ - xx wordey^ | - {1:~ }{s: wordey x extrainfo }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }{n: sneaky bar }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<c-p>') - screen:expect([[ - xx ^ | - {1:~ }{n: wordey x extrainfo }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }{n: sneaky bar }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<c-p>') - screen:expect([[ - xx secret^ | - {1:~ }{n: wordey x extrainfo }{1: }| - {1:~ }{n: thing }{1: }| - {1:~ }{s: sneaky bar }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - - feed('<esc>') - screen:expect([[ - xx secre^t | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - | - ]]) - end) - - it('wildoptions=pum', function() - screen:try_resize(32,10) - command('set wildmenu') - command('set wildoptions=pum') - command('set shellslash') - command("cd test/functional/fixtures/wildpum") - - feed(':sign ') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign ^ | - ]]) - - feed('<Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign define^ | - ]]) - - feed('<Right><Right>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{s: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign list^ | - ]]) - - feed('<C-N>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{s: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign place^ | - ]]) - - feed('<C-P>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{s: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign list^ | - ]]) - - feed('<Left>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{s: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign jump^ | - ]]) - - -- pressing <C-E> should end completion and go back to the original match - feed('<C-E>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign ^ | - ]]) - - -- pressing <C-Y> should select the current match and end completion - feed('<Tab><C-P><C-P><C-Y>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign unplace^ | - ]]) - - -- showing popup menu in different columns in the cmdline - feed('<C-U>sign define <Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: culhl= }{1: }| - {1:~ }{n: icon= }{1: }| - {1:~ }{n: linehl= }{1: }| - {1:~ }{n: numhl= }{1: }| - {1:~ }{n: text= }{1: }| - {1:~ }{n: texthl= }{1: }| - :sign define culhl=^ | - ]]) - - feed('<Space><Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: culhl= }{1: }| - {1:~ }{n: icon= }{1: }| - {1:~ }{n: linehl= }{1: }| - {1:~ }{n: numhl= }{1: }| - {1:~ }{n: text= }{1: }| - {1:~ }{n: texthl= }{1: }| - :sign define culhl= culhl=^ | - ]]) - - feed('<C-U>e Xdi<Tab><Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: XdirA/ }{1: }| - {1:~ }{n: XfileA }{1: }| - :e Xdir/XdirA/^ | - ]]) - - -- Pressing <Down> on a directory name should go into that directory - feed('<Down>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: XdirB/ }{1: }| - {1:~ }{n: XfileB }{1: }| - :e Xdir/XdirA/XdirB/^ | - ]]) - - -- Pressing <Up> on a directory name should go to the parent directory - feed('<Up>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: XdirA/ }{1: }| - {1:~ }{n: XfileA }{1: }| - :e Xdir/XdirA/^ | - ]]) - - -- Pressing <C-A> when the popup menu is displayed should list all the - -- matches and remove the popup menu - feed(':<C-U>sign <Tab><C-A>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - :sign define jump list place und| - efine unplace^ | - ]]) - - -- Pressing <Left> after that should move the cursor - feed('<Left>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - :sign define jump list place und| - efine unplac^e | - ]]) - feed('<End>') - - -- Pressing <C-D> when the popup menu is displayed should remove the popup - -- menu - feed('<C-U>sign <Tab><C-D>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - :sign define | - define | - :sign define^ | - ]]) - - -- Pressing <S-Tab> should open the popup menu with the last entry selected - feed('<C-U><CR>:sign <S-Tab><C-P>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{s: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign undefine^ | - ]]) - - -- Pressing <Esc> should close the popup menu and cancel the cmd line - feed('<C-U><CR>:sign <Tab><Esc>') - screen:expect([[ - ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - | - ]]) - - -- Typing a character when the popup is open, should close the popup - feed(':sign <Tab>x') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign definex^ | - ]]) - - -- When the popup is open, entering the cmdline window should close the popup - feed('<C-U>sign <Tab><C-F>') - screen:expect([[ - | - {3:[No Name] }| - {1::}sign define | - {1::}sign define^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4:[Command Line] }| - :sign define | - ]]) - feed(':q<CR>') - - -- After the last popup menu item, <C-N> should show the original string - feed(':sign u<Tab><C-N><C-N>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign u^ | - ]]) - - -- Use the popup menu for the command name - feed('<C-U>bu<Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {s: bufdo }{1: }| - {n: buffer }{1: }| - {n: buffers }{1: }| - {n: bunload }{1: }| - :bufdo^ | - ]]) - - -- Pressing <BS> should remove the popup menu and erase the last character - feed('<C-E><C-U>sign <Tab><BS>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign defin^ | - ]]) - - -- Pressing <C-W> should remove the popup menu and erase the previous word - feed('<C-E><C-U>sign <Tab><C-W>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign ^ | - ]]) - - -- Pressing <C-U> should remove the popup menu and erase the entire line - feed('<C-E><C-U>sign <Tab><C-U>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :^ | - ]]) - - -- Using <C-E> to cancel the popup menu and then pressing <Up> should recall - -- the cmdline from history - feed('sign xyz<Esc>:sign <Tab><C-E><Up>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign xyz^ | - ]]) - - feed('<esc>') - - -- Check "list" still works - command('set wildmode=longest,list') - feed(':cn<Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - :cn | - cnewer cnoreabbrev | - cnext cnoremap | - cnfile cnoremenu | - :cn^ | - ]]) - feed('s') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - :cn | - cnewer cnoreabbrev | - cnext cnoremap | - cnfile cnoremenu | - :cns^ | - ]]) - - feed('<esc>') - command('set wildmode=full') - - -- Tests a directory name contained full-width characters. - feed(':e あいう/<Tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: 123 }{1: }| - {1:~ }{n: abc }{1: }| - {1:~ }{n: xyz }{1: }| - :e あいう/123^ | - ]]) - feed('<Esc>') - - -- Pressing <PageDown> should scroll the menu downward - feed(':sign <Tab><PageDown>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{s: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign undefine^ | - ]]) - feed('<PageDown>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{s: unplace }{1: }| - :sign unplace^ | - ]]) - feed('<PageDown>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign ^ | - ]]) - feed('<PageDown>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign define^ | - ]]) - feed('<C-U>sign <Tab><Right><Right><PageDown>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{s: unplace }{1: }| - :sign unplace^ | - ]]) - - -- Pressing <PageUp> should scroll the menu upward - feed('<C-U>sign <Tab><PageUp>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign ^ | - ]]) - feed('<PageUp>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{s: unplace }{1: }| - :sign unplace^ | - ]]) - feed('<PageUp>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{n: define }{1: }| - {1:~ }{s: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign jump^ | - ]]) - feed('<PageUp>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign define^ | - ]]) - - feed('<Esc>') - - -- check positioning with multibyte char in pattern - command("e långfile1") - command("sp långfile2") - feed(':b lå<tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {4:långfile2 }| - | - {1:~ }| - {1:~ }{s: långfile1 }{1: }| - {3:lå}{n: långfile2 }{3: }| - :b långfile1^ | - ]]) - - -- check doesn't crash on screen resize - screen:try_resize(20,6) - screen:expect([[ - | - {1:~ }| - {4:långfile2 }| - {s: långfile1 } | - {3:lå}{n: långfile2 }{3: }| - :b långfile1^ | - ]]) - - screen:try_resize(50,15) - screen:expect([[ - | - {1:~ }| - {4:långfile2 }| - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: långfile1 }{1: }| - {3:lå}{n: långfile2 }{3: }| - :b långfile1^ | - ]]) - - -- position is calculated correctly with "longest" - feed('<esc>') - command('set wildmode=longest:full,full') - feed(':b lå<tab>') - screen:expect([[ - | - {1:~ }| - {4:långfile2 }| - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{n: långfile1 }{1: }| - {3:lå}{n: långfile2 }{3: }| - :b långfile^ | - ]]) - - feed('<esc>') - command("close") - command('set wildmode=full') - - -- special case: when patterns ends with "/", show menu items aligned - -- after the "/" - feed(':e compdir/<tab>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: file1 }{1: }| - {1:~ }{n: file2 }{1: }| - :e compdir/file1^ | - ]]) - end) - - it('wildoptions=pum with scrolled messages', function() - screen:try_resize(40,10) - command('set wildmenu') - command('set wildoptions=pum') - - feed(':echoerr "fail"|echoerr "error"<cr>') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - {6:fail} | - {6:error} | - {5:Press ENTER or type command to continue}^ | - ]]} - - feed(':sign <tab>') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {4: }{n: place }{4: }| - {6:fail} {n: undefine } | - {6:error}{n: unplace } | - :sign define^ | - ]]} - - feed('d') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {4: }| - {6:fail} | - {6:error} | - :sign defined^ | - ]]} - end) - - it('wildoptions=pum and wildmode=longest,full #11622', function() - screen:try_resize(30,8) - command('set wildmenu') - command('set wildoptions=pum') - command('set wildmode=longest,full') - - -- With 'wildmode' set to 'longest,full', completing a match should display - -- the longest match, the wildmenu should not be displayed. - feed(':sign u<Tab>') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :sign un^ | - ]]} - eq(0, funcs.wildmenumode()) - - -- pressing <Tab> should display the wildmenu - feed('<Tab>') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{s: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign undefine^ | - ]]} - eq(1, funcs.wildmenumode()) - - -- pressing <Tab> second time should select the next entry in the menu - feed('<Tab>') - screen:expect{grid=[[ - | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }{n: undefine }{1: }| - {1:~ }{s: unplace }{1: }| - :sign unplace^ | - ]]} - end) - - it('wildoptions=pum with a wrapped line in buffer vim-patch:8.2.4655', function() - screen:try_resize(32, 10) - meths.buf_set_lines(0, 0, -1, true, { ('a'):rep(100) }) - command('set wildoptions+=pum') - feed('$') - feed(':sign <Tab>') - screen:expect([[ - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| - aaaa {s: define } | - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign define^ | - ]]) - end) - - -- oldtest: Test_wildmenu_pum_clear_entries() - it('wildoptions=pum when using Ctrl-E as wildchar vim-patch:9.0.1030', function() - screen:try_resize(30, 10) - exec([[ - set wildoptions=pum - set wildchar=<C-E> - ]]) - feed(':sign <C-E><C-E>') - screen:expect([[ - | - {1:~ }| - {1:~ }| - {1:~ }{s: define }{1: }| - {1:~ }{n: jump }{1: }| - {1:~ }{n: list }{1: }| - {1:~ }{n: place }{1: }| - {1:~ }{n: undefine }{1: }| - {1:~ }{n: unplace }{1: }| - :sign define^ | - ]]) - assert_alive() - end) - - it("'pumblend' RGB-color", function() - screen:try_resize(60,14) + it('RGB-color', function() + local screen = Screen.new(60, 14) screen:set_default_attr_ids({ [1] = {background = Screen.colors.Yellow}, [2] = {bold = true, reverse = true}, @@ -2934,6 +1076,7 @@ describe('builtin popupmenu', function() [44] = {foreground = tonumber('0x3f3f3f'), background = tonumber('0x7f5d7f')}, [45] = {background = Screen.colors.WebGray, blend=0}, }) + screen:attach() command('syntax on') command('set mouse=a') command('set pumblend=10') @@ -3082,10 +1225,8 @@ describe('builtin popupmenu', function() ]]) end) - it("'pumblend' 256-color (non-RGB)", function() - screen:detach() - screen = Screen.new(60, 8) - screen:attach({rgb=false, ext_popupmenu=false}) + it('256-color (non-RGB)', function() + local screen = Screen.new(60, 8) screen:set_default_attr_ids({ [1] = {foreground = Screen.colors.Grey0, background = tonumber('0x000007')}, [2] = {foreground = tonumber('0x000055'), background = tonumber('0x000007')}, @@ -3098,6 +1239,7 @@ describe('builtin popupmenu', function() [9] = {bold = true}, [10] = {foreground = tonumber('0x000002')}, }) + screen:attach({rgb=false}) command('set notermguicolors pumblend=10') insert([[ Lorem ipsum dolor sit amet, consectetur @@ -3118,651 +1260,3738 @@ describe('builtin popupmenu', function() {9:-- Keyword Local completion (^N^P) }{10:match 1 of 3} | ]]) end) +end) - it("'pumheight'", function() - screen:try_resize(32,8) - feed('isome long prefix before the ') - command("set completeopt+=noinsert,noselect") - command("set linebreak") - command("set pumheight=2") - funcs.complete(29, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - some long prefix before the ^ | - {1:~ }{n: word }{c: }| - {1:~ }{n: choice}{s: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) +describe('builtin popupmenu', function() + before_each(clear) + + local function with_ext_multigrid(multigrid) + local screen + before_each(function() + screen = Screen.new(32, 20) + screen:set_default_attr_ids({ + -- popup selected item / scrollbar track + ['s'] = {background = Screen.colors.WebGray}, + -- popup non-selected item + ['n'] = {background = Screen.colors.LightMagenta}, + -- popup scrollbar knob + ['c'] = {background = Screen.colors.Grey0}, + [1] = {bold = true, foreground = Screen.colors.Blue}, + [2] = {bold = true}, + [3] = {reverse = true}, + [4] = {bold = true, reverse = true}, + [5] = {bold = true, foreground = Screen.colors.SeaGreen}, + [6] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, + [7] = {background = Screen.colors.Yellow}, -- Search + [8] = {foreground = Screen.colors.Red}, + }) + screen:attach({ext_multigrid=multigrid}) + end) - it("'pumwidth'", function() - screen:try_resize(32,8) - feed('isome long prefix before the ') - command("set completeopt+=noinsert,noselect") - command("set linebreak") - command("set pumwidth=8") - funcs.complete(29, {'word', 'choice', 'text', 'thing'}) - screen:expect([[ - some long prefix before the ^ | - {1:~ }{n: word }| - {1:~ }{n: choice}| - {1:~ }{n: text }| - {1:~ }{n: thing }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) + it('with preview-window above', function() + feed(':ped<CR><c-w>4+') + feed('iaa bb cc dd ee ff gg hh ii jj<cr>') + feed('<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + {3:[No Name] [Preview][+] }| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + {4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aa bb cc dd ee ff gg hh ii jj | + aa^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 10} | + ## grid 4 + aa bb cc dd ee ff gg hh ii jj | + aa | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + {s:aa }{c: }| + {n:bb }{c: }| + {n:cc }{c: }| + {n:dd }{c: }| + {n:ee }{c: }| + {n:ff }{c: }| + {n:gg }{s: }| + {n:hh }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 2, 2, 0, false, 100}; + }} + else + screen:expect([[ + aa bb cc dd ee ff gg hh ii jj | + aa | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {3:[No Name] [Preview][+] }| + aa bb cc dd ee ff gg hh ii jj | + aa^ | + {s:aa }{c: }{1: }| + {n:bb }{c: }{1: }| + {n:cc }{c: }{1: }| + {n:dd }{c: }{1: }| + {n:ee }{c: }{1: }| + {n:ff }{c: }{1: }| + {n:gg }{s: }{1: }| + {n:hh }{s: }{4: }| + {2:-- }{5:match 1 of 10} | + ]]) + end + end) + + it('with preview-window below', function() + feed(':ped<CR><c-w>4+<c-w>r') + feed('iaa bb cc dd ee ff gg hh ii jj<cr>') + feed('<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + {4:[No Name] [+] }| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + {3:[No Name] [Preview][+] }| + [3:--------------------------------]| + ## grid 2 + aa bb cc dd ee ff gg hh ii jj | + aa^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 10} | + ## grid 4 + aa bb cc dd ee ff gg hh ii jj | + aa | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + {s:aa }{c: }| + {n:bb }{c: }| + {n:cc }{c: }| + {n:dd }{c: }| + {n:ee }{c: }| + {n:ff }{c: }| + {n:gg }{s: }| + {n:hh }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 2, 2, 0, false, 100}; + }} + else + screen:expect([[ + aa bb cc dd ee ff gg hh ii jj | + aa^ | + {s:aa }{c: }{1: }| + {n:bb }{c: }{1: }| + {n:cc }{c: }{1: }| + {n:dd }{c: }{1: }| + {n:ee }{c: }{1: }| + {n:ff }{c: }{1: }| + {n:gg }{s: }{1: }| + {n:hh }{s: }{4: }| + aa bb cc dd ee ff gg hh ii jj | + aa | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {3:[No Name] [Preview][+] }| + {2:-- }{5:match 1 of 10} | + ]]) + end + end) + + it('with preview-window above and tall and inverted', function() + feed(':ped<CR><c-w>8+') + feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') + feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') + feed('kk<cr>ll<cr>mm<cr>nn<cr>oo<cr>') + feed('<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + {3:[No Name] [Preview][+] }| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + {4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + dd | + ee | + ff | + gg | + hh | + ii | + jj | + kk | + ll | + mm | + nn | + oo | + aa^ | + ## grid 3 + {2:-- }{5:match 1 of 15} | + ## grid 4 + aa | + bb | + cc | + dd | + ## grid 5 + {s:aa }{c: }| + {n:bb }{c: }| + {n:cc }{c: }| + {n:dd }{c: }| + {n:ee }{c: }| + {n:ff }{c: }| + {n:gg }{c: }| + {n:hh }{c: }| + {n:ii }{c: }| + {n:jj }{c: }| + {n:kk }{c: }| + {n:ll }{s: }| + {n:mm }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "SW", 2, 12, 0, false, 100}; + }} + else + screen:expect([[ + aa | + bb | + cc | + dd | + {s:aa }{c: }{3:ew][+] }| + {n:bb }{c: } | + {n:cc }{c: } | + {n:dd }{c: } | + {n:ee }{c: } | + {n:ff }{c: } | + {n:gg }{c: } | + {n:hh }{c: } | + {n:ii }{c: } | + {n:jj }{c: } | + {n:kk }{c: } | + {n:ll }{s: } | + {n:mm }{s: } | + aa^ | + {4:[No Name] [+] }| + {2:-- }{5:match 1 of 15} | + ]]) + end + end) + + it('with preview-window above and short and inverted', function() + feed(':ped<CR><c-w>4+') + feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') + feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') + feed('<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + {3:[No Name] [Preview][+] }| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + {4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + cc | + dd | + ee | + ff | + gg | + hh | + ii | + jj | + aa^ | + ## grid 3 + {2:-- }{5:match 1 of 10} | + ## grid 4 + aa | + bb | + cc | + dd | + ee | + ff | + gg | + hh | + ## grid 5 + {s:aa }{c: }| + {n:bb }{c: }| + {n:cc }{c: }| + {n:dd }{c: }| + {n:ee }{c: }| + {n:ff }{c: }| + {n:gg }{c: }| + {n:hh }{c: }| + {n:ii }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "SW", 2, 8, 0, false, 100}; + }} + else + screen:expect([[ + aa | + bb | + cc | + dd | + ee | + ff | + gg | + hh | + {s:aa }{c: }{3:ew][+] }| + {n:bb }{c: } | + {n:cc }{c: } | + {n:dd }{c: } | + {n:ee }{c: } | + {n:ff }{c: } | + {n:gg }{c: } | + {n:hh }{c: } | + {n:ii }{s: } | + aa^ | + {4:[No Name] [+] }| + {2:-- }{5:match 1 of 10} | + ]]) + end + end) - it('does not crash when displayed in the last column with rightleft (#12032)', function() - local col = 30 - local items = {'word', 'choice', 'text', 'thing'} - local max_len = 0 - for _, v in ipairs(items) do - max_len = max_len < #v and #v or max_len + it('with preview-window below and inverted', function() + feed(':ped<CR><c-w>4+<c-w>r') + feed('iaa<cr>bb<cr>cc<cr>dd<cr>ee<cr>') + feed('ff<cr>gg<cr>hh<cr>ii<cr>jj<cr>') + feed('<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + {4:[No Name] [+] }| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + [4:--------------------------------]| + {3:[No Name] [Preview][+] }| + [3:--------------------------------]| + ## grid 2 + cc | + dd | + ee | + ff | + gg | + hh | + ii | + jj | + aa^ | + ## grid 3 + {2:-- }{5:match 1 of 10} | + ## grid 4 + aa | + bb | + cc | + dd | + ee | + ff | + gg | + hh | + ## grid 5 + {s:aa }{c: }| + {n:bb }{c: }| + {n:cc }{c: }| + {n:dd }{c: }| + {n:ee }{c: }| + {n:ff }{c: }| + {n:gg }{s: }| + {n:hh }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "SW", 2, 8, 0, false, 100}; + }} + else + screen:expect([[ + {s:aa }{c: } | + {n:bb }{c: } | + {n:cc }{c: } | + {n:dd }{c: } | + {n:ee }{c: } | + {n:ff }{c: } | + {n:gg }{s: } | + {n:hh }{s: } | + aa^ | + {4:[No Name] [+] }| + aa | + bb | + cc | + dd | + ee | + ff | + gg | + hh | + {3:[No Name] [Preview][+] }| + {2:-- }{5:match 1 of 10} | + ]]) + end + end) + + if not multigrid then + -- oldtest: Test_pum_with_preview_win() + it('preview window opened during completion', function() + exec([[ + funct Omni_test(findstart, base) + if a:findstart + return col(".") - 1 + endif + return [#{word: "one", info: "1info"}, #{word: "two", info: "2info"}, #{word: "three", info: "3info"}] + endfunc + set omnifunc=Omni_test + set completeopt+=longest + ]]) + feed('Gi<C-X><C-O>') + screen:expect([[ + ^ | + {n:one }{1: }| + {n:two }{1: }| + {n:three }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- }{8:Back at original} | + ]]) + feed('<C-N>') + screen:expect([[ + 1info | + | + {1:~ }| + {3:[Scratch] [Preview] }| + one^ | + {s:one }{1: }| + {n:two }{1: }| + {n:three }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4:[No Name] [+] }| + {2:-- }{5:match 1 of 3} | + ]]) + end) + + -- oldtest: Test_scrollbar_on_wide_char() + it('scrollbar overwrites half of double-width char below properly', function() + screen:try_resize(32, 10) + exec([[ + call setline(1, ['a', ' 啊啊啊', + \ ' 哦哦哦', + \ ' 呃呃呃']) + call setline(5, range(10)->map({i, v -> 'aa' .. v .. 'bb'})) + ]]) + feed('A<C-X><C-N>') + screen:expect([[ + aa0bb^ | + {s:aa0bb }{c: }啊 | + {n:aa1bb }{c: } 哦 | + {n:aa2bb }{c: }呃呃 | + {n:aa3bb }{c: } | + {n:aa4bb }{c: } | + {n:aa5bb }{c: } | + {n:aa6bb }{s: } | + {n:aa7bb }{s: } | + {2:-- }{5:match 1 of 10} | + ]]) + end) end - screen:try_resize(col, 8) - command('set rightleft') - command('call setline(1, repeat(" ", &columns - '..max_len..'))') - feed('$i') - funcs.complete(col - max_len, items) - feed('<c-y>') - assert_alive() - end) - it('truncates double-width character correctly when there is no scrollbar', function() - screen:try_resize(32,8) - command('set completeopt+=menuone,noselect') - feed('i' .. string.rep(' ', 13)) - funcs.complete(14, {'哦哦哦哦哦哦哦哦哦哦'}) - screen:expect([[ - ^ | - {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) + it('with vsplits', function() + screen:try_resize(32, 8) + insert('aaa aab aac\n') + feed(':vsplit<cr>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + {4:[No Name] [+] }{3:<Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aaa aab aac| + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :vsplit | + ## grid 4 + aaa aab aac | + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ]]} + else + screen:expect([[ + aaa aab aac │aaa aab aac| + ^ │ | + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {1:~ }│{1:~ }| + {4:[No Name] [+] }{3:<Name] [+] }| + :vsplit | + ]]) + end + + feed('ibbb a<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + [4:--------------------]│[2:-----------]| + {4:[No Name] [+] }{3:<Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aaa aab aac| + bbb aaa | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 3} | + ## grid 4 + aaa aab aac | + bbb aaa^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + {s: aaa }| + {n: aab }| + {n: aac }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 4, 2, 3, false, 100}; + }} + else + screen:expect([[ + aaa aab aac │aaa aab aac| + bbb aaa^ │bbb aaa | + {1:~ }{s: aaa }{1: }│{1:~ }| + {1:~ }{n: aab }{1: }│{1:~ }| + {1:~ }{n: aac }{1: }│{1:~ }| + {1:~ }│{1:~ }| + {4:[No Name] [+] }{3:<Name] [+] }| + {2:-- }{5:match 1 of 3} | + ]]) + end + + feed('<esc><c-w><c-w>oc a<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + {3:<Name] [+] }{4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aaa aab aac | + bbb aaa | + c aaa^ | + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 3} | + ## grid 4 + aaa aab aac| + bbb aaa | + c aaa | + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 5 + {s: aaa }| + {n: aab }| + {n: aac }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 2, 3, 1, false, 100}; + }} + else + screen:expect([[ + aaa aab aac│aaa aab aac | + bbb aaa │bbb aaa | + c aaa │c aaa^ | + {1:~ }│{1:~}{s: aaa }{1: }| + {1:~ }│{1:~}{n: aab }{1: }| + {1:~ }│{1:~}{n: aac }{1: }| + {3:<Name] [+] }{4:[No Name] [+] }| + {2:-- }{5:match 1 of 3} | + ]]) + end + + feed('bcdef ccc a<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + {3:<Name] [+] }{4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aaa aab aac | + bbb aaa | + c aaabcdef ccc aaa^ | + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 4} | + ## grid 4 + aaa aab aac| + bbb aaa | + c aaabcdef | + ccc aaa | + {1:~ }| + {1:~ }| + ## grid 5 + {s: aaa }| + {n: aab }| + {n: aac }| + {n: aaabcdef}| + ]], float_pos={ + [5] = {{id = -1}, "NW", 2, 3, 11, false, 100}; + }} + else + screen:expect([[ + aaa aab aac│aaa aab aac | + bbb aaa │bbb aaa | + c aaabcdef │c aaabcdef ccc aaa^ | + ccc aaa │{1:~ }{s: aaa }| + {1:~ }│{1:~ }{n: aab }| + {1:~ }│{1:~ }{n: aac }| + {3:<Name] [+] }{4:[No Name] [}{n: aaabcdef}| + {2:-- }{5:match 1 of 4} | + ]]) + end + + feed('\n<c-x><c-n>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + [4:-----------]│[2:--------------------]| + {3:<Name] [+] }{4:[No Name] [+] }| + [3:--------------------------------]| + ## grid 2 + aaa aab aac | + bbb aaa | + c aaabcdef ccc aaa | + aaa^ | + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- }{5:match 1 of 6} | + ## grid 4 + aaa aab aac| + bbb aaa | + c aaabcdef | + ccc aaa | + aaa | + {1:~ }| + ## grid 5 + {s: aaa }{c: }| + {n: aab }{s: }| + {n: aac }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 2, 4, -1, false, 100}; + }} + else + screen:expect([[ + aaa aab aac│aaa aab aac | + bbb aaa │bbb aaa | + c aaabcdef │c aaabcdef ccc aaa | + ccc aaa │aaa^ | + aaa {s: aaa }{c: }{1: }| + {1:~ }{n: aab }{s: }{1: }| + {3:<Name] [+] }{n: aac }{s: }{4: }| + {2:-- }{5:match 1 of 6} | + ]]) + end + end) - it('truncates double-width character correctly when there is scrollbar', function() - screen:try_resize(32,8) - command('set completeopt+=noselect') - command('set pumheight=4') - feed('i' .. string.rep(' ', 12)) - local items = {} - for _ = 1, 8 do - table.insert(items, {word = '哦哦哦哦哦哦哦哦哦哦', equal = 1, dup = 1}) + if not multigrid then + it('with split and scroll', function() + screen:try_resize(60,14) + command("split") + command("set completeopt+=noinsert") + command("set mouse=a") + insert([[ + Lorem ipsum dolor sit amet, consectetur + adipisicing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud + exercitation ullamco laboris nisi ut aliquip ex + ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum + dolore eu fugiat nulla pariatur. Excepteur sint + occaecat cupidatat non proident, sunt in culpa + qui officia deserunt mollit anim id est + laborum. + ]]) + + screen:expect([[ + reprehenderit in voluptate velit esse cillum | + dolore eu fugiat nulla pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + laborum. | + ^ | + {4:[No Name] [+] }| + Lorem ipsum dolor sit amet, consectetur | + adipisicing elit, sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + {3:[No Name] [+] }| + | + ]]) + + feed('ggOEst <c-x><c-p>') + screen:expect([[ + Est ^ | + L{n: sunt }{s: }sit amet, consectetur | + a{n: in }{s: }sed do eiusmod tempor | + i{n: culpa }{s: }re et dolore magna aliqua. | + U{n: qui }{s: }eniam, quis nostrud | + e{n: officia }{s: }co laboris nisi ut aliquip ex | + {4:[No}{n: deserunt }{s: }{4: }| + Est{n: mollit }{s: } | + L{n: anim }{s: }sit amet, consectetur | + a{n: id }{s: }sed do eiusmod tempor | + i{n: est }{s: }re et dolore magna aliqua. | + U{n: laborum }{c: }eniam, quis nostrud | + {3:[No}{s: Est }{c: }{3: }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + meths.input_mouse('wheel', 'down', '', 0, 9, 40) + screen:expect([[ + Est ^ | + L{n: sunt }{s: }sit amet, consectetur | + a{n: in }{s: }sed do eiusmod tempor | + i{n: culpa }{s: }re et dolore magna aliqua. | + U{n: qui }{s: }eniam, quis nostrud | + e{n: officia }{s: }co laboris nisi ut aliquip ex | + {4:[No}{n: deserunt }{s: }{4: }| + i{n: mollit }{s: }re et dolore magna aliqua. | + U{n: anim }{s: }eniam, quis nostrud | + e{n: id }{s: }co laboris nisi ut aliquip ex | + e{n: est }{s: }at. Duis aute irure dolor in | + r{n: laborum }{c: }oluptate velit esse cillum | + {3:[No}{s: Est }{c: }{3: }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + feed('e') + screen:expect([[ + Est e^ | + L{n: elit } sit amet, consectetur | + a{n: eiusmod } sed do eiusmod tempor | + i{n: et }ore et dolore magna aliqua. | + U{n: enim }veniam, quis nostrud | + e{n: exercitation }mco laboris nisi ut aliquip ex | + {4:[No}{n: ex }{4: }| + i{n: ea }ore et dolore magna aliqua. | + U{n: esse }veniam, quis nostrud | + e{n: eu }mco laboris nisi ut aliquip ex | + e{s: est }uat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + meths.input_mouse('wheel', 'up', '', 0, 9, 40) + screen:expect([[ + Est e^ | + L{n: elit } sit amet, consectetur | + a{n: eiusmod } sed do eiusmod tempor | + i{n: et }ore et dolore magna aliqua. | + U{n: enim }veniam, quis nostrud | + e{n: exercitation }mco laboris nisi ut aliquip ex | + {4:[No}{n: ex }{4: }| + Est{n: ea } | + L{n: esse } sit amet, consectetur | + a{n: eu } sed do eiusmod tempor | + i{s: est }ore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + feed('s') + screen:expect([[ + Est es^ | + L{n: esse } sit amet, consectetur | + a{s: est } sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + {4:[No Name] [+] }| + Est es | + Lorem ipsum dolor sit amet, consectetur | + adipisicing elit, sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + meths.input_mouse('wheel', 'down', '', 0, 9, 40) + screen:expect([[ + Est es^ | + L{n: esse } sit amet, consectetur | + a{s: est } sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + {4:[No Name] [+] }| + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + ea commodo consequat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + feed('<bs>') + screen:expect([[ + Est e^ | + L{n: elit } sit amet, consectetur | + a{n: eiusmod } sed do eiusmod tempor | + i{n: et }ore et dolore magna aliqua. | + U{n: enim }veniam, quis nostrud | + e{n: exercitation }mco laboris nisi ut aliquip ex | + {4:[No}{n: ex }{4: }| + i{n: ea }ore et dolore magna aliqua. | + U{n: esse }veniam, quis nostrud | + e{n: eu }mco laboris nisi ut aliquip ex | + e{s: est }uat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 65} | + ]]) + + feed('<c-p>') + screen:expect([[ + Est eu^ | + L{n: elit } sit amet, consectetur | + a{n: eiusmod } sed do eiusmod tempor | + i{n: et }ore et dolore magna aliqua. | + U{n: enim }veniam, quis nostrud | + e{n: exercitation }mco laboris nisi ut aliquip ex | + {4:[No}{n: ex }{4: }| + i{n: ea }ore et dolore magna aliqua. | + U{n: esse }veniam, quis nostrud | + e{s: eu }mco laboris nisi ut aliquip ex | + e{n: est }uat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 22 of 65} | + ]]) + + meths.input_mouse('wheel', 'down', '', 0, 9, 40) + screen:expect([[ + Est eu^ | + L{n: elit } sit amet, consectetur | + a{n: eiusmod } sed do eiusmod tempor | + i{n: et }ore et dolore magna aliqua. | + U{n: enim }veniam, quis nostrud | + e{n: exercitation }mco laboris nisi ut aliquip ex | + {4:[No}{n: ex }{4: }| + e{n: ea }uat. Duis aute irure dolor in | + r{n: esse }voluptate velit esse cillum | + d{s: eu }nulla pariatur. Excepteur sint | + o{n: est }t non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 22 of 65} | + ]]) + + funcs.complete(4, {'ea', 'eeeeeeeeeeeeeeeeee', 'ei', 'eo', 'eu', 'ey', 'eå', 'eä', 'eö'}) + screen:expect([[ + Est eu^ | + {s: ea }t amet, consectetur | + {n: eeeeeeeeeeeeeeeeee }d do eiusmod tempor | + {n: ei } et dolore magna aliqua. | + {n: eo }iam, quis nostrud | + {n: eu } laboris nisi ut aliquip ex | + {4:[N}{n: ey }{4: }| + {n: eå }. Duis aute irure dolor in | + {n: eä }uptate velit esse cillum | + {n: eö }la pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- Keyword Local completion (^N^P) }{5:match 1 of 9} | + ]]) + + funcs.complete(4, {'ea', 'eee', 'ei', 'eo', 'eu', 'ey', 'eå', 'eä', 'eö'}) + screen:expect([[ + Est eu^ | + {s: ea }r sit amet, consectetur | + {n: eee }, sed do eiusmod tempor | + {n: ei }bore et dolore magna aliqua. | + {n: eo } veniam, quis nostrud | + {n: eu }amco laboris nisi ut aliquip ex | + {4:[N}{n: ey }{4: }| + {n: eå }quat. Duis aute irure dolor in | + {n: eä } voluptate velit esse cillum | + {n: eö } nulla pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + + feed('<c-n>') + screen:expect([[ + Esteee^ | + {n: ea }r sit amet, consectetur | + {s: eee }, sed do eiusmod tempor | + {n: ei }bore et dolore magna aliqua. | + {n: eo } veniam, quis nostrud | + {n: eu }amco laboris nisi ut aliquip ex | + {4:[N}{n: ey }{4: }| + {n: eå }quat. Duis aute irure dolor in | + {n: eä } voluptate velit esse cillum | + {n: eö } nulla pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + + funcs.complete(6, {'foo', 'bar'}) + screen:expect([[ + Esteee^ | + Lo{s: foo }sit amet, consectetur | + ad{n: bar }sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + {4:[No Name] [+] }| + ea commodo consequat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + dolore eu fugiat nulla pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + + feed('<c-y>') + screen:expect([[ + Esteefoo^ | + Lorem ipsum dolor sit amet, consectetur | + adipisicing elit, sed do eiusmod tempor | + incididunt ut labore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + exercitation ullamco laboris nisi ut aliquip ex | + {4:[No Name] [+] }| + ea commodo consequat. Duis aute irure dolor in | + reprehenderit in voluptate velit esse cillum | + dolore eu fugiat nulla pariatur. Excepteur sint | + occaecat cupidatat non proident, sunt in culpa | + qui officia deserunt mollit anim id est | + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + end) + + it('can be moved due to wrap or resize', function() + feed('isome long prefix before the ') + command("set completeopt+=noinsert,noselect") + command("set linebreak") + funcs.complete(29, {'word', 'choice', 'text', 'thing'}) + screen:expect([[ + some long prefix before the ^ | + {1:~ }{n: word }| + {1:~ }{n: choice}| + {1:~ }{n: text }| + {1:~ }{n: thing }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<c-p>') + screen:expect([[ + some long prefix before the | + thing^ | + {n:word }{1: }| + {n:choice }{1: }| + {n:text }{1: }| + {s:thing }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<c-p>') + screen:expect([[ + some long prefix before the text| + {1:^~ }{n: word }| + {1:~ }{n: choice}| + {1:~ }{s: text }| + {1:~ }{n: thing }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + screen:try_resize(30,8) + screen:expect([[ + some long prefix before the | + text^ | + {n:word }{1: }| + {n:choice }{1: }| + {s:text }{1: }| + {n:thing }{1: }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + screen:try_resize(50,8) + screen:expect([[ + some long prefix before the text^ | + {1:~ }{n: word }{1: }| + {1:~ }{n: choice }{1: }| + {1:~ }{s: text }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + screen:try_resize(25,10) + screen:expect([[ + some long prefix before | + the text^ | + {1:~ }{n: word }{1: }| + {1:~ }{n: choice }{1: }| + {1:~ }{s: text }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + screen:try_resize(12,5) + screen:expect([[ + some long | + prefix | + bef{n: word } | + tex{n: }^ | + {2:-- INSERT --}| + ]]) + + -- can't draw the pum, but check we don't crash + screen:try_resize(12,2) + screen:expect([[ + {1:<<<}t^ | + {2:-- INSERT --}| + ]]) + + -- but state is preserved, pum reappears + screen:try_resize(20,8) + screen:expect([[ + some long prefix | + before the text^ | + {1:~ }{n: word }{1: }| + {1:~ }{n: choice }{1: }| + {1:~ }{s: text }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end) + + it('with VimResized autocmd', function() + feed('isome long prefix before the ') + command("set completeopt+=noinsert,noselect") + command("autocmd VimResized * redraw!") + command("set linebreak") + funcs.complete(29, {'word', 'choice', 'text', 'thing'}) + screen:expect([[ + some long prefix before the ^ | + {1:~ }{n: word }| + {1:~ }{n: choice}| + {1:~ }{n: text }| + {1:~ }{n: thing }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + screen:try_resize(16,10) + screen:expect([[ + some long | + prefix before | + the ^ | + {1:~ }{n: word }| + {1:~ }{n: choice }| + {1:~ }{n: text }| + {1:~ }{n: thing }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end) + + it('with rightleft window', function() + command("set rl wildoptions+=pum") + feed('isome rightleft ') + screen:expect([[ + ^ tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {2:-- INSERT --} | + ]]) + + command("set completeopt+=noinsert,noselect") + funcs.complete(16, {'word', 'choice', 'text', 'thing'}) + screen:expect([[ + ^ tfelthgir emos| + {1: }{n: drow }{1: ~}| + {1: }{n: eciohc }{1: ~}| + {1: }{n: txet }{1: ~}| + {1: }{n: gniht }{1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {2:-- INSERT --} | + ]]) + + feed('<c-n>') + screen:expect([[ + ^ drow tfelthgir emos| + {1: }{s: drow }{1: ~}| + {1: }{n: eciohc }{1: ~}| + {1: }{n: txet }{1: ~}| + {1: }{n: gniht }{1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {2:-- INSERT --} | + ]]) + + feed('<c-y>') + screen:expect([[ + ^ drow tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {2:-- INSERT --} | + ]]) + + -- not rightleft on the cmdline + feed('<esc>:sign ') + screen:expect{grid=[[ + drow tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + :sign ^ | + ]]} + + feed('<tab>') + screen:expect{grid=[[ + drow tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: ~}| + {1: }{s: define }{1: ~}| + {1: }{n: jump }{1: ~}| + {1: }{n: list }{1: ~}| + {1: }{n: place }{1: ~}| + {1: }{n: undefine }{1: ~}| + {1: }{n: unplace }{1: ~}| + :sign define^ | + ]]} + end) end - funcs.complete(13, items) - screen:expect([[ - ^ | - {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{c: }| - {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{c: }| - {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{s: }| - {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{s: }| - {1:~ }| - {1:~ }| - {2:-- INSERT --} | - ]]) - end) - it('supports mousemodel=popup', function() - screen:try_resize(32, 6) - exec([[ - call setline(1, 'popup menu test') - set mouse=a mousemodel=popup + it('with rightleft vsplits', function() + screen:try_resize(40, 6) + command('set rightleft') + command('rightbelow vsplit') + command('set completeopt+=noinsert,noselect') + command('set pumheight=2') + feed('isome rightleft ') + funcs.complete(16, {'word', 'choice', 'text', 'thing'}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + {3:[No Name] [+] }{4:[No Name] [+] }| + [3:----------------------------------------]| + ## grid 2 + tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + ^ tfelthgir emos| + {1: ~}| + {1: ~}| + {1: ~}| + ## grid 5 + {c: }{n: drow }| + {s: }{n: eciohc }| + ]], float_pos={ + [5] = {{id = -1}, "NW", 4, 1, -11, false, 100}; + }} + else + screen:expect([[ + tfelthgir emos│ ^ tfelthgir emos| + {1: }{c: }{n: drow }{1: ~}| + {1: }{s: }{n: eciohc }{1: ~}| + {1: ~}│{1: ~}| + {3:[No Name] [+] }{4:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + end + feed('<C-E><CR>') + funcs.complete(1, {'word', 'choice', 'text', 'thing'}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + {3:[No Name] [+] }{4:[No Name] [+] }| + [3:----------------------------------------]| + ## grid 2 + tfelthgir emos| + | + {1: ~}| + {1: ~}| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + tfelthgir emos| + ^ | + {1: ~}| + {1: ~}| + ## grid 5 + {c: }{n: drow}| + {s: }{n: eciohc}| + ]], float_pos={ + [5] = {{id = -1}, "NW", 4, 2, 4, false, 100}; + }} + else + screen:expect([[ + tfelthgir emos│ tfelthgir emos| + │ ^ | + {1: ~}│{1: }{c: }{n: drow}| + {1: ~}│{1: }{s: }{n: eciohc}| + {3:[No Name] [+] }{4:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + end + feed('<C-E>') + async_meths.call_function('input', {'', '', 'sign'}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + {3:[No Name] [+] }{4:[No Name] [+] }| + [3:----------------------------------------]| + ## grid 2 + tfelthgir emos| + | + {1: ~}| + {1: ~}| + ## grid 3 + ^ | + ## grid 4 + tfelthgir emos| + | + {1: ~}| + {1: ~}| + ]]} + else + screen:expect([[ + tfelthgir emos│ tfelthgir emos| + │ | + {1: ~}│{1: ~}| + {1: ~}│{1: ~}| + {3:[No Name] [+] }{4:[No Name] [+] }| + ^ | + ]]) + end + command('set wildoptions+=pum') + feed('<Tab>') + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + [2:-------------------]│[4:--------------------]| + {3:[No Name] [+] }{4:[No Name] [+] }| + [3:----------------------------------------]| + ## grid 2 + tfelthgir emos| + | + {1: ~}| + {1: ~}| + ## grid 3 + define^ | + ## grid 4 + tfelthgir emos| + | + {1: ~}| + {1: ~}| + ## grid 5 + {s:define }{c: }| + {n:jump }{s: }| + ]], float_pos={ + [5] = {{id = -1}, "SW", 1, 5, 0, false, 250}; + }} + else + screen:expect([[ + tfelthgir emos│ tfelthgir emos| + │ | + {1: ~}│{1: ~}| + {s:define }{c: }{1: ~}│{1: ~}| + {n:jump }{s: }{3: }{4:[No Name] [+] }| + define^ | + ]]) + end + end) - aunmenu PopUp - menu PopUp.foo :let g:menustr = 'foo'<CR> - menu PopUp.bar :let g:menustr = 'bar'<CR> - menu PopUp.baz :let g:menustr = 'baz'<CR> - ]]) - feed('<RightMouse><4,0>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{n: baz }{1: }| - {1:~ }| - | - ]]) - feed('<Down>') - screen:expect([[ - ^popup menu test | - {1:~ }{s: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{n: baz }{1: }| - {1:~ }| - | - ]]) - feed('<Down>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{s: bar }{1: }| - {1:~ }{n: baz }{1: }| - {1:~ }| - | - ]]) - feed('<CR>') - screen:expect([[ - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :let g:menustr = 'bar' | - ]]) - eq('bar', meths.get_var('menustr')) - feed('<RightMouse><20,1>') - screen:expect([[ - ^popup menu test | - {1:~ }| - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{n: baz }{1: }| - :let g:menustr = 'bar' | - ]]) - feed('<LeftMouse><22,4>') - screen:expect([[ - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :let g:menustr = 'baz' | - ]]) - eq('baz', meths.get_var('menustr')) - feed('<RightMouse><4,0>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{n: baz }{1: }| - {1:~ }| - :let g:menustr = 'baz' | - ]]) - feed('<RightDrag><6,3>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{s: baz }{1: }| - {1:~ }| - :let g:menustr = 'baz' | - ]]) - feed('<RightRelease><6,1>') - screen:expect([[ - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :let g:menustr = 'foo' | - ]]) - eq('foo', meths.get_var('menustr')) - eq(false, screen.options.mousemoveevent) - feed('<RightMouse><4,0>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{n: baz }{1: }| - {1:~ }| - :let g:menustr = 'foo' | - ]]) - eq(true, screen.options.mousemoveevent) - feed('<MouseMove><6,3>') - screen:expect([[ - ^popup menu test | - {1:~ }{n: foo }{1: }| - {1:~ }{n: bar }{1: }| - {1:~ }{s: baz }{1: }| - {1:~ }| - :let g:menustr = 'foo' | - ]]) - eq(true, screen.options.mousemoveevent) - feed('<LeftMouse><6,2>') - screen:expect([[ - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :let g:menustr = 'bar' | - ]]) - eq(false, screen.options.mousemoveevent) - eq('bar', meths.get_var('menustr')) - end) + if not multigrid then + it('with multiline messages', function() + screen:try_resize(40,8) + feed('ixx<cr>') + command('imap <f2> <cmd>echoerr "very"\\|echoerr "much"\\|echoerr "error"<cr>') + funcs.complete(1, {'word', 'choice', 'text', 'thing'}) + screen:expect([[ + xx | + word^ | + {s:word }{1: }| + {n:choice }{1: }| + {n:text }{1: }| + {n:thing }{1: }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<f2>') + screen:expect([[ + xx | + word | + {s:word }{1: }| + {4: }| + {6:very} | + {6:much} | + {6:error} | + {5:Press ENTER or type command to continue}^ | + ]]) + + feed('<cr>') + screen:expect([[ + xx | + word^ | + {s:word }{1: }| + {n:choice }{1: }| + {n:text }{1: }| + {n:thing }{1: }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<c-n>') + screen:expect([[ + xx | + choice^ | + {n:word }{1: }| + {s:choice }{1: }| + {n:text }{1: }| + {n:thing }{1: }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + command("split") + screen:expect([[ + xx | + choice^ | + {n:word }{1: }| + {s:choice }{4: }| + {n:text } | + {n:thing } | + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]]) + + meths.input_mouse('wheel', 'down', '', 0, 6, 15) + screen:expect{grid=[[ + xx | + choice^ | + {n:word }{1: }| + {s:choice }{4: }| + {n:text } | + {n:thing }{1: }| + {3:[No Name] [+] }| + {2:-- INSERT --} | + ]], unchanged=true} + end) + + it('with kind, menu and abbr attributes', function() + screen:try_resize(40,8) + feed('ixx ') + funcs.complete(4, {{word='wordey', kind= 'x', menu='extrainfo'}, 'thing', {word='secret', abbr='sneaky', menu='bar'}}) + screen:expect([[ + xx wordey^ | + {1:~ }{s: wordey x extrainfo }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }{n: sneaky bar }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<c-p>') + screen:expect([[ + xx ^ | + {1:~ }{n: wordey x extrainfo }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }{n: sneaky bar }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<c-p>') + screen:expect([[ + xx secret^ | + {1:~ }{n: wordey x extrainfo }{1: }| + {1:~ }{n: thing }{1: }| + {1:~ }{s: sneaky bar }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + + feed('<esc>') + screen:expect([[ + xx secre^t | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + end) + + it('wildoptions=pum', function() + screen:try_resize(32,10) + command('set wildmenu') + command('set wildoptions=pum') + command('set shellslash') + command("cd test/functional/fixtures/wildpum") + + feed(':sign ') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign ^ | + ]]) + + feed('<Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + + feed('<Right><Right>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{s: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign list^ | + ]]) + + feed('<C-N>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{s: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign place^ | + ]]) + + feed('<C-P>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{s: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign list^ | + ]]) + + feed('<Left>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{s: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign jump^ | + ]]) + + -- pressing <C-E> should end completion and go back to the original match + feed('<C-E>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign ^ | + ]]) + + -- pressing <C-Y> should select the current match and end completion + feed('<Tab><C-P><C-P><C-Y>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign unplace^ | + ]]) + + -- showing popup menu in different columns in the cmdline + feed('<C-U>sign define <Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: culhl= }{1: }| + {1:~ }{n: icon= }{1: }| + {1:~ }{n: linehl= }{1: }| + {1:~ }{n: numhl= }{1: }| + {1:~ }{n: text= }{1: }| + {1:~ }{n: texthl= }{1: }| + :sign define culhl=^ | + ]]) + + feed('<Space><Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: culhl= }{1: }| + {1:~ }{n: icon= }{1: }| + {1:~ }{n: linehl= }{1: }| + {1:~ }{n: numhl= }{1: }| + {1:~ }{n: text= }{1: }| + {1:~ }{n: texthl= }{1: }| + :sign define culhl= culhl=^ | + ]]) + + feed('<C-U>e Xnamedi<Tab><Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: XdirA/ }{1: }| + {1:~ }{n: XfileA }{1: }| + :e Xnamedir/XdirA/^ | + ]]) + + -- Pressing <Down> on a directory name should go into that directory + feed('<Down>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: XdirB/ }{1: }| + {1:~ }{n: XfileB }{1: }| + :e Xnamedir/XdirA/XdirB/^ | + ]]) + + -- Pressing <Up> on a directory name should go to the parent directory + feed('<Up>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: XdirA/ }{1: }| + {1:~ }{n: XfileA }{1: }| + :e Xnamedir/XdirA/^ | + ]]) + + -- Pressing <C-A> when the popup menu is displayed should list all the + -- matches and remove the popup menu + feed(':<C-U>sign <Tab><C-A>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + :sign define jump list place und| + efine unplace^ | + ]]) + + -- Pressing <Left> after that should move the cursor + feed('<Left>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + :sign define jump list place und| + efine unplac^e | + ]]) + feed('<End>') + + -- Pressing <C-D> when the popup menu is displayed should remove the popup + -- menu + feed('<C-U>sign <Tab><C-D>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + :sign define | + define | + :sign define^ | + ]]) + + -- Pressing <S-Tab> should open the popup menu with the last entry selected + feed('<C-U><CR>:sign <S-Tab><C-P>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{s: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign undefine^ | + ]]) + + -- Pressing <Esc> should close the popup menu and cancel the cmd line + feed('<C-U><CR>:sign <Tab><Esc>') + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + + -- Typing a character when the popup is open, should close the popup + feed(':sign <Tab>x') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign definex^ | + ]]) + + -- When the popup is open, entering the cmdline window should close the popup + feed('<C-U>sign <Tab><C-F>') + screen:expect([[ + | + {3:[No Name] }| + {1::}sign define | + {1::}sign defin^e | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4:[Command Line] }| + :sign define | + ]]) + feed(':q<CR>') + + -- After the last popup menu item, <C-N> should show the original string + feed(':sign u<Tab><C-N><C-N>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign u^ | + ]]) + + -- Use the popup menu for the command name + feed('<C-U>bu<Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {s: bufdo }{1: }| + {n: buffer }{1: }| + {n: buffers }{1: }| + {n: bunload }{1: }| + :bufdo^ | + ]]) + + -- Pressing <BS> should remove the popup menu and erase the last character + feed('<C-E><C-U>sign <Tab><BS>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign defin^ | + ]]) + + -- Pressing <C-W> should remove the popup menu and erase the previous word + feed('<C-E><C-U>sign <Tab><C-W>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign ^ | + ]]) + + -- Pressing <C-U> should remove the popup menu and erase the entire line + feed('<C-E><C-U>sign <Tab><C-U>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :^ | + ]]) + + -- Using <C-E> to cancel the popup menu and then pressing <Up> should recall + -- the cmdline from history + feed('sign xyz<Esc>:sign <Tab><C-E><Up>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign xyz^ | + ]]) + + feed('<esc>') + + -- Check "list" still works + command('set wildmode=longest,list') + feed(':cn<Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + :cn | + cnewer cnoreabbrev | + cnext cnoremap | + cnfile cnoremenu | + :cn^ | + ]]) + feed('s') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + :cn | + cnewer cnoreabbrev | + cnext cnoremap | + cnfile cnoremenu | + :cns^ | + ]]) + + feed('<esc>') + command('set wildmode=full') + + -- Tests a directory name contained full-width characters. + feed(':e あいう/<Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: 123 }{1: }| + {1:~ }{n: abc }{1: }| + {1:~ }{n: xyz }{1: }| + :e あいう/123^ | + ]]) + feed('<Esc>') + + -- Pressing <PageDown> should scroll the menu downward + feed(':sign <Tab><PageDown>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{s: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign undefine^ | + ]]) + feed('<PageDown>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{s: unplace }{1: }| + :sign unplace^ | + ]]) + feed('<PageDown>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign ^ | + ]]) + feed('<PageDown>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + feed('<C-U>sign <Tab><Right><Right><PageDown>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{s: unplace }{1: }| + :sign unplace^ | + ]]) + + -- Pressing <PageUp> should scroll the menu upward + feed('<C-U>sign <Tab><PageUp>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign ^ | + ]]) + feed('<PageUp>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{s: unplace }{1: }| + :sign unplace^ | + ]]) + feed('<PageUp>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{s: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign jump^ | + ]]) + feed('<PageUp>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + + -- pressing <C-E> to end completion should work in middle of the line too + feed('<Esc>:set wildchazz<Left><Left><Tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: wildchar }{1: }| + {1:~ }{n: wildcharm }{1: }| + :set wildchar^zz | + ]]) + feed('<C-E>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :set wildcha^zz | + ]]) + + -- pressing <C-Y> should select the current match and end completion + feed('<Esc>:set wildchazz<Left><Left><Tab><C-Y>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :set wildchar^zz | + ]]) + + feed('<Esc>') + + -- check positioning with multibyte char in pattern + command("e långfile1") + command("sp långfile2") + feed(':b lå<tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {4:långfile2 }| + | + {1:~ }| + {1:~ }{s: långfile1 }{1: }| + {3:lå}{n: långfile2 }{3: }| + :b långfile1^ | + ]]) + + -- check doesn't crash on screen resize + screen:try_resize(20,6) + screen:expect([[ + | + {1:~ }| + {4:långfile2 }| + {s: långfile1 } | + {3:lå}{n: långfile2 }{3: }| + :b långfile1^ | + ]]) + + screen:try_resize(50,15) + screen:expect([[ + | + {1:~ }| + {4:långfile2 }| + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: långfile1 }{1: }| + {3:lå}{n: långfile2 }{3: }| + :b långfile1^ | + ]]) + + -- position is calculated correctly with "longest" + feed('<esc>') + command('set wildmode=longest:full,full') + feed(':b lå<tab>') + screen:expect([[ + | + {1:~ }| + {4:långfile2 }| + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{n: långfile1 }{1: }| + {3:lå}{n: långfile2 }{3: }| + :b långfile^ | + ]]) + + feed('<esc>') + command("close") + command('set wildmode=full') + + -- special case: when patterns ends with "/", show menu items aligned + -- after the "/" + feed(':e compdir/<tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: file1 }{1: }| + {1:~ }{n: file2 }{1: }| + :e compdir/file1^ | + ]]) + end) + + it('wildoptions=pum with scrolled messages', function() + screen:try_resize(40,10) + command('set wildmenu') + command('set wildoptions=pum') + + feed(':echoerr "fail"|echoerr "error"<cr>') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + {6:fail} | + {6:error} | + {5:Press ENTER or type command to continue}^ | + ]]} + + feed(':sign <tab>') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {4: }{n: place }{4: }| + {6:fail} {n: undefine } | + {6:error}{n: unplace } | + :sign define^ | + ]]} + + feed('d') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {4: }| + {6:fail} | + {6:error} | + :sign defined^ | + ]]} + end) + + it('wildoptions=pum and wildmode=longest,full #11622', function() + screen:try_resize(30,8) + command('set wildmenu') + command('set wildoptions=pum') + command('set wildmode=longest,full') + + -- With 'wildmode' set to 'longest,full', completing a match should display + -- the longest match, the wildmenu should not be displayed. + feed(':sign u<Tab>') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :sign un^ | + ]]} + eq(0, funcs.wildmenumode()) + + -- pressing <Tab> should display the wildmenu + feed('<Tab>') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{s: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign undefine^ | + ]]} + eq(1, funcs.wildmenumode()) + + -- pressing <Tab> second time should select the next entry in the menu + feed('<Tab>') + screen:expect{grid=[[ + | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }{n: undefine }{1: }| + {1:~ }{s: unplace }{1: }| + :sign unplace^ | + ]]} + end) + + it('wildoptions=pum with a wrapped line in buffer vim-patch:8.2.4655', function() + screen:try_resize(32, 10) + meths.buf_set_lines(0, 0, -1, true, { ('a'):rep(100) }) + command('set wildoptions+=pum') + feed('$') + feed(':sign <Tab>') + screen:expect([[ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa| + aaaa {s: define } | + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + end) + + -- oldtest: Test_wildmenu_pum_odd_wildchar() + it('wildoptions=pum with odd wildchar', function() + screen:try_resize(30, 10) + -- Test odd wildchar interactions with pum. Make sure they behave properly + -- and don't lead to memory corruption due to improperly cleaned up memory. + exec([[ + set wildoptions=pum + set wildchar=<C-E> + ]]) + + feed(':sign <C-E>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + + -- <C-E> being a wildchar takes priority over its original functionality + feed('<C-E>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{n: define }{1: }| + {1:~ }{s: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign jump^ | + ]]) + + feed('<Esc>') + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + + -- Escape key can be wildchar too. Double-<Esc> is hard-coded to escape + -- command-line, and we need to make sure to clean up properly. + command('set wildchar=<Esc>') + feed(':sign <Esc>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + + feed('<Esc>') + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + + -- <C-\> can also be wildchar. <C-\><C-N> however will still escape cmdline + -- and we again need to make sure we clean up properly. + command([[set wildchar=<C-\>]]) + feed([[:sign <C-\><C-\>]]) + screen:expect([[ + | + {1:~ }| + {1:~ }| + {1:~ }{s: define }{1: }| + {1:~ }{n: jump }{1: }| + {1:~ }{n: list }{1: }| + {1:~ }{n: place }{1: }| + {1:~ }{n: undefine }{1: }| + {1:~ }{n: unplace }{1: }| + :sign define^ | + ]]) + + feed('<C-N>') + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + | + ]]) + end) + end - -- oldtest: Test_popup_command_dump() - it(':popup command', function() - exec([[ - func ChangeMenu() - aunmenu PopUp.&Paste - nnoremenu 1.40 PopUp.&Paste :echomsg "pasted"<CR> - echomsg 'changed' - return "\<Ignore>" - endfunc - - let lines =<< trim END - one two three four five - and one two Xthree four five - one more two three four five - END - call setline(1, lines) - - aunmenu * - source $VIMRUNTIME/menu.vim - ]]) - feed('/X<CR>:popup PopUp<CR>') - screen:expect([[ - one two three four five | - and one two {7:^X}three four five | - one more tw{n: Undo } | - {1:~ }{n: }{1: }| - {1:~ }{n: Paste }{1: }| - {1:~ }{n: }{1: }| - {1:~ }{n: Select Word }{1: }| - {1:~ }{n: Select Sentence }{1: }| - {1:~ }{n: Select Paragraph }{1: }| - {1:~ }{n: Select Line }{1: }| - {1:~ }{n: Select Block }{1: }| - {1:~ }{n: Select All }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :popup PopUp | - ]]) + it("'pumheight'", function() + screen:try_resize(32,8) + feed('isome long prefix before the ') + command("set completeopt+=noinsert,noselect") + command("set linebreak") + command("set pumheight=2") + funcs.complete(29, {'word', 'choice', 'text', 'thing'}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + some long prefix before the ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + {n: word }{c: }| + {n: choice}{s: }| + ]], float_pos={ + [4] = {{id = -1}, "NW", 2, 1, 24, false, 100}; + }} + else + screen:expect([[ + some long prefix before the ^ | + {1:~ }{n: word }{c: }| + {1:~ }{n: choice}{s: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end + end) - -- go to the Paste entry in the menu - feed('jj') - screen:expect([[ - one two three four five | - and one two {7:^X}three four five | - one more tw{n: Undo } | - {1:~ }{n: }{1: }| - {1:~ }{s: Paste }{1: }| - {1:~ }{n: }{1: }| - {1:~ }{n: Select Word }{1: }| - {1:~ }{n: Select Sentence }{1: }| - {1:~ }{n: Select Paragraph }{1: }| - {1:~ }{n: Select Line }{1: }| - {1:~ }{n: Select Block }{1: }| - {1:~ }{n: Select All }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :popup PopUp | - ]]) + it("'pumwidth'", function() + screen:try_resize(32,8) + feed('isome long prefix before the ') + command("set completeopt+=noinsert,noselect") + command("set linebreak") + command("set pumwidth=8") + funcs.complete(29, {'word', 'choice', 'text', 'thing'}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + some long prefix before the ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + {n: word }| + {n: choice}| + {n: text }| + {n: thing }| + ]], float_pos={ + [4] = {{id = -1}, "NW", 2, 1, 25, false, 100}; + }} + else + screen:expect([[ + some long prefix before the ^ | + {1:~ }{n: word }| + {1:~ }{n: choice}| + {1:~ }{n: text }| + {1:~ }{n: thing }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end + end) - -- Select a word - feed('j') - screen:expect([[ - one two three four five | - and one two {7:^X}three four five | - one more tw{n: Undo } | - {1:~ }{n: }{1: }| - {1:~ }{n: Paste }{1: }| - {1:~ }{n: }{1: }| - {1:~ }{s: Select Word }{1: }| - {1:~ }{n: Select Sentence }{1: }| - {1:~ }{n: Select Paragraph }{1: }| - {1:~ }{n: Select Line }{1: }| - {1:~ }{n: Select Block }{1: }| - {1:~ }{n: Select All }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - :popup PopUp | - ]]) + it('does not crash when displayed in the last column with rightleft #12032', function() + local col = 30 + local items = {'word', 'choice', 'text', 'thing'} + local max_len = 0 + for _, v in ipairs(items) do + max_len = max_len < #v and #v or max_len + end + screen:try_resize(col, 8) + command('set rightleft') + command('call setline(1, repeat(" ", &columns - '..max_len..'))') + feed('$i') + funcs.complete(col - max_len, items) + feed('<c-y>') + assert_alive() + end) - feed('<Esc>') + it('truncates double-width character correctly without scrollbar', function() + screen:try_resize(32, 8) + command('set completeopt+=menuone,noselect') + feed('i' .. string.rep(' ', 13)) + funcs.complete(14, {'哦哦哦哦哦哦哦哦哦哦'}) + if multigrid then + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + {n: 哦哦哦哦哦哦哦哦哦>}| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 12, false, 100}}}) + else + screen:expect([[ + ^ | + {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end + end) - -- Set an <expr> mapping to change a menu entry while it's displayed. - -- The text should not change but the command does. - -- Also verify that "changed" shows up, which means the mapping triggered. - command('nnoremap <expr> <F2> ChangeMenu()') - feed('/X<CR>:popup PopUp<CR><F2>') - screen:expect([[ - one two three four five | - and one two {7:^X}three four five | - one more tw{n: Undo } | - {1:~ }{n: }{1: }| - {1:~ }{n: Paste }{1: }| - {1:~ }{n: }{1: }| - {1:~ }{n: Select Word }{1: }| - {1:~ }{n: Select Sentence }{1: }| - {1:~ }{n: Select Paragraph }{1: }| - {1:~ }{n: Select Line }{1: }| - {1:~ }{n: Select Block }{1: }| - {1:~ }{n: Select All }{1: }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - changed | - ]]) + it('truncates double-width character correctly with scrollbar', function() + screen:try_resize(32,8) + command('set completeopt+=noselect') + command('set pumheight=4') + feed('i' .. string.rep(' ', 12)) + local items = {} + for _ = 1, 8 do + table.insert(items, {word = '哦哦哦哦哦哦哦哦哦哦', equal = 1, dup = 1}) + end + funcs.complete(13, items) + if multigrid then + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + {2:-- INSERT --} | + ## grid 4 + {n: 哦哦哦哦哦哦哦哦哦>}{c: }| + {n: 哦哦哦哦哦哦哦哦哦>}{c: }| + {n: 哦哦哦哦哦哦哦哦哦>}{s: }| + {n: 哦哦哦哦哦哦哦哦哦>}{s: }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 11, false, 100}}}) + else + screen:expect([[ + ^ | + {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{c: }| + {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{c: }| + {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{s: }| + {1:~ }{n: 哦哦哦哦哦哦哦哦哦>}{s: }| + {1:~ }| + {1:~ }| + {2:-- INSERT --} | + ]]) + end + end) - -- Select the Paste entry, executes the changed menu item. - feed('jj<CR>') - screen:expect([[ - one two three four five | - and one two {7:^X}three four five | - one more two three four five | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - pasted | - ]]) - end) -end) + it('supports mousemodel=popup', function() + screen:try_resize(32, 6) + exec([[ + call setline(1, 'popup menu test') + set mouse=a mousemodel=popup -describe('builtin popupmenu with ui/ext_multigrid', function() - local screen - before_each(function() - clear() - screen = Screen.new(32, 20) - screen:attach({ext_multigrid=true}) - screen:set_default_attr_ids({ - -- popup selected item / scrollbar track - ['s'] = {background = Screen.colors.WebGray}, - -- popup non-selected item - ['n'] = {background = Screen.colors.LightMagenta}, - -- popup scrollbar knob - ['c'] = {background = Screen.colors.Grey0}, - [1] = {bold = true, foreground = Screen.colors.Blue}, - [2] = {bold = true}, - [3] = {reverse = true}, - [4] = {bold = true, reverse = true}, - [5] = {bold = true, foreground = Screen.colors.SeaGreen}, - [6] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, - }) - end) + aunmenu PopUp + menu PopUp.foo :let g:menustr = 'foo'<CR> + menu PopUp.bar :let g:menustr = 'bar'<CR> + menu PopUp.baz :let g:menustr = 'baz'<CR> + ]]) - it('truncates double-width character correctly when there is no scrollbar', function() - screen:try_resize(32,8) - command('set completeopt+=menuone,noselect') - feed('i' .. string.rep(' ', 13)) - funcs.complete(14, {'哦哦哦哦哦哦哦哦哦哦'}) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - {2:-- INSERT --} | - ## grid 4 - {n: 哦哦哦哦哦哦哦哦哦>}| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 12, false, 100}}}) - end) + if multigrid then + meths.input_mouse('right', 'press', '', 2, 0, 4) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + ## grid 4 + {n: foo }| + {n: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + feed('<RightMouse><4,0>') + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{n: baz }{1: }| + {1:~ }| + | + ]]) + end + feed('<Down>') + if multigrid then + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + ## grid 4 + {s: foo }| + {n: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + screen:expect([[ + ^popup menu test | + {1:~ }{s: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{n: baz }{1: }| + {1:~ }| + | + ]]) + end + feed('<Down>') + if multigrid then + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + | + ## grid 4 + {n: foo }| + {s: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{s: bar }{1: }| + {1:~ }{n: baz }{1: }| + {1:~ }| + | + ]]) + end + feed('<CR>') + if multigrid then + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'bar' | + ]]}) + else + screen:expect([[ + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :let g:menustr = 'bar' | + ]]) + end + eq('bar', meths.get_var('menustr')) + + if multigrid then + meths.input_mouse('right', 'press', '', 2, 2, 20) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'bar' | + ## grid 4 + {n: foo }| + {n: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 3, 19, false, 250}}}) + else + feed('<RightMouse><20,2>') + screen:expect([[ + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + :let g:menustr = 'b{n: baz } | + ]]) + end + if multigrid then + meths.input_mouse('left', 'press', '', 4, 2, 2) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'baz' | + ]]}) + else + feed('<LeftMouse><22,5>') + screen:expect([[ + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :let g:menustr = 'baz' | + ]]) + end + eq('baz', meths.get_var('menustr')) + + if multigrid then + meths.input_mouse('right', 'press', '', 2, 0, 4) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'baz' | + ## grid 4 + {n: foo }| + {n: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + feed('<RightMouse><4,0>') + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{n: baz }{1: }| + {1:~ }| + :let g:menustr = 'baz' | + ]]) + end + if multigrid then + meths.input_mouse('right', 'drag', '', 2, 3, 6) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'baz' | + ## grid 4 + {n: foo }| + {n: bar }| + {s: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + feed('<RightDrag><6,3>') + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{s: baz }{1: }| + {1:~ }| + :let g:menustr = 'baz' | + ]]) + end + if multigrid then + meths.input_mouse('right', 'release', '', 2, 1, 6) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'foo' | + ]]}) + else + feed('<RightRelease><6,1>') + screen:expect([[ + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :let g:menustr = 'foo' | + ]]) + end + eq('foo', meths.get_var('menustr')) + + eq(false, screen.options.mousemoveevent) + if multigrid then + meths.input_mouse('right', 'press', '', 2, 0, 4) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'foo' | + ## grid 4 + {n: foo }| + {n: bar }| + {n: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + feed('<RightMouse><4,0>') + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{n: baz }{1: }| + {1:~ }| + :let g:menustr = 'foo' | + ]]) + end + eq(true, screen.options.mousemoveevent) + if multigrid then + meths.input_mouse('move', '', '', 2, 3, 6) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'foo' | + ## grid 4 + {n: foo }| + {n: bar }| + {s: baz }| + ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 250}}}) + else + feed('<MouseMove><6,3>') + screen:expect([[ + ^popup menu test | + {1:~ }{n: foo }{1: }| + {1:~ }{n: bar }{1: }| + {1:~ }{s: baz }{1: }| + {1:~ }| + :let g:menustr = 'foo' | + ]]) + end + eq(true, screen.options.mousemoveevent) + if multigrid then + meths.input_mouse('left', 'press', '', 2, 2, 6) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [2:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + ## grid 3 + :let g:menustr = 'bar' | + ]]}) + else + feed('<LeftMouse><6,2>') + screen:expect([[ + ^popup menu test | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :let g:menustr = 'bar' | + ]]) + end + eq(false, screen.options.mousemoveevent) + eq('bar', meths.get_var('menustr')) + + command('set laststatus=0 | botright split') + if multigrid then + meths.input_mouse('right', 'press', '', 5, 1, 20) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:--------------------------------]| + [5:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'bar' | + ## grid 4 + {n: foo }| + {n: bar }| + {n: baz }| + ## grid 5 + ^popup menu test | + {1:~ }| + ]], float_pos={[4] = {{id = -1}, "SW", 5, 1, 19, false, 250}}}) + else + feed('<RightMouse><20,4>') + screen:expect([[ + popup menu test | + {1:~ }{n: foo }{1: }| + {3:[No Name] [+] }{n: bar }{3: }| + ^popup menu test {n: baz } | + {1:~ }| + :let g:menustr = 'bar' | + ]]) + end + if multigrid then + meths.input_mouse('left', 'press', '', 4, 2, 2) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:--------------------------------]| + [5:--------------------------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'baz' | + ## grid 5 + ^popup menu test | + {1:~ }| + ]]}) + else + feed('<LeftMouse><22,3>') + screen:expect([[ + popup menu test | + {1:~ }| + {3:[No Name] [+] }| + ^popup menu test | + {1:~ }| + :let g:menustr = 'baz' | + ]]) + end + eq('baz', meths.get_var('menustr')) + + command('set winwidth=1 | rightbelow vsplit') + if multigrid then + meths.input_mouse('right', 'press', '', 6, 1, 14) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:---------------]│[6:----------------]| + [5:---------------]│[6:----------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'baz' | + ## grid 4 + {n: foo}| + {n: bar}| + {n: baz}| + ## grid 5 + popup menu test| + {1:~ }| + ## grid 6 + ^popup menu test | + {1:~ }| + ]], float_pos={[4] = {{id = -1}, "SW", 6, 1, 12, false, 250}}}) + else + feed('<RightMouse><30,4>') + screen:expect([[ + popup menu test | + {1:~ }{n: foo}| + {3:[No Name] [+] }{n: bar}| + popup menu test│^popup menu t{n: baz}| + {1:~ }│{1:~ }| + :let g:menustr = 'baz' | + ]]) + end + if multigrid then + meths.input_mouse('left', 'press', '', 4, 0, 2) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:---------------]│[6:----------------]| + [5:---------------]│[6:----------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'foo' | + ## grid 5 + popup menu test| + {1:~ }| + ## grid 6 + ^popup menu test | + {1:~ }| + ]]}) + else + feed('<LeftMouse><31,1>') + screen:expect([[ + popup menu test | + {1:~ }| + {3:[No Name] [+] }| + popup menu test│^popup menu test | + {1:~ }│{1:~ }| + :let g:menustr = 'foo' | + ]]) + end + eq('foo', meths.get_var('menustr')) + + command('setlocal winbar=WINBAR') + if multigrid then + meths.input_mouse('right', 'press', '', 6, 1, 14) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:---------------]│[6:----------------]| + [5:---------------]│[6:----------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'foo' | + ## grid 4 + {n: foo}| + {n: bar}| + {n: baz}| + ## grid 5 + popup menu test| + {1:~ }| + ## grid 6 + {2:WINBAR }| + ^popup menu test | + ]], float_pos={[4] = {{id = -1}, "SW", 6, 1, 12, false, 250}}}) + else + feed('<RightMouse><30,4>') + screen:expect([[ + popup menu test | + {1:~ }{n: foo}| + {3:[No Name] [+] }{n: bar}| + popup menu test│{2:WINBAR }{n: baz}| + {1:~ }│^popup menu test | + :let g:menustr = 'foo' | + ]]) + end + if multigrid then + meths.input_mouse('left', 'press', '', 4, 1, 2) + screen:expect({grid=[[ + ## grid 1 + [2:--------------------------------]| + [2:--------------------------------]| + {3:[No Name] [+] }| + [5:---------------]│[6:----------------]| + [5:---------------]│[6:----------------]| + [3:--------------------------------]| + ## grid 2 + popup menu test | + {1:~ }| + ## grid 3 + :let g:menustr = 'bar' | + ## grid 5 + popup menu test| + {1:~ }| + ## grid 6 + {2:WINBAR }| + ^popup menu test | + ]]}) + else + feed('<LeftMouse><31,2>') + screen:expect([[ + popup menu test | + {1:~ }| + {3:[No Name] [+] }| + popup menu test│{2:WINBAR }| + {1:~ }│^popup menu test | + :let g:menustr = 'bar' | + ]]) + end + eq('bar', meths.get_var('menustr')) + end) - it('truncates double-width character correctly when there is scrollbar', function() - screen:try_resize(32,8) - command('set completeopt+=noselect') - command('set pumheight=4') - feed('i' .. string.rep(' ', 12)) - local items = {} - for _ = 1, 8 do - table.insert(items, {word = '哦哦哦哦哦哦哦哦哦哦', equal = 1, dup = 1}) + if not multigrid then + -- oldtest: Test_popup_command_dump() + it(':popup command', function() + exec([[ + func ChangeMenu() + aunmenu PopUp.&Paste + nnoremenu 1.40 PopUp.&Paste :echomsg "pasted"<CR> + echomsg 'changed' + return "\<Ignore>" + endfunc + + let lines =<< trim END + one two three four five + and one two Xthree four five + one more two three four five + END + call setline(1, lines) + + aunmenu * + source $VIMRUNTIME/menu.vim + ]]) + feed('/X<CR>:popup PopUp<CR>') + screen:expect([[ + one two three four five | + and one two {7:^X}three four five | + one more tw{n: Undo } | + {1:~ }{n: }{1: }| + {1:~ }{n: Paste }{1: }| + {1:~ }{n: }{1: }| + {1:~ }{n: Select Word }{1: }| + {1:~ }{n: Select Sentence }{1: }| + {1:~ }{n: Select Paragraph }{1: }| + {1:~ }{n: Select Line }{1: }| + {1:~ }{n: Select Block }{1: }| + {1:~ }{n: Select All }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :popup PopUp | + ]]) + + -- go to the Paste entry in the menu + feed('jj') + screen:expect([[ + one two three four five | + and one two {7:^X}three four five | + one more tw{n: Undo } | + {1:~ }{n: }{1: }| + {1:~ }{s: Paste }{1: }| + {1:~ }{n: }{1: }| + {1:~ }{n: Select Word }{1: }| + {1:~ }{n: Select Sentence }{1: }| + {1:~ }{n: Select Paragraph }{1: }| + {1:~ }{n: Select Line }{1: }| + {1:~ }{n: Select Block }{1: }| + {1:~ }{n: Select All }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :popup PopUp | + ]]) + + -- Select a word + feed('j') + screen:expect([[ + one two three four five | + and one two {7:^X}three four five | + one more tw{n: Undo } | + {1:~ }{n: }{1: }| + {1:~ }{n: Paste }{1: }| + {1:~ }{n: }{1: }| + {1:~ }{s: Select Word }{1: }| + {1:~ }{n: Select Sentence }{1: }| + {1:~ }{n: Select Paragraph }{1: }| + {1:~ }{n: Select Line }{1: }| + {1:~ }{n: Select Block }{1: }| + {1:~ }{n: Select All }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :popup PopUp | + ]]) + + feed('<Esc>') + + -- Set an <expr> mapping to change a menu entry while it's displayed. + -- The text should not change but the command does. + -- Also verify that "changed" shows up, which means the mapping triggered. + command('nnoremap <expr> <F2> ChangeMenu()') + feed('/X<CR>:popup PopUp<CR><F2>') + screen:expect([[ + one two three four five | + and one two {7:^X}three four five | + one more tw{n: Undo } | + {1:~ }{n: }{1: }| + {1:~ }{n: Paste }{1: }| + {1:~ }{n: }{1: }| + {1:~ }{n: Select Word }{1: }| + {1:~ }{n: Select Sentence }{1: }| + {1:~ }{n: Select Paragraph }{1: }| + {1:~ }{n: Select Line }{1: }| + {1:~ }{n: Select Block }{1: }| + {1:~ }{n: Select All }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + changed | + ]]) + + -- Select the Paste entry, executes the changed menu item. + feed('jj<CR>') + screen:expect([[ + one two three four five | + and one two {7:^X}three four five | + one more two three four five | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + pasted | + ]]) + + -- Add a window toolbar to the window and check the :popup menu position. + command('setlocal winbar=TEST') + feed('/X<CR>:popup PopUp<CR>') + screen:expect([[ + {2:TEST }| + one two three four five | + and one two {7:^X}three four five | + one more tw{n: Undo } | + {1:~ }{n: }{1: }| + {1:~ }{n: Paste }{1: }| + {1:~ }{n: }{1: }| + {1:~ }{n: Select Word }{1: }| + {1:~ }{n: Select Sentence }{1: }| + {1:~ }{n: Select Paragraph }{1: }| + {1:~ }{n: Select Line }{1: }| + {1:~ }{n: Select Block }{1: }| + {1:~ }{n: Select All }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + :popup PopUp | + ]]) + + feed('<Esc>') + end) + + describe('"kind" and "menu"', function() + before_each(function() + screen:try_resize(30, 8) + exec([[ + func CompleteFunc( findstart, base ) + if a:findstart + return 0 + endif + return { + \ 'words': [ + \ { 'word': 'aword1', 'menu': 'extra text 1', 'kind': 'W', }, + \ { 'word': 'aword2', 'menu': 'extra text 2', 'kind': 'W', }, + \ { 'word': 'aword3', 'menu': 'extra text 3', 'kind': 'W', }, + \]} + endfunc + set completeopt=menu + set completefunc=CompleteFunc + ]]) + end) + + -- oldtest: Test_pum_highlights_default() + it('default highlight groups', function() + feed('iaw<C-X><C-u>') + screen:expect([[ + aword1^ | + {s:aword1 W extra text 1 }{1: }| + {n:aword2 W extra text 2 }{1: }| + {n:aword3 W extra text 3 }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- }{5:match 1 of 3} | + ]]) + end) + + -- oldtest: Test_pum_highlights_custom() + it('custom highlight groups', function() + exec([[ + hi PmenuKind guifg=Red guibg=Magenta + hi PmenuKindSel guifg=Red guibg=Grey + hi PmenuExtra guifg=White guibg=Magenta + hi PmenuExtraSel guifg=Black guibg=Grey + ]]) + local attrs = screen:get_default_attr_ids() + attrs.kn = {foreground = Screen.colors.Red, background = Screen.colors.Magenta} + attrs.ks = {foreground = Screen.colors.Red, background = Screen.colors.Grey} + attrs.xn = {foreground = Screen.colors.White, background = Screen.colors.Magenta} + attrs.xs = {foreground = Screen.colors.Black, background = Screen.colors.Grey} + feed('iaw<C-X><C-u>') + screen:expect([[ + aword1^ | + {s:aword1 }{ks:W }{xs:extra text 1 }{1: }| + {n:aword2 }{kn:W }{xn:extra text 2 }{1: }| + {n:aword3 }{kn:W }{xn:extra text 3 }{1: }| + {1:~ }| + {1:~ }| + {1:~ }| + {2:-- }{5:match 1 of 3} | + ]], attrs) + end) + end) end - funcs.complete(13, items) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - {2:-- INSERT --} | - ## grid 4 - {n: 哦哦哦哦哦哦哦哦哦>}{c: }| - {n: 哦哦哦哦哦哦哦哦哦>}{c: }| - {n: 哦哦哦哦哦哦哦哦哦>}{s: }| - {n: 哦哦哦哦哦哦哦哦哦>}{s: }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 11, false, 100}}}) - end) + end - it('supports mousemodel=popup', function() - screen:try_resize(32, 6) - exec([[ - call setline(1, 'popup menu test') - set mouse=a mousemodel=popup + describe('with ext_multigrid', function() + with_ext_multigrid(true) + end) - aunmenu PopUp - menu PopUp.foo :let g:menustr = 'foo'<CR> - menu PopUp.bar :let g:menustr = 'bar'<CR> - menu PopUp.baz :let g:menustr = 'baz'<CR> - ]]) - meths.input_mouse('right', 'press', '', 2, 1, 20) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - | - ## grid 4 - {n: foo }| - {n: bar }| - {n: baz }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 2, 19, false, 100}}}) - meths.input_mouse('left', 'press', '', 4, 2, 2) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'baz' | - ]]}) - eq('baz', meths.get_var('menustr')) - meths.input_mouse('right', 'press', '', 2, 0, 4) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'baz' | - ## grid 4 - {n: foo }| - {n: bar }| - {n: baz }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 100}}}) - meths.input_mouse('right', 'drag', '', 2, 3, 6) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'baz' | - ## grid 4 - {n: foo }| - {n: bar }| - {s: baz }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 100}}}) - meths.input_mouse('right', 'release', '', 2, 1, 6) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'foo' | - ]]}) - eq('foo', meths.get_var('menustr')) - eq(false, screen.options.mousemoveevent) - meths.input_mouse('right', 'press', '', 2, 0, 4) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'foo' | - ## grid 4 - {n: foo }| - {n: bar }| - {n: baz }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 100}}}) - eq(true, screen.options.mousemoveevent) - meths.input_mouse('move', '', '', 2, 3, 6) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'foo' | - ## grid 4 - {n: foo }| - {n: bar }| - {s: baz }| - ]], float_pos={[4] = {{id = -1}, 'NW', 2, 1, 3, false, 100}}}) - eq(true, screen.options.mousemoveevent) - meths.input_mouse('left', 'press', '', 2, 2, 6) - screen:expect({grid=[[ - ## grid 1 - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [2:--------------------------------]| - [3:--------------------------------]| - ## grid 2 - ^popup menu test | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - ## grid 3 - :let g:menustr = 'bar' | - ]]}) - eq(false, screen.options.mousemoveevent) - eq('bar', meths.get_var('menustr')) + describe('without ext_multigrid', function() + with_ext_multigrid(false) end) end) |