local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local clear, feed = helpers.clear, helpers.feed local source = helpers.source local insert = helpers.insert local meths = helpers.meths local command = helpers.command local funcs = helpers.funcs describe('ui/ext_popupmenu', function() local screen before_each(function() clear() screen = Screen.new(60, 8) screen:attach({rgb=true, ext_popupmenu=true}) screen:set_default_attr_ids({ [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] = {background = Screen.colors.WebGray}, [7] = {background = Screen.colors.LightMagenta}, }) source([[ function! TestComplete() abort call complete(1, [{'word':'foo', 'abbr':'fo', 'menu':'the foo', 'info':'foo-y', 'kind':'x'}, 'bar', 'spam']) return '' endfunction ]]) end) local expected = { {'fo', 'x', 'the foo', 'foo-y'}, {'bar', '', '', ''}, {'spam', '', '', ''}, } it('works', function() feed('o=TestComplete()') screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=0, anchor={1,1,0}, }} feed('') screen:expect{grid=[[ | ^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=-1, anchor={1,1,0}, }} -- down moves the selection in the menu, but does not insert anything feed('') screen:expect{grid=[[ | ^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=1, anchor={1,1,0}, }} feed('') screen:expect{grid=[[ | bar^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]} end) it('can be controlled by API', function() feed('o=TestComplete()') screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=0, anchor={1,1,0}, }} meths.select_popupmenu_item(1,false,false,{}) screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=1, anchor={1,1,0}, }} meths.select_popupmenu_item(2,true,false,{}) screen:expect{grid=[[ | spam^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=2, anchor={1,1,0}, }} meths.select_popupmenu_item(0,true,true,{}) screen:expect([[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) feed('=TestComplete()') screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=0, anchor={1,1,0}, }} meths.select_popupmenu_item(-1,false,false,{}) screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=-1, anchor={1,1,0}, }} meths.select_popupmenu_item(1,true,false,{}) screen:expect{grid=[[ | bar^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=1, anchor={1,1,0}, }} meths.select_popupmenu_item(-1,true,false,{}) screen:expect{grid=[[ | ^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=-1, anchor={1,1,0}, }} meths.select_popupmenu_item(0,true,false,{}) screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=0, anchor={1,1,0}, }} meths.select_popupmenu_item(-1,true,true,{}) screen:expect([[ | ^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) command('imap call nvim_select_popupmenu_item(2,v:true,v:false,{})') command('imap call nvim_select_popupmenu_item(-1,v:false,v:false,{})') command('imap call nvim_select_popupmenu_item(1,v:false,v:true,{})') feed('=TestComplete()') screen:expect{grid=[[ | foo^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=0, anchor={1,1,0}, }} feed('') screen:expect{grid=[[ | spam^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=2, anchor={1,1,0}, }} feed('') screen:expect{grid=[[ | spam^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]], popupmenu={ items=expected, pos=-1, anchor={1,1,0}, }} feed('') screen:expect([[ | bar^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) -- also should work for builtin popupmenu screen:set_option('ext_popupmenu', false) feed('=TestComplete()') screen:expect([[ | foo^ | {6:fo x the foo }{1: }| {7:bar }{1: }| {7:spam }{1: }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) feed('') screen:expect([[ | spam^ | {7:fo x the foo }{1: }| {7:bar }{1: }| {6:spam }{1: }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) feed('') screen:expect([[ | spam^ | {7:fo x the foo }{1: }| {7:bar }{1: }| {7:spam }{1: }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) feed('') screen:expect([[ | bar^ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) end) it('works with wildoptions=pum', function() screen:try_resize(32,10) command('set wildmenu') command('set wildoptions=pum') local wild_expected = { {'define', '', '', ''}, {'jump', '', '', ''}, {'list', '', '', ''}, {'place', '', '', ''}, {'undefine', '', '', ''}, {'unplace', '', '', ''}, } feed(':sign ') screen:expect([[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign ^ | ]]) feed('') screen:expect{grid=[[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign define^ | ]], popupmenu={items=wild_expected, pos=0, anchor={1, 9, 6}}} feed('') screen:expect{grid=[[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign ^ | ]], popupmenu={items=wild_expected, pos=-1, anchor={1, 9, 6}}} feed('') screen:expect{grid=[[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign unplace^ | ]], popupmenu={items=wild_expected, pos=5, anchor={1, 9, 6}}} feed('x') screen:expect([[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign unplacex^ | ]]) feed('') -- check positioning with multibyte char in pattern command("e långfile1") command("sp långfile2") feed(':b lå') screen:expect{grid=[[ | {1:~ }| {1:~ }| {1:~ }| {4:långfile2 }| | {1:~ }| {1:~ }| {3:långfile1 }| :b långfile1^ | ]], popupmenu={ anchor = {1, 9, 3}, items = {{"långfile1", "", "", "" }, {"långfile2", "", "", ""}}, pos = 0, }} end) end) 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}, }) end) it('works with preview-window above', function() feed(':ped4+') feed('iaa bb cc dd ee ff gg hh ii jj') feed('') 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('works with preview-window below', function() feed(':ped4+r') feed('iaa bb cc dd ee ff gg hh ii jj') feed('') 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('works with preview-window above and tall and inverted', function() feed(':ped8+') feed('iaabbccddee') feed('ffgghhiijj') feed('kkllmmnnoo') feed('') 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('works with preview-window above and short and inverted', function() feed(':ped4+') feed('iaabbccddee') feed('ffgghhiijj') feed('') screen:expect([[ aa | bb | cc | dd | ee | ff | gg | {s:aa } | {n:bb }{3:iew][+] }| {n:cc } | {n:dd } | {n:ee } | {n:ff } | {n:gg } | {n:hh } | {n:ii } | {n:jj } | aa^ | {4:[No Name] [+] }| {2:-- }{5:match 1 of 10} | ]]) end) it('works with preview-window below and inverted', function() feed(':ped4+r') feed('iaabbccddee') feed('ffgghhiijj') feed('') 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) it('works with vsplits', function() insert('aaa aab aac\n') feed(':vsplit') screen:expect([[ aaa aab aac {3:│}aaa aab aac| ^ {3:│} | {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {4:[No Name] [+] }{3:') screen:expect([[ aaa aab aac {3:│}aaa aab aac| bbb aaa^ {3:│}bbb aaa | {1:~ }{s: aaa }{1: }{3:│}{1:~ }| {1:~ }{n: aab }{1: }{3:│}{1:~ }| {1:~ }{n: aac }{1: }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {4:[No Name] [+] }{3:oc a') screen:expect([[ aaa aab aac{3:│}aaa aab aac | bbb aaa {3:│}bbb aaa | c aaa {3:│}c aaa^ | {1:~ }{3:│}{1:~}{s: aaa }{1: }| {1:~ }{3:│}{1:~}{n: aab }{1: }| {1:~ }{3:│}{1:~}{n: aac }{1: }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {1:~ }{3:│}{1:~ }| {3:') 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('') 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('') 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('') 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('') 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('') 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('') 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:-- }{s: text } | ]]) -- 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:~ }{n: choice }| {1:~ }{s: text }| {1:~ }{n: thing }| {1:~ }| {2:-- INSERT --} | ]]) end) it('works with rightleft window', function() command("set rl") 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('') 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('') 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 --} | ]]) end) it('works with multiline messages', function() screen:try_resize(40,8) feed('ixx') command('imap echoerr "very"\\|echoerr "much"\\|echoerr "error"') 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('') screen:expect([[ xx | word | {s:word }{1: }| {4: }| {6:very} | {6:much} | {6:error} | {5:Press ENTER or type command to continue}^ | ]]) feed('') screen:expect([[ xx | word^ | {s:word }{1: }| {n:choice }{1: }| {n:text }{1: }| {n:thing }{1: }| {1:~ }| {2:-- INSERT --} | ]]) feed('') screen:expect([[ xx | choice^ | {n:word }{1: }| {s:choice }{1: }| {n:text }{1: }| {n:thing }{1: }| {1:~ }| {2:-- INSERT --} | ]]) command("split") screen:expect([[ choice^ | {1:~ }| {n:word }{1: }| {s:choice }{4: }| {n:text } | {n:thing }{1: }| {3:[No Name] [+] }| {2:-- INSERT --} | ]]) meths.input_mouse('wheel', 'down', '', 0, 6, 15) screen:expect{grid=[[ choice^ | {1:~ }| {n:word }{1: }| {s:choice }{4: }| {n:text } | {n:thing }{1: }| {3:[No Name] [+] }| {2:-- INSERT --} | ]], unchanged=true} end) it('works 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('') screen:expect([[ xx ^ | {1:~ }{n: wordey x extrainfo }{1: }| {1:~ }{n: thing }{1: }| {1:~ }{n: sneaky bar }{1: }| {1:~ }| {1:~ }| {1:~ }| {2:-- INSERT --} | ]]) feed('') 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('') screen:expect([[ xx secre^t | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| | ]]) end) it('works with wildoptions=pum', function() screen:try_resize(32,10) command('set wildmenu') command('set wildoptions=pum') feed(':sign ') screen:expect([[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign ^ | ]]) feed('') 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('') 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('') 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('x') screen:expect([[ | {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| {1:~ }| :sign unplacex^ | ]]) feed('') -- check positioning with multibyte char in pattern command("e långfile1") command("sp långfile2") feed(':b lå') 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^ | ]]) end) it("'pumblend' RGB-color", function() screen:try_resize(60,14) screen:set_default_attr_ids({ [1] = {background = Screen.colors.Yellow}, [2] = {bold = true, reverse = true}, [3] = {bold = true, foreground = Screen.colors.Brown}, [4] = {foreground = Screen.colors.Blue1}, [5] = {reverse = true}, [6] = {background = Screen.colors.Gray55, foreground = Screen.colors.Grey45}, [7] = {background = Screen.colors.Gray55, foreground = Screen.colors.Grey0}, [8] = {background = tonumber('0x191919'), foreground = Screen.colors.Grey0}, [9] = {background = tonumber('0xffc1ff'), foreground = tonumber('0xe5a8e5')}, [10] = {background = tonumber('0xffc1ff'), foreground = Screen.colors.Grey0}, [11] = {foreground = tonumber('0xffc1ff'), background = tonumber('0xe5a8e5'), bold = true}, [12] = {foreground = Screen.colors.Grey55, background = Screen.colors.Gray45, bold = true}, [13] = {background = tonumber('0xffc1e5'), foreground = Screen.colors.Grey0}, [14] = {background = tonumber('0xffc1e5'), foreground = tonumber('0xe5a8e5')}, [15] = {background = tonumber('0xffc1ff'), foreground = tonumber('0x080202')}, [16] = {background = tonumber('0xffc1ff'), bold = true, foreground = tonumber('0xf6ace9')}, [17] = {background = tonumber('0xffc1ff'), foreground = tonumber('0xe5a8ff')}, [18] = {background = tonumber('0xe5a8e5'), foreground = tonumber('0xffc1ff')}, [19] = {background = Screen.colors.Gray45, foreground = Screen.colors.Grey55}, [20] = {bold = true}, [21] = {bold = true, foreground = Screen.colors.SeaGreen4}, [22] = {background = Screen.colors.WebGray}, [23] = {background = Screen.colors.Grey0}, [24] = {background = Screen.colors.LightMagenta}, [25] = {background = Screen.colors.Gray75, foreground = Screen.colors.Grey25}, [26] = {background = Screen.colors.Gray75, foreground = Screen.colors.Grey0}, [27] = {background = Screen.colors.Gray50, foreground = Screen.colors.Grey0}, [28] = {background = tonumber('0xffddff'), foreground = tonumber('0x7f5d7f')}, [29] = {background = tonumber('0xffddff'), foreground = Screen.colors.Grey0}, [30] = {foreground = tonumber('0xffddff'), background = tonumber('0x7f5d7f'), bold = true}, [31] = {foreground = tonumber('0xffddff'), background = Screen.colors.Grey0, bold = true}, [32] = {foreground = Screen.colors.Gray75, background = Screen.colors.Grey25, bold = true}, [33] = {background = tonumber('0xffdd7f'), foreground = Screen.colors.Grey0}, [34] = {background = tonumber('0xffdd7f'), foreground = tonumber('0x7f5d7f')}, [35] = {background = tonumber('0xffddff'), bold = true, foreground = tonumber('0x290a0a')}, [36] = {background = tonumber('0xffddff'), bold = true, foreground = tonumber('0xd27294')}, [37] = {background = tonumber('0xffddff'), foreground = tonumber('0x7f5dff')}, [38] = {background = tonumber('0x7f5d7f'), foreground = tonumber('0xffddff')}, [39] = {background = Screen.colors.Grey0, foreground = tonumber('0xffddff')}, [40] = {background = Screen.colors.Gray25, foreground = Screen.colors.Grey75}, [41] = {background = tonumber('0xffddff'), foreground = tonumber('0x00003f')}, [42] = {foreground = tonumber('0x0c0c0c'), background = tonumber('0xe5a8e5')}, [43] = {background = tonumber('0x7f5d7f'), bold = true, foreground = tonumber('0x3f3f3f')}, [44] = {foreground = tonumber('0x3f3f3f'), background = tonumber('0x7f5d7f')}, }) command('syntax on') command('set mouse=a') command('set pumblend=10') 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.]]) command('match Statement /el/') command('2match Comment /ut/') command('1') command('split') command('/ol') screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | ^incididunt ut labore et d{1:ol}ore magna aliqua. | Ut enim ad minim veniam, quis nostrud | exercitation ullamco laboris nisi ut aliquip ex | ea commodo consequat. Duis aute irure d{1:ol}or in | {2:[No Name] [+] }| Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing {3:el}it, sed do eiusmod tempor | incididunt {4:ut} labore et d{1:ol}ore magna aliqua. | Ut enim ad minim veniam, quis nostrud | exercitation ullamco laboris nisi {4:ut} aliquip ex | {5:[No Name] [+] }| | ]]) feed('Obla bla ') screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | bla bla incididunt^ | incidid{6:u}{7:incididunt}{6:re et}{8: }d{1:ol}ore magna aliqua. | Ut enim{9: }{10:ut}{9: minim veniam}{6:,} quis nostrud | exercit{9:a}{10:labore}{9:llamco la}{6:b}oris nisi ut aliquip ex | {2:[No Nam}{11:e}{42:et}{11:[+] }{12: }{2: }| Lorem i{9:p}{10:dolor}{13:e}{14:l}{9:or sit a}{6:m}et, consectetur | adipisi{9:c}{10:magn}{15:a}{16:l}{9:it, sed d}{6:o} eiusmod tempor | bla bla{9: }{10:aliqua}{9:dunt }{6: } | incidid{9:u}{10:Ut}{9: }{17:ut}{9: labore et}{6: }d{1:ol}ore magna aliqua. | Ut enim{9: }{10:enim}{9:inim veniam}{6:,} quis nostrud | {5:[No Nam}{18:e}{42:ad}{18:[+] }{19: }{5: }| {20:-- Keyword Local completion (^N^P) }{21:match 1 of 65} | ]]) command('set pumblend=0') screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | bla bla incididunt^ | incidid{22: incididunt }{23: }d{1:ol}ore magna aliqua. | Ut enim{24: ut }{22: } quis nostrud | exercit{24: labore }{22: }oris nisi ut aliquip ex | {2:[No Nam}{24: et }{22: }{2: }| Lorem i{24: dolore }{22: }et, consectetur | adipisi{24: magna }{22: } eiusmod tempor | bla bla{24: aliqua }{22: } | incidid{24: Ut }{22: }d{1:ol}ore magna aliqua. | Ut enim{24: enim }{22: } quis nostrud | {5:[No Nam}{24: ad }{22: }{5: }| {20:-- Keyword Local completion (^N^P) }{21:match 1 of 65} | ]]) command('set pumblend=50') screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | bla bla incididunt^ | incidid{25:u}{26:incididunt}{25:re et}{27: }d{1:ol}ore magna aliqua. | Ut enim{28: }{29:ut}{28: minim veniam}{25:,} quis nostrud | exercit{28:a}{29:labore}{28:llamco la}{25:b}oris nisi ut aliquip ex | {2:[No Nam}{30:e}{43:et}{30:[+] }{32: }{2: }| Lorem i{28:p}{29:dolor}{33:e}{34:l}{28:or sit a}{25:m}et, consectetur | adipisi{28:c}{29:magn}{35:a}{36:l}{28:it, sed d}{25:o} eiusmod tempor | bla bla{28: }{29:aliqua}{28:dunt }{25: } | incidid{28:u}{29:Ut}{28: }{37:ut}{28: labore et}{25: }d{1:ol}ore magna aliqua. | Ut enim{28: }{29:enim}{28:inim veniam}{25:,} quis nostrud | {5:[No Nam}{38:e}{44:ad}{38:[+] }{40: }{5: }| {20:-- Keyword Local completion (^N^P) }{21:match 1 of 65} | ]]) meths.input_mouse('wheel', 'down', '', 0, 9, 40) screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | bla bla incididunt^ | incidid{25:u}{26:incididunt}{25:re et}{27: }d{1:ol}ore magna aliqua. | Ut enim{28: }{29:ut}{28: minim veniam}{25:,} quis nostrud | exercit{28:a}{29:labore}{28:llamco la}{25:b}oris nisi ut aliquip ex | {2:[No Nam}{30:e}{43:et}{30:[+] }{32: }{2: }| incidid{28:u}{29:dol}{41:or}{29:e}{28:labore et}{25: }d{1:ol}ore magna aliqua. | Ut enim{28: }{29:magna}{28:nim veniam}{25:,} quis nostrud | exercit{28:a}{29:aliqua}{28:llamco la}{25:b}oris nisi {4:ut} aliquip ex | ea comm{28:o}{29:Ut}{28: consequat. D}{25:u}is a{4:ut}e irure d{1:ol}or in | reprehe{28:n}{29:enim}{28:t in v}{34:ol}{28:upt}{25:a}te v{3:el}it esse cillum | {5:[No Nam}{38:e}{44:ad}{38:[+] }{40: }{5: }| {20:-- Keyword Local completion (^N^P) }{21:match 1 of 65} | ]]) feed('') screen:expect([[ Lorem ipsum d{1:ol}or sit amet, consectetur | adipisicing elit, sed do eiusmod tempor | bla bla ^ | incididunt ut labore et d{1:ol}ore magna aliqua. | Ut enim ad minim veniam, quis nostrud | exercitation ullamco laboris nisi ut aliquip ex | {2:[No Name] [+] }| incididunt {4:ut} labore et d{1:ol}ore magna aliqua. | Ut enim ad minim veniam, quis nostrud | exercitation ullamco laboris nisi {4:ut} aliquip ex | ea commodo consequat. Duis a{4:ut}e irure d{1:ol}or in | reprehenderit in v{1:ol}uptate v{3:el}it esse cillum | {5:[No Name] [+] }| {20:-- INSERT --} | ]]) end) it("'pumblend' 256-color (non-RGB)", function() screen:detach() screen = Screen.new(60, 8) screen:attach({rgb=false, ext_popupmenu=false}) screen:set_default_attr_ids({ [1] = {foreground = Screen.colors.Grey0, background = tonumber('0x000007')}, [2] = {foreground = tonumber('0x000055'), background = tonumber('0x000007')}, [3] = {foreground = tonumber('0x00008f'), background = Screen.colors.Grey0}, [4] = {foreground = Screen.colors.Grey0, background = tonumber('0x0000e1')}, [5] = {foreground = tonumber('0x0000d1'), background = tonumber('0x0000e1')}, [6] = {foreground = Screen.colors.NavyBlue, background = tonumber('0x0000f8')}, [7] = {foreground = tonumber('0x0000a5'), background = tonumber('0x0000f8')}, [8] = {foreground = tonumber('0x00000c')}, [9] = {bold = true}, [10] = {foreground = tonumber('0x000002')}, }) command('set notermguicolors pumblend=10') 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 laborum.]]) feed('ggOdo') screen:expect([[ dolor^ | {1:dolor}{2: ipsum dol}or sit amet, consectetur | {4:do}{5:ipisicing eli}t, sed do eiusmod tempor | {4:dolore}{5:dunt ut l}abore et dolore magna aliqua. | Ut enim ad minim veniam, quis nostrud | laborum. | {8:~ }| {9:-- Keyword Local completion (^N^P) }{10:match 1 of 3} | ]]) end) end)