xref: /vim-8.2.3635/src/testdir/test_cmdline.vim (revision 125ffd21)
1ae3150ecSBram Moolenaar" Tests for editing the command line.
2ae3150ecSBram Moolenaar
34facea31SBram Moolenaarsource check.vim
44facea31SBram Moolenaarsource screendump.vim
524ebd83eSBram Moolenaarsource view_util.vim
6c82dd860SBram Moolenaarsource shared.vim
74facea31SBram Moolenaar
8ae3150ecSBram Moolenaarfunc Test_complete_tab()
9ae3150ecSBram Moolenaar  call writefile(['testfile'], 'Xtestfile')
10ae3150ecSBram Moolenaar  call feedkeys(":e Xtest\t\r", "tx")
11ae3150ecSBram Moolenaar  call assert_equal('testfile', getline(1))
126024c042SAlbert Liu
136024c042SAlbert Liu  " Pressing <Tab> after '%' completes the current file, also on MS-Windows
146024c042SAlbert Liu  call feedkeys(":e %\t\r", "tx")
156024c042SAlbert Liu  call assert_equal('e Xtestfile', @:)
16ae3150ecSBram Moolenaar  call delete('Xtestfile')
17ae3150ecSBram Moolenaarendfunc
18ae3150ecSBram Moolenaar
19ae3150ecSBram Moolenaarfunc Test_complete_list()
20ae3150ecSBram Moolenaar  " We can't see the output, but at least we check the code runs properly.
21ae3150ecSBram Moolenaar  call feedkeys(":e test\<C-D>\r", "tx")
22ae3150ecSBram Moolenaar  call assert_equal('test', expand('%:t'))
23578fe947SBram Moolenaar
24578fe947SBram Moolenaar  " If a command doesn't support completion, then CTRL-D should be literally
25578fe947SBram Moolenaar  " used.
26578fe947SBram Moolenaar  call feedkeys(":chistory \<C-D>\<C-B>\"\<CR>", 'xt')
27578fe947SBram Moolenaar  call assert_equal("\"chistory \<C-D>", @:)
28ae3150ecSBram Moolenaarendfunc
29ae3150ecSBram Moolenaar
30ae3150ecSBram Moolenaarfunc Test_complete_wildmenu()
3137db6420SBram Moolenaar  call mkdir('Xdir1/Xdir2', 'p')
3237db6420SBram Moolenaar  call writefile(['testfile1'], 'Xdir1/Xtestfile1')
3337db6420SBram Moolenaar  call writefile(['testfile2'], 'Xdir1/Xtestfile2')
3437db6420SBram Moolenaar  call writefile(['testfile3'], 'Xdir1/Xdir2/Xtestfile3')
3537db6420SBram Moolenaar  call writefile(['testfile3'], 'Xdir1/Xdir2/Xtestfile4')
36ae3150ecSBram Moolenaar  set wildmenu
3737db6420SBram Moolenaar
3837db6420SBram Moolenaar  " Pressing <Tab> completes, and moves to next files when pressing again.
3937db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Tab>\<CR>", 'tx')
4037db6420SBram Moolenaar  call assert_equal('testfile1', getline(1))
4137db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Tab>\<Tab>\<CR>", 'tx')
42ae3150ecSBram Moolenaar  call assert_equal('testfile2', getline(1))
43ae3150ecSBram Moolenaar
4437db6420SBram Moolenaar  " <S-Tab> is like <Tab> but begin with the last match and then go to
4537db6420SBram Moolenaar  " previous.
4637db6420SBram Moolenaar  call feedkeys(":e Xdir1/Xtest\<S-Tab>\<CR>", 'tx')
4737db6420SBram Moolenaar  call assert_equal('testfile2', getline(1))
4837db6420SBram Moolenaar  call feedkeys(":e Xdir1/Xtest\<S-Tab>\<S-Tab>\<CR>", 'tx')
4937db6420SBram Moolenaar  call assert_equal('testfile1', getline(1))
5037db6420SBram Moolenaar
5137db6420SBram Moolenaar  " <Left>/<Right> to move to previous/next file.
5237db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Right>\<CR>", 'tx')
5337db6420SBram Moolenaar  call assert_equal('testfile1', getline(1))
5437db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Right>\<Right>\<CR>", 'tx')
5537db6420SBram Moolenaar  call assert_equal('testfile2', getline(1))
5637db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Right>\<Right>\<Left>\<CR>", 'tx')
5737db6420SBram Moolenaar  call assert_equal('testfile1', getline(1))
5837db6420SBram Moolenaar
5937db6420SBram Moolenaar  " <Up>/<Down> to go up/down directories.
6037db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Down>\<CR>", 'tx')
6137db6420SBram Moolenaar  call assert_equal('testfile3', getline(1))
6237db6420SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>\<Down>\<Up>\<Right>\<CR>", 'tx')
6337db6420SBram Moolenaar  call assert_equal('testfile1', getline(1))
6437db6420SBram Moolenaar
653e112accSBram Moolenaar  " this fails in some Unix GUIs, not sure why
663e112accSBram Moolenaar  if !has('unix') || !has('gui_running')
673e112accSBram Moolenaar    " <C-J>/<C-K> mappings to go up/down directories when 'wildcharm' is
68b0ac4ea5SBram Moolenaar    " different than 'wildchar'.
69b0ac4ea5SBram Moolenaar    set wildcharm=<C-Z>
70b0ac4ea5SBram Moolenaar    cnoremap <C-J> <Down><C-Z>
71b0ac4ea5SBram Moolenaar    cnoremap <C-K> <Up><C-Z>
72b0ac4ea5SBram Moolenaar    call feedkeys(":e Xdir1/\<Tab>\<C-J>\<CR>", 'tx')
73b0ac4ea5SBram Moolenaar    call assert_equal('testfile3', getline(1))
74b0ac4ea5SBram Moolenaar    call feedkeys(":e Xdir1/\<Tab>\<C-J>\<C-K>\<CR>", 'tx')
75b0ac4ea5SBram Moolenaar    call assert_equal('testfile1', getline(1))
76b0ac4ea5SBram Moolenaar    set wildcharm=0
77b0ac4ea5SBram Moolenaar    cunmap <C-J>
78b0ac4ea5SBram Moolenaar    cunmap <C-K>
793e112accSBram Moolenaar  endif
80b0ac4ea5SBram Moolenaar
81578fe947SBram Moolenaar  " Test for canceling the wild menu by adding a character
82578fe947SBram Moolenaar  redrawstatus
83578fe947SBram Moolenaar  call feedkeys(":e Xdir1/\<Tab>x\<C-B>\"\<CR>", 'xt')
84578fe947SBram Moolenaar  call assert_equal('"e Xdir1/Xdir2/x', @:)
85578fe947SBram Moolenaar
868d588cceSBram Moolenaar  " Completion using a relative path
878d588cceSBram Moolenaar  cd Xdir1/Xdir2
888d588cceSBram Moolenaar  call feedkeys(":e ../\<Tab>\<Right>\<Down>\<C-A>\<C-B>\"\<CR>", 'tx')
898d588cceSBram Moolenaar  call assert_equal('"e Xtestfile3 Xtestfile4', @:)
908d588cceSBram Moolenaar  cd -
918d588cceSBram Moolenaar
920e05de46SBram Moolenaar  cnoremap <expr> <F2> wildmenumode()
930e05de46SBram Moolenaar  call feedkeys(":cd Xdir\<Tab>\<F2>\<C-B>\"\<CR>", 'tx')
940e05de46SBram Moolenaar  call assert_equal('"cd Xdir1/1', @:)
950e05de46SBram Moolenaar  cunmap <F2>
960e05de46SBram Moolenaar
9737db6420SBram Moolenaar  " cleanup
9837db6420SBram Moolenaar  %bwipe
9937db6420SBram Moolenaar  call delete('Xdir1/Xdir2/Xtestfile4')
10037db6420SBram Moolenaar  call delete('Xdir1/Xdir2/Xtestfile3')
10137db6420SBram Moolenaar  call delete('Xdir1/Xtestfile2')
10237db6420SBram Moolenaar  call delete('Xdir1/Xtestfile1')
10337db6420SBram Moolenaar  call delete('Xdir1/Xdir2', 'd')
10437db6420SBram Moolenaar  call delete('Xdir1', 'd')
105ae3150ecSBram Moolenaar  set nowildmenu
106ae3150ecSBram Moolenaarendfunc
1074b2ce129SBram Moolenaar
108a60053b8SBram Moolenaarfunc Test_wildmenu_screendump()
109a60053b8SBram Moolenaar  CheckScreendump
110a60053b8SBram Moolenaar
111a60053b8SBram Moolenaar  let lines =<< trim [SCRIPT]
112a60053b8SBram Moolenaar    set wildmenu hlsearch
113a60053b8SBram Moolenaar  [SCRIPT]
114a60053b8SBram Moolenaar  call writefile(lines, 'XTest_wildmenu')
115a60053b8SBram Moolenaar
116a60053b8SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_wildmenu', {'rows': 8})
117a60053b8SBram Moolenaar  call term_sendkeys(buf, ":vim\<Tab>")
118a60053b8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_wildmenu_1', {})
119a60053b8SBram Moolenaar
120a60053b8SBram Moolenaar  call term_sendkeys(buf, "\<Tab>")
121a60053b8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_wildmenu_2', {})
122a60053b8SBram Moolenaar
123a60053b8SBram Moolenaar  call term_sendkeys(buf, "\<Tab>")
124a60053b8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_wildmenu_3', {})
125a60053b8SBram Moolenaar
12639f3b141SBram Moolenaar  call term_sendkeys(buf, "\<Tab>\<Tab>")
127a60053b8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_wildmenu_4', {})
128a60053b8SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
129a60053b8SBram Moolenaar
130a60053b8SBram Moolenaar  " clean up
131a60053b8SBram Moolenaar  call StopVimInTerminal(buf)
132a60053b8SBram Moolenaar  call delete('XTest_wildmenu')
133a60053b8SBram Moolenaarendfunc
134a60053b8SBram Moolenaar
135cf5fdf7dSBram Moolenaarfunc Test_map_completion()
136cf5fdf7dSBram Moolenaar  call feedkeys(":map <unique> <si\<Tab>\<Home>\"\<CR>", 'xt')
137cf5fdf7dSBram Moolenaar  call assert_equal('"map <unique> <silent>', getreg(':'))
138cf5fdf7dSBram Moolenaar  call feedkeys(":map <script> <un\<Tab>\<Home>\"\<CR>", 'xt')
139cf5fdf7dSBram Moolenaar  call assert_equal('"map <script> <unique>', getreg(':'))
140cf5fdf7dSBram Moolenaar  call feedkeys(":map <expr> <sc\<Tab>\<Home>\"\<CR>", 'xt')
141cf5fdf7dSBram Moolenaar  call assert_equal('"map <expr> <script>', getreg(':'))
142cf5fdf7dSBram Moolenaar  call feedkeys(":map <buffer> <e\<Tab>\<Home>\"\<CR>", 'xt')
143cf5fdf7dSBram Moolenaar  call assert_equal('"map <buffer> <expr>', getreg(':'))
144cf5fdf7dSBram Moolenaar  call feedkeys(":map <nowait> <b\<Tab>\<Home>\"\<CR>", 'xt')
145cf5fdf7dSBram Moolenaar  call assert_equal('"map <nowait> <buffer>', getreg(':'))
146cf5fdf7dSBram Moolenaar  call feedkeys(":map <special> <no\<Tab>\<Home>\"\<CR>", 'xt')
147cf5fdf7dSBram Moolenaar  call assert_equal('"map <special> <nowait>', getreg(':'))
148cf5fdf7dSBram Moolenaar  call feedkeys(":map <silent> <sp\<Tab>\<Home>\"\<CR>", 'xt')
149cf5fdf7dSBram Moolenaar  call assert_equal('"map <silent> <special>', getreg(':'))
1502cb9f025SBram Moolenaar
1511776a28eSBram Moolenaar  map <Middle>x middle
1521776a28eSBram Moolenaar
1532cb9f025SBram Moolenaar  map ,f commaf
1542cb9f025SBram Moolenaar  map ,g commaf
1551776a28eSBram Moolenaar  map <Left> left
1561776a28eSBram Moolenaar  map <A-Left>x shiftleft
1572cb9f025SBram Moolenaar  call feedkeys(":map ,\<Tab>\<Home>\"\<CR>", 'xt')
1582cb9f025SBram Moolenaar  call assert_equal('"map ,f', getreg(':'))
1592cb9f025SBram Moolenaar  call feedkeys(":map ,\<Tab>\<Tab>\<Home>\"\<CR>", 'xt')
1602cb9f025SBram Moolenaar  call assert_equal('"map ,g', getreg(':'))
1611776a28eSBram Moolenaar  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
1621776a28eSBram Moolenaar  call assert_equal('"map <Left>', getreg(':'))
1631776a28eSBram Moolenaar  call feedkeys(":map <A-Left>\<Tab>\<Home>\"\<CR>", 'xt')
16492b9e60cSBram Moolenaar  call assert_equal("\"map <A-Left>\<Tab>", getreg(':'))
1652cb9f025SBram Moolenaar  unmap ,f
1662cb9f025SBram Moolenaar  unmap ,g
1671776a28eSBram Moolenaar  unmap <Left>
1681776a28eSBram Moolenaar  unmap <A-Left>x
1692cb9f025SBram Moolenaar
1702cb9f025SBram Moolenaar  set cpo-=< cpo-=B cpo-=k
1712cb9f025SBram Moolenaar  map <Left> left
1722cb9f025SBram Moolenaar  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
1732cb9f025SBram Moolenaar  call assert_equal('"map <Left>', getreg(':'))
1741776a28eSBram Moolenaar  call feedkeys(":map <M\<Tab>\<Home>\"\<CR>", 'xt')
17592b9e60cSBram Moolenaar  call assert_equal("\"map <M\<Tab>", getreg(':'))
1762cb9f025SBram Moolenaar  unmap <Left>
1772cb9f025SBram Moolenaar
1782cb9f025SBram Moolenaar  set cpo+=<
1792cb9f025SBram Moolenaar  map <Left> left
18061df0c79SBram Moolenaar  exe "set t_k6=\<Esc>[17~"
18161df0c79SBram Moolenaar  call feedkeys(":map \<Esc>[17~x f6x\<CR>", 'xt')
1822cb9f025SBram Moolenaar  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
1832cb9f025SBram Moolenaar  call assert_equal('"map <Left>', getreg(':'))
184510671a0SBram Moolenaar  if !has('gui_running')
18561df0c79SBram Moolenaar    call feedkeys(":map \<Esc>[17~\<Tab>\<Home>\"\<CR>", 'xt')
18661df0c79SBram Moolenaar    call assert_equal("\"map <F6>x", getreg(':'))
187510671a0SBram Moolenaar  endif
1882cb9f025SBram Moolenaar  unmap <Left>
18961df0c79SBram Moolenaar  call feedkeys(":unmap \<Esc>[17~x\<CR>", 'xt')
1902cb9f025SBram Moolenaar  set cpo-=<
1912cb9f025SBram Moolenaar
1922cb9f025SBram Moolenaar  set cpo+=B
1932cb9f025SBram Moolenaar  map <Left> left
1942cb9f025SBram Moolenaar  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
1952cb9f025SBram Moolenaar  call assert_equal('"map <Left>', getreg(':'))
1962cb9f025SBram Moolenaar  unmap <Left>
1972cb9f025SBram Moolenaar  set cpo-=B
1982cb9f025SBram Moolenaar
1992cb9f025SBram Moolenaar  set cpo+=k
2002cb9f025SBram Moolenaar  map <Left> left
2012cb9f025SBram Moolenaar  call feedkeys(":map <L\<Tab>\<Home>\"\<CR>", 'xt')
2022cb9f025SBram Moolenaar  call assert_equal('"map <Left>', getreg(':'))
2032cb9f025SBram Moolenaar  unmap <Left>
2042cb9f025SBram Moolenaar  set cpo-=k
2051776a28eSBram Moolenaar
206531be47aSBram Moolenaar  call assert_fails('call feedkeys(":map \\\\%(\<Tab>\<Home>\"\<CR>", "xt")', 'E53:')
207531be47aSBram Moolenaar
2081776a28eSBram Moolenaar  unmap <Middle>x
2091776a28eSBram Moolenaar  set cpo&vim
210cf5fdf7dSBram Moolenaarendfunc
211cf5fdf7dSBram Moolenaar
21215eedf1dSBram Moolenaarfunc Test_match_completion()
21315eedf1dSBram Moolenaar  hi Aardig ctermfg=green
21415eedf1dSBram Moolenaar  call feedkeys(":match \<Tab>\<Home>\"\<CR>", 'xt')
21515eedf1dSBram Moolenaar  call assert_equal('"match Aardig', getreg(':'))
21615eedf1dSBram Moolenaar  call feedkeys(":match \<S-Tab>\<Home>\"\<CR>", 'xt')
21715eedf1dSBram Moolenaar  call assert_equal('"match none', getreg(':'))
21815eedf1dSBram Moolenaarendfunc
21915eedf1dSBram Moolenaar
22015eedf1dSBram Moolenaarfunc Test_highlight_completion()
22115eedf1dSBram Moolenaar  hi Aardig ctermfg=green
22215eedf1dSBram Moolenaar  call feedkeys(":hi \<Tab>\<Home>\"\<CR>", 'xt')
22315eedf1dSBram Moolenaar  call assert_equal('"hi Aardig', getreg(':'))
224ea588154SBram Moolenaar  call feedkeys(":hi default \<Tab>\<Home>\"\<CR>", 'xt')
225ea588154SBram Moolenaar  call assert_equal('"hi default Aardig', getreg(':'))
226ea588154SBram Moolenaar  call feedkeys(":hi clear Aa\<Tab>\<Home>\"\<CR>", 'xt')
227ea588154SBram Moolenaar  call assert_equal('"hi clear Aardig', getreg(':'))
22815eedf1dSBram Moolenaar  call feedkeys(":hi li\<S-Tab>\<Home>\"\<CR>", 'xt')
22915eedf1dSBram Moolenaar  call assert_equal('"hi link', getreg(':'))
23015eedf1dSBram Moolenaar  call feedkeys(":hi d\<S-Tab>\<Home>\"\<CR>", 'xt')
23115eedf1dSBram Moolenaar  call assert_equal('"hi default', getreg(':'))
23215eedf1dSBram Moolenaar  call feedkeys(":hi c\<S-Tab>\<Home>\"\<CR>", 'xt')
23315eedf1dSBram Moolenaar  call assert_equal('"hi clear', getreg(':'))
23475e15670SBram Moolenaar  call feedkeys(":hi clear Aardig Aard\<Tab>\<C-B>\"\<CR>", 'xt')
23575e15670SBram Moolenaar  call assert_equal('"hi clear Aardig Aardig', getreg(':'))
23675e15670SBram Moolenaar  call feedkeys(":hi Aardig \<Tab>\<C-B>\"\<CR>", 'xt')
23775e15670SBram Moolenaar  call assert_equal("\"hi Aardig \t", getreg(':'))
238c96272e3SBram Moolenaar
239c96272e3SBram Moolenaar  " A cleared group does not show up in completions.
240c96272e3SBram Moolenaar  hi Anders ctermfg=green
241c96272e3SBram Moolenaar  call assert_equal(['Aardig', 'Anders'], getcompletion('A', 'highlight'))
242c96272e3SBram Moolenaar  hi clear Aardig
243c96272e3SBram Moolenaar  call assert_equal(['Anders'], getcompletion('A', 'highlight'))
244c96272e3SBram Moolenaar  hi clear Anders
245c96272e3SBram Moolenaar  call assert_equal([], getcompletion('A', 'highlight'))
24615eedf1dSBram Moolenaarendfunc
24715eedf1dSBram Moolenaar
24875e15670SBram Moolenaar" Test for command-line expansion of "hi Ni " (easter egg)
24975e15670SBram Moolenaarfunc Test_highlight_easter_egg()
25075e15670SBram Moolenaar  call test_override('ui_delay', 1)
25175e15670SBram Moolenaar  call feedkeys(":hi Ni \<Tab>\<C-B>\"\<CR>", 'xt')
25275e15670SBram Moolenaar  call assert_equal("\"hi Ni \<Tab>", @:)
25375e15670SBram Moolenaar  call test_override('ALL', 0)
25475e15670SBram Moolenaarendfunc
25575e15670SBram Moolenaar
256aa4d7323SBram Moolenaarfunc Test_getcompletion()
257aa4d7323SBram Moolenaar  let groupcount = len(getcompletion('', 'event'))
258aa4d7323SBram Moolenaar  call assert_true(groupcount > 0)
2594c313b13SBram Moolenaar  let matchcount = len('File'->getcompletion('event'))
260aa4d7323SBram Moolenaar  call assert_true(matchcount > 0)
261aa4d7323SBram Moolenaar  call assert_true(groupcount > matchcount)
262aa4d7323SBram Moolenaar
2630d3e24beSBram Moolenaar  if has('menu')
264aa4d7323SBram Moolenaar    source $VIMRUNTIME/menu.vim
265aa4d7323SBram Moolenaar    let matchcount = len(getcompletion('', 'menu'))
266aa4d7323SBram Moolenaar    call assert_true(matchcount > 0)
2670d3e24beSBram Moolenaar    call assert_equal(['File.'], getcompletion('File', 'menu'))
268aa4d7323SBram Moolenaar    call assert_true(matchcount > 0)
2690d3e24beSBram Moolenaar    let matchcount = len(getcompletion('File.', 'menu'))
2700d3e24beSBram Moolenaar    call assert_true(matchcount > 0)
2710d3e24beSBram Moolenaar  endif
272aa4d7323SBram Moolenaar
273c1fb7631SBram Moolenaar  let l = getcompletion('v:n', 'var')
274c1fb7631SBram Moolenaar  call assert_true(index(l, 'v:null') >= 0)
275b56195edSBram Moolenaar  let l = getcompletion('v:notexists', 'var')
276b56195edSBram Moolenaar  call assert_equal([], l)
277c1fb7631SBram Moolenaar
278cd43effeSBram Moolenaar  args a.c b.c
279cd43effeSBram Moolenaar  let l = getcompletion('', 'arglist')
280cd43effeSBram Moolenaar  call assert_equal(['a.c', 'b.c'], l)
281cd43effeSBram Moolenaar  %argdelete
282cd43effeSBram Moolenaar
283c1fb7631SBram Moolenaar  let l = getcompletion('', 'augroup')
284c1fb7631SBram Moolenaar  call assert_true(index(l, 'END') >= 0)
285b56195edSBram Moolenaar  let l = getcompletion('blahblah', 'augroup')
286b56195edSBram Moolenaar  call assert_equal([], l)
287c1fb7631SBram Moolenaar
288c1fb7631SBram Moolenaar  let l = getcompletion('', 'behave')
289c1fb7631SBram Moolenaar  call assert_true(index(l, 'mswin') >= 0)
290b56195edSBram Moolenaar  let l = getcompletion('not', 'behave')
291b56195edSBram Moolenaar  call assert_equal([], l)
292c1fb7631SBram Moolenaar
293c1fb7631SBram Moolenaar  let l = getcompletion('', 'color')
294c1fb7631SBram Moolenaar  call assert_true(index(l, 'default') >= 0)
295b56195edSBram Moolenaar  let l = getcompletion('dirty', 'color')
296b56195edSBram Moolenaar  call assert_equal([], l)
297c1fb7631SBram Moolenaar
298c1fb7631SBram Moolenaar  let l = getcompletion('', 'command')
299c1fb7631SBram Moolenaar  call assert_true(index(l, 'sleep') >= 0)
300b56195edSBram Moolenaar  let l = getcompletion('awake', 'command')
301b56195edSBram Moolenaar  call assert_equal([], l)
302c1fb7631SBram Moolenaar
303c1fb7631SBram Moolenaar  let l = getcompletion('', 'dir')
304b56195edSBram Moolenaar  call assert_true(index(l, 'samples/') >= 0)
305b56195edSBram Moolenaar  let l = getcompletion('NoMatch', 'dir')
306b56195edSBram Moolenaar  call assert_equal([], l)
307c1fb7631SBram Moolenaar
308ae38a9dbSShougo Matsushita  if glob('~/*') !=# ''
309ae38a9dbSShougo Matsushita    let l = getcompletion('~/', 'dir')
310ae38a9dbSShougo Matsushita    call assert_true(l[0][0] ==# '~')
311ae38a9dbSShougo Matsushita  endif
312ae38a9dbSShougo Matsushita
313c1fb7631SBram Moolenaar  let l = getcompletion('exe', 'expression')
314c1fb7631SBram Moolenaar  call assert_true(index(l, 'executable(') >= 0)
315b56195edSBram Moolenaar  let l = getcompletion('kill', 'expression')
316b56195edSBram Moolenaar  call assert_equal([], l)
317c1fb7631SBram Moolenaar
318c1fb7631SBram Moolenaar  let l = getcompletion('tag', 'function')
319c1fb7631SBram Moolenaar  call assert_true(index(l, 'taglist(') >= 0)
320b56195edSBram Moolenaar  let l = getcompletion('paint', 'function')
321b56195edSBram Moolenaar  call assert_equal([], l)
322c1fb7631SBram Moolenaar
323b49edc11SBram Moolenaar  let Flambda = {-> 'hello'}
324b49edc11SBram Moolenaar  let l = getcompletion('', 'function')
325b49edc11SBram Moolenaar  let l = filter(l, {i, v -> v =~ 'lambda'})
326b56195edSBram Moolenaar  call assert_equal([], l)
327b49edc11SBram Moolenaar
328c1fb7631SBram Moolenaar  let l = getcompletion('run', 'file')
329c1fb7631SBram Moolenaar  call assert_true(index(l, 'runtest.vim') >= 0)
330b56195edSBram Moolenaar  let l = getcompletion('walk', 'file')
331b56195edSBram Moolenaar  call assert_equal([], l)
332e9d58a64SBram Moolenaar  set wildignore=*.vim
333e9d58a64SBram Moolenaar  let l = getcompletion('run', 'file', 1)
334e9d58a64SBram Moolenaar  call assert_true(index(l, 'runtest.vim') < 0)
335e9d58a64SBram Moolenaar  set wildignore&
336c1fb7631SBram Moolenaar
337c1fb7631SBram Moolenaar  let l = getcompletion('ha', 'filetype')
338c1fb7631SBram Moolenaar  call assert_true(index(l, 'hamster') >= 0)
339b56195edSBram Moolenaar  let l = getcompletion('horse', 'filetype')
340b56195edSBram Moolenaar  call assert_equal([], l)
341c1fb7631SBram Moolenaar
342c1fb7631SBram Moolenaar  let l = getcompletion('z', 'syntax')
343c1fb7631SBram Moolenaar  call assert_true(index(l, 'zimbu') >= 0)
344b56195edSBram Moolenaar  let l = getcompletion('emacs', 'syntax')
345b56195edSBram Moolenaar  call assert_equal([], l)
346c1fb7631SBram Moolenaar
347c1fb7631SBram Moolenaar  let l = getcompletion('jikes', 'compiler')
348c1fb7631SBram Moolenaar  call assert_true(index(l, 'jikes') >= 0)
349b56195edSBram Moolenaar  let l = getcompletion('break', 'compiler')
350b56195edSBram Moolenaar  call assert_equal([], l)
351c1fb7631SBram Moolenaar
352c1fb7631SBram Moolenaar  let l = getcompletion('last', 'help')
353c1fb7631SBram Moolenaar  call assert_true(index(l, ':tablast') >= 0)
354b56195edSBram Moolenaar  let l = getcompletion('giveup', 'help')
355b56195edSBram Moolenaar  call assert_equal([], l)
356c1fb7631SBram Moolenaar
357c1fb7631SBram Moolenaar  let l = getcompletion('time', 'option')
358c1fb7631SBram Moolenaar  call assert_true(index(l, 'timeoutlen') >= 0)
359b56195edSBram Moolenaar  let l = getcompletion('space', 'option')
360b56195edSBram Moolenaar  call assert_equal([], l)
361c1fb7631SBram Moolenaar
362c1fb7631SBram Moolenaar  let l = getcompletion('er', 'highlight')
363c1fb7631SBram Moolenaar  call assert_true(index(l, 'ErrorMsg') >= 0)
364b56195edSBram Moolenaar  let l = getcompletion('dark', 'highlight')
365b56195edSBram Moolenaar  call assert_equal([], l)
366c1fb7631SBram Moolenaar
3679e507ca8SBram Moolenaar  let l = getcompletion('', 'messages')
3689e507ca8SBram Moolenaar  call assert_true(index(l, 'clear') >= 0)
3699e507ca8SBram Moolenaar  let l = getcompletion('not', 'messages')
3709e507ca8SBram Moolenaar  call assert_equal([], l)
3719e507ca8SBram Moolenaar
372cae92dc3SBram Moolenaar  let l = getcompletion('', 'mapclear')
373cae92dc3SBram Moolenaar  call assert_true(index(l, '<buffer>') >= 0)
374cae92dc3SBram Moolenaar  let l = getcompletion('not', 'mapclear')
375cae92dc3SBram Moolenaar  call assert_equal([], l)
376cae92dc3SBram Moolenaar
37762fe66f2SBram Moolenaar  let l = getcompletion('.', 'shellcmd')
3786ab9e429SBram Moolenaar  call assert_equal(['./', '../'], filter(l, 'v:val =~ "\\./"'))
37962fe66f2SBram Moolenaar  call assert_equal(-1, match(l[2:], '^\.\.\?/$'))
38062fe66f2SBram Moolenaar  let root = has('win32') ? 'C:\\' : '/'
38162fe66f2SBram Moolenaar  let l = getcompletion(root, 'shellcmd')
38262fe66f2SBram Moolenaar  let expected = map(filter(glob(root . '*', 0, 1),
38362fe66f2SBram Moolenaar        \ 'isdirectory(v:val) || executable(v:val)'), 'isdirectory(v:val) ? v:val . ''/'' : v:val')
38462fe66f2SBram Moolenaar  call assert_equal(expected, l)
38562fe66f2SBram Moolenaar
386b650b987SBram Moolenaar  if has('cscope')
387b650b987SBram Moolenaar    let l = getcompletion('', 'cscope')
388b650b987SBram Moolenaar    let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
389b650b987SBram Moolenaar    call assert_equal(cmds, l)
390b650b987SBram Moolenaar    " using cmdline completion must not change the result
391b650b987SBram Moolenaar    call feedkeys(":cscope find \<c-d>\<c-c>", 'xt')
392b650b987SBram Moolenaar    let l = getcompletion('', 'cscope')
393b650b987SBram Moolenaar    call assert_equal(cmds, l)
394b650b987SBram Moolenaar    let keys = ['a', 'c', 'd', 'e', 'f', 'g', 'i', 's', 't']
395b650b987SBram Moolenaar    let l = getcompletion('find ', 'cscope')
396b650b987SBram Moolenaar    call assert_equal(keys, l)
397b650b987SBram Moolenaar  endif
398b650b987SBram Moolenaar
3997522f698SBram Moolenaar  if has('signs')
4007522f698SBram Moolenaar    sign define Testing linehl=Comment
4017522f698SBram Moolenaar    let l = getcompletion('', 'sign')
4027522f698SBram Moolenaar    let cmds = ['define', 'jump', 'list', 'place', 'undefine', 'unplace']
4037522f698SBram Moolenaar    call assert_equal(cmds, l)
4047522f698SBram Moolenaar    " using cmdline completion must not change the result
4057522f698SBram Moolenaar    call feedkeys(":sign list \<c-d>\<c-c>", 'xt')
4067522f698SBram Moolenaar    let l = getcompletion('', 'sign')
4077522f698SBram Moolenaar    call assert_equal(cmds, l)
4087522f698SBram Moolenaar    let l = getcompletion('list ', 'sign')
4097522f698SBram Moolenaar    call assert_equal(['Testing'], l)
4107522f698SBram Moolenaar  endif
4117522f698SBram Moolenaar
4121f1fd44eSBram Moolenaar  " Command line completion tests
4131f1fd44eSBram Moolenaar  let l = getcompletion('cd ', 'cmdline')
4141f1fd44eSBram Moolenaar  call assert_true(index(l, 'samples/') >= 0)
4151f1fd44eSBram Moolenaar  let l = getcompletion('cd NoMatch', 'cmdline')
4161f1fd44eSBram Moolenaar  call assert_equal([], l)
4171f1fd44eSBram Moolenaar  let l = getcompletion('let v:n', 'cmdline')
4181f1fd44eSBram Moolenaar  call assert_true(index(l, 'v:null') >= 0)
4191f1fd44eSBram Moolenaar  let l = getcompletion('let v:notexists', 'cmdline')
4201f1fd44eSBram Moolenaar  call assert_equal([], l)
4211f1fd44eSBram Moolenaar  let l = getcompletion('call tag', 'cmdline')
4221f1fd44eSBram Moolenaar  call assert_true(index(l, 'taglist(') >= 0)
4231f1fd44eSBram Moolenaar  let l = getcompletion('call paint', 'cmdline')
4241f1fd44eSBram Moolenaar  call assert_equal([], l)
4251f1fd44eSBram Moolenaar
426ae38a9dbSShougo Matsushita  func T(a, c, p)
427ae38a9dbSShougo Matsushita    return "oneA\noneB\noneC"
428ae38a9dbSShougo Matsushita  endfunc
429ae38a9dbSShougo Matsushita  command -nargs=1 -complete=custom,T MyCmd
430ae38a9dbSShougo Matsushita  let l = getcompletion('MyCmd ', 'cmdline')
431ae38a9dbSShougo Matsushita  call assert_equal(['oneA', 'oneB', 'oneC'], l)
432ae38a9dbSShougo Matsushita
433ae38a9dbSShougo Matsushita  delcommand MyCmd
434ae38a9dbSShougo Matsushita  delfunc T
435ae38a9dbSShougo Matsushita
436c1fb7631SBram Moolenaar  " For others test if the name is recognized.
43762fe66f2SBram Moolenaar  let names = ['buffer', 'environment', 'file_in_path', 'mapping', 'tag', 'tag_listfiles', 'user']
438c1fb7631SBram Moolenaar  if has('cmdline_hist')
439c1fb7631SBram Moolenaar    call add(names, 'history')
440c1fb7631SBram Moolenaar  endif
441c1fb7631SBram Moolenaar  if has('gettext')
442c1fb7631SBram Moolenaar    call add(names, 'locale')
443c1fb7631SBram Moolenaar  endif
444c1fb7631SBram Moolenaar  if has('profile')
445c1fb7631SBram Moolenaar    call add(names, 'syntime')
446c1fb7631SBram Moolenaar  endif
447c1fb7631SBram Moolenaar
448c1fb7631SBram Moolenaar  set tags=Xtags
449c1fb7631SBram Moolenaar  call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", "word\tfile\tcmd"], 'Xtags')
450c1fb7631SBram Moolenaar
451c1fb7631SBram Moolenaar  for name in names
452c1fb7631SBram Moolenaar    let matchcount = len(getcompletion('', name))
453c1fb7631SBram Moolenaar    call assert_true(matchcount >= 0, 'No matches for ' . name)
454c1fb7631SBram Moolenaar  endfor
455c1fb7631SBram Moolenaar
456c1fb7631SBram Moolenaar  call delete('Xtags')
4570331faf7SBram Moolenaar  set tags&
458c1fb7631SBram Moolenaar
459b7e24836SBram Moolenaar  call assert_fails("call getcompletion('\\\\@!\\\\@=', 'buffer')", 'E871:')
460aa4d7323SBram Moolenaar  call assert_fails('call getcompletion("", "burp")', 'E475:')
4611f1fd44eSBram Moolenaar  call assert_fails('call getcompletion("abc", [])', 'E475:')
462aa4d7323SBram Moolenaarendfunc
46373d4e4c8SBram Moolenaar
464038e09eeSBram Moolenaarfunc Test_fullcommand()
465038e09eeSBram Moolenaar  let tests = {
466038e09eeSBram Moolenaar        \ '':           '',
467038e09eeSBram Moolenaar        \ ':':          '',
468038e09eeSBram Moolenaar        \ ':::':        '',
469038e09eeSBram Moolenaar        \ ':::5':       '',
470038e09eeSBram Moolenaar        \ 'not_a_cmd':  '',
471038e09eeSBram Moolenaar        \ 'Check':      '',
472038e09eeSBram Moolenaar        \ 'syntax':     'syntax',
473038e09eeSBram Moolenaar        \ ':syntax':    'syntax',
474038e09eeSBram Moolenaar        \ '::::syntax': 'syntax',
475038e09eeSBram Moolenaar        \ 'sy':         'syntax',
476038e09eeSBram Moolenaar        \ 'syn':        'syntax',
477038e09eeSBram Moolenaar        \ 'synt':       'syntax',
478038e09eeSBram Moolenaar        \ ':sy':        'syntax',
479038e09eeSBram Moolenaar        \ '::::sy':     'syntax',
480038e09eeSBram Moolenaar        \ 'match':      'match',
481038e09eeSBram Moolenaar        \ '2match':     'match',
482038e09eeSBram Moolenaar        \ '3match':     'match',
483038e09eeSBram Moolenaar        \ 'aboveleft':  'aboveleft',
484038e09eeSBram Moolenaar        \ 'abo':        'aboveleft',
485038e09eeSBram Moolenaar        \ 's':          'substitute',
486038e09eeSBram Moolenaar        \ '5s':         'substitute',
487038e09eeSBram Moolenaar        \ ':5s':        'substitute',
488038e09eeSBram Moolenaar        \ "'<,'>s":     'substitute',
489038e09eeSBram Moolenaar        \ ":'<,'>s":    'substitute',
490038e09eeSBram Moolenaar        \ 'CheckUni':   'CheckUnix',
491038e09eeSBram Moolenaar        \ 'CheckUnix':  'CheckUnix',
492038e09eeSBram Moolenaar  \ }
493038e09eeSBram Moolenaar
494038e09eeSBram Moolenaar  for [in, want] in items(tests)
495038e09eeSBram Moolenaar    call assert_equal(want, fullcommand(in))
496038e09eeSBram Moolenaar  endfor
4974c8e8c6eSBram Moolenaar  call assert_equal('', fullcommand(test_null_string()))
498038e09eeSBram Moolenaar
499038e09eeSBram Moolenaar  call assert_equal('syntax', 'syn'->fullcommand())
50080c88eacSBram Moolenaar
50180c88eacSBram Moolenaar  command -buffer BufferLocalCommand :
50280c88eacSBram Moolenaar  command GlobalCommand :
50380c88eacSBram Moolenaar  call assert_equal('GlobalCommand', fullcommand('GlobalCom'))
50480c88eacSBram Moolenaar  call assert_equal('BufferLocalCommand', fullcommand('BufferL'))
50580c88eacSBram Moolenaar  delcommand BufferLocalCommand
50680c88eacSBram Moolenaar  delcommand GlobalCommand
507038e09eeSBram Moolenaarendfunc
508038e09eeSBram Moolenaar
5096ab9e429SBram Moolenaarfunc Test_shellcmd_completion()
5106ab9e429SBram Moolenaar  let save_path = $PATH
5116ab9e429SBram Moolenaar
5126ab9e429SBram Moolenaar  call mkdir('Xpathdir/Xpathsubdir', 'p')
5136ab9e429SBram Moolenaar  call writefile([''], 'Xpathdir/Xfile.exe')
5146ab9e429SBram Moolenaar  call setfperm('Xpathdir/Xfile.exe', 'rwx------')
5156ab9e429SBram Moolenaar
5166ab9e429SBram Moolenaar  " Set PATH to example directory without trailing slash.
5176ab9e429SBram Moolenaar  let $PATH = getcwd() . '/Xpathdir'
5186ab9e429SBram Moolenaar
5196ab9e429SBram Moolenaar  " Test for the ":!<TAB>" case.  Previously, this would include subdirs of
5206ab9e429SBram Moolenaar  " dirs in the PATH, even though they won't be executed.  We check that only
5216ab9e429SBram Moolenaar  " subdirs of the PWD and executables from the PATH are included in the
5226ab9e429SBram Moolenaar  " suggestions.
5236ab9e429SBram Moolenaar  let actual = getcompletion('X', 'shellcmd')
5246ab9e429SBram Moolenaar  let expected = map(filter(glob('*', 0, 1), 'isdirectory(v:val) && v:val[0] == "X"'), 'v:val . "/"')
5256ab9e429SBram Moolenaar  call insert(expected, 'Xfile.exe')
5266ab9e429SBram Moolenaar  call assert_equal(expected, actual)
5276ab9e429SBram Moolenaar
5286ab9e429SBram Moolenaar  call delete('Xpathdir', 'rf')
5296ab9e429SBram Moolenaar  let $PATH = save_path
5306ab9e429SBram Moolenaarendfunc
5316ab9e429SBram Moolenaar
53273d4e4c8SBram Moolenaarfunc Test_expand_star_star()
53373d4e4c8SBram Moolenaar  call mkdir('a/b', 'p')
53473d4e4c8SBram Moolenaar  call writefile(['asdfasdf'], 'a/b/fileXname')
53573d4e4c8SBram Moolenaar  call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt')
53673d4e4c8SBram Moolenaar  call assert_equal('find a/b/fileXname', getreg(':'))
5371773ddfdSBram Moolenaar  bwipe!
53873d4e4c8SBram Moolenaar  call delete('a', 'rf')
53973d4e4c8SBram Moolenaarendfunc
54021efc363SBram Moolenaar
54159cb041dSBram Moolenaarfunc Test_cmdline_paste()
54221efc363SBram Moolenaar  let @a = "def"
54321efc363SBram Moolenaar  call feedkeys(":abc \<C-R>a ghi\<C-B>\"\<CR>", 'tx')
54421efc363SBram Moolenaar  call assert_equal('"abc def ghi', @:)
54521efc363SBram Moolenaar
54621efc363SBram Moolenaar  new
54721efc363SBram Moolenaar  call setline(1, 'asdf.x /tmp/some verylongword a;b-c*d ')
54821efc363SBram Moolenaar
54921efc363SBram Moolenaar  call feedkeys(":aaa \<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
55021efc363SBram Moolenaar  call assert_equal('"aaa asdf bbb', @:)
55121efc363SBram Moolenaar
55221efc363SBram Moolenaar  call feedkeys("ft:aaa \<C-R>\<C-F> bbb\<C-B>\"\<CR>", 'tx')
55321efc363SBram Moolenaar  call assert_equal('"aaa /tmp/some bbb', @:)
55421efc363SBram Moolenaar
555e2c8d839SBram Moolenaar  call feedkeys(":aaa \<C-R>\<C-L> bbb\<C-B>\"\<CR>", 'tx')
556e2c8d839SBram Moolenaar  call assert_equal('"aaa '.getline(1).' bbb', @:)
557e2c8d839SBram Moolenaar
55821efc363SBram Moolenaar  set incsearch
55921efc363SBram Moolenaar  call feedkeys("fy:aaa veryl\<C-R>\<C-W> bbb\<C-B>\"\<CR>", 'tx')
56021efc363SBram Moolenaar  call assert_equal('"aaa verylongword bbb', @:)
56121efc363SBram Moolenaar
56221efc363SBram Moolenaar  call feedkeys("f;:aaa \<C-R>\<C-A> bbb\<C-B>\"\<CR>", 'tx')
56321efc363SBram Moolenaar  call assert_equal('"aaa a;b-c*d bbb', @:)
564eaaa9bbdSBram Moolenaar
565eaaa9bbdSBram Moolenaar  call feedkeys(":\<C-\>etoupper(getline(1))\<CR>\<C-B>\"\<CR>", 'tx')
566eaaa9bbdSBram Moolenaar  call assert_equal('"ASDF.X /TMP/SOME VERYLONGWORD A;B-C*D ', @:)
56721efc363SBram Moolenaar  bwipe!
56872532d35SBram Moolenaar
56972532d35SBram Moolenaar  " Error while typing a command used to cause that it was not executed
57072532d35SBram Moolenaar  " in the end.
57172532d35SBram Moolenaar  new
57272532d35SBram Moolenaar  try
57372532d35SBram Moolenaar    call feedkeys(":file \<C-R>%Xtestfile\<CR>", 'tx')
57472532d35SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E32/
57572532d35SBram Moolenaar    " ignore error E32
57672532d35SBram Moolenaar  endtry
57772532d35SBram Moolenaar  call assert_equal("Xtestfile", bufname("%"))
5788d588cceSBram Moolenaar
579578fe947SBram Moolenaar  " Try to paste an invalid register using <C-R>
580578fe947SBram Moolenaar  call feedkeys(":\"one\<C-R>\<C-X>two\<CR>", 'xt')
581578fe947SBram Moolenaar  call assert_equal('"onetwo', @:)
582578fe947SBram Moolenaar
58391ffc8a5SBram Moolenaar  " Test for pasting register containing CTRL-H using CTRL-R and CTRL-R CTRL-R
584578fe947SBram Moolenaar  let @a = "xy\<C-H>z"
585578fe947SBram Moolenaar  call feedkeys(":\"\<C-R>a\<CR>", 'xt')
586578fe947SBram Moolenaar  call assert_equal('"xz', @:)
58791ffc8a5SBram Moolenaar  call feedkeys(":\"\<C-R>\<C-R>a\<CR>", 'xt')
58891ffc8a5SBram Moolenaar  call assert_equal("\"xy\<C-H>z", @:)
589578fe947SBram Moolenaar  call feedkeys(":\"\<C-R>\<C-O>a\<CR>", 'xt')
590578fe947SBram Moolenaar  call assert_equal("\"xy\<C-H>z", @:)
591578fe947SBram Moolenaar
59291ffc8a5SBram Moolenaar  " Test for pasting register containing CTRL-V using CTRL-R and CTRL-R CTRL-R
59391ffc8a5SBram Moolenaar  let @a = "xy\<C-V>z"
59491ffc8a5SBram Moolenaar  call feedkeys(":\"\<C-R>=@a\<CR>\<cr>", 'xt')
59591ffc8a5SBram Moolenaar  call assert_equal('"xyz', @:)
59691ffc8a5SBram Moolenaar  call feedkeys(":\"\<C-R>\<C-R>=@a\<CR>\<cr>", 'xt')
59791ffc8a5SBram Moolenaar  call assert_equal("\"xy\<C-V>z", @:)
59891ffc8a5SBram Moolenaar
599578fe947SBram Moolenaar  call assert_beeps('call feedkeys(":\<C-R>=\<C-R>=\<Esc>", "xt")')
600578fe947SBram Moolenaar
60172532d35SBram Moolenaar  bwipe!
60221efc363SBram Moolenaarendfunc
603eaaa9bbdSBram Moolenaar
60459cb041dSBram Moolenaarfunc Test_cmdline_remove_char()
60559cb041dSBram Moolenaar  let encoding_save = &encoding
60659cb041dSBram Moolenaar
60759cb041dSBram Moolenaar  for e in ['utf8', 'latin1']
60859cb041dSBram Moolenaar    exe 'set encoding=' . e
60959cb041dSBram Moolenaar
610eaaa9bbdSBram Moolenaar    call feedkeys(":abc def\<S-Left>\<Del>\<C-B>\"\<CR>", 'tx')
61159cb041dSBram Moolenaar    call assert_equal('"abc ef', @:, e)
612eaaa9bbdSBram Moolenaar
613eaaa9bbdSBram Moolenaar    call feedkeys(":abc def\<S-Left>\<BS>\<C-B>\"\<CR>", 'tx')
614eaaa9bbdSBram Moolenaar    call assert_equal('"abcdef', @:)
615eaaa9bbdSBram Moolenaar
616eaaa9bbdSBram Moolenaar    call feedkeys(":abc def ghi\<S-Left>\<C-W>\<C-B>\"\<CR>", 'tx')
61759cb041dSBram Moolenaar    call assert_equal('"abc ghi', @:, e)
618eaaa9bbdSBram Moolenaar
619eaaa9bbdSBram Moolenaar    call feedkeys(":abc def\<S-Left>\<C-U>\<C-B>\"\<CR>", 'tx')
62059cb041dSBram Moolenaar    call assert_equal('"def', @:, e)
62159cb041dSBram Moolenaar  endfor
62259cb041dSBram Moolenaar
62359cb041dSBram Moolenaar  let &encoding = encoding_save
62459cb041dSBram Moolenaarendfunc
62559cb041dSBram Moolenaar
62659cb041dSBram Moolenaarfunc Test_cmdline_keymap_ctrl_hat()
6276d91bcb4SBram Moolenaar  CheckFeature keymap
62859cb041dSBram Moolenaar
62959cb041dSBram Moolenaar  set keymap=esperanto
63059cb041dSBram Moolenaar  call feedkeys(":\"Jxauxdo \<C-^>Jxauxdo \<C-^>Jxauxdo\<CR>", 'tx')
63159cb041dSBram Moolenaar  call assert_equal('"Jxauxdo Ĵaŭdo Jxauxdo', @:)
63259cb041dSBram Moolenaar  set keymap=
633eaaa9bbdSBram Moolenaarendfunc
634fe38b494SBram Moolenaar
635f1f6f3f7SBram Moolenaarfunc Test_illegal_address1()
636fe38b494SBram Moolenaar  new
637fe38b494SBram Moolenaar  2;'(
638fe38b494SBram Moolenaar  2;')
639fe38b494SBram Moolenaar  quit
640fe38b494SBram Moolenaarendfunc
641ba47b51fSBram Moolenaar
642f1f6f3f7SBram Moolenaarfunc Test_illegal_address2()
643f1f6f3f7SBram Moolenaar  call writefile(['c', 'x', '  x', '.', '1;y'], 'Xtest.vim')
644f1f6f3f7SBram Moolenaar  new
645f1f6f3f7SBram Moolenaar  source Xtest.vim
646f1f6f3f7SBram Moolenaar  " Trigger calling validate_cursor()
647f1f6f3f7SBram Moolenaar  diffsp Xtest.vim
648f1f6f3f7SBram Moolenaar  quit!
649f1f6f3f7SBram Moolenaar  bwipe!
650f1f6f3f7SBram Moolenaar  call delete('Xtest.vim')
651f1f6f3f7SBram Moolenaarendfunc
652f1f6f3f7SBram Moolenaar
653ba47b51fSBram Moolenaarfunc Test_cmdline_complete_wildoptions()
654ba47b51fSBram Moolenaar  help
655ba47b51fSBram Moolenaar  call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
656ba47b51fSBram Moolenaar  let a = join(sort(split(@:)),' ')
657ba47b51fSBram Moolenaar  set wildoptions=tagfile
658ba47b51fSBram Moolenaar  call feedkeys(":tag /\<c-a>\<c-b>\"\<cr>", 'tx')
659ba47b51fSBram Moolenaar  let b = join(sort(split(@:)),' ')
660ba47b51fSBram Moolenaar  call assert_equal(a, b)
661ba47b51fSBram Moolenaar  bw!
662ba47b51fSBram Moolenaarendfunc
663cbf20fbcSBram Moolenaar
664a33ddbbdSBram Moolenaarfunc Test_cmdline_complete_user_cmd()
665a33ddbbdSBram Moolenaar  command! -complete=color -nargs=1 Foo :
666a33ddbbdSBram Moolenaar  call feedkeys(":Foo \<Tab>\<Home>\"\<cr>", 'tx')
667a33ddbbdSBram Moolenaar  call assert_equal('"Foo blue', @:)
668a33ddbbdSBram Moolenaar  call feedkeys(":Foo b\<Tab>\<Home>\"\<cr>", 'tx')
669a33ddbbdSBram Moolenaar  call assert_equal('"Foo blue', @:)
670a33ddbbdSBram Moolenaar  delcommand Foo
671a33ddbbdSBram Moolenaarendfunc
672a33ddbbdSBram Moolenaar
673cc390ff5SBram Moolenaarfunc s:ScriptLocalFunction()
674cc390ff5SBram Moolenaar  echo 'yes'
675cc390ff5SBram Moolenaarendfunc
676cc390ff5SBram Moolenaar
677cc390ff5SBram Moolenaarfunc Test_cmdline_complete_user_func()
678cc390ff5SBram Moolenaar  call feedkeys(":func Test_cmdline_complete_user\<Tab>\<Home>\"\<cr>", 'tx')
6795aec755bSnaohiro ono  call assert_match('"func Test_cmdline_complete_user_', @:)
680cc390ff5SBram Moolenaar  call feedkeys(":func s:ScriptL\<Tab>\<Home>\"\<cr>", 'tx')
681cc390ff5SBram Moolenaar  call assert_match('"func <SNR>\d\+_ScriptLocalFunction', @:)
6821bb4de53SBram Moolenaar
6831bb4de53SBram Moolenaar  " g: prefix also works
6841bb4de53SBram Moolenaar  call feedkeys(":echo g:Test_cmdline_complete_user_f\<Tab>\<Home>\"\<cr>", 'tx')
6851bb4de53SBram Moolenaar  call assert_match('"echo g:Test_cmdline_complete_user_func', @:)
686069f9085SBram Moolenaar
687069f9085SBram Moolenaar  " using g: prefix does not result in just "g:" matches from a lambda
688069f9085SBram Moolenaar  let Fx = { a ->  a }
689069f9085SBram Moolenaar  call feedkeys(":echo g:\<Tab>\<Home>\"\<cr>", 'tx')
690069f9085SBram Moolenaar  call assert_match('"echo g:[A-Z]', @:)
6915aec755bSnaohiro ono
6925aec755bSnaohiro ono  " existence of script-local dict function does not break user function name
6935aec755bSnaohiro ono  " completion
6945aec755bSnaohiro ono  function s:a_dict_func() dict
6955aec755bSnaohiro ono  endfunction
6965aec755bSnaohiro ono  call feedkeys(":call Test_cmdline_complete_user\<Tab>\<Home>\"\<cr>", 'tx')
6975aec755bSnaohiro ono  call assert_match('"call Test_cmdline_complete_user_', @:)
6985aec755bSnaohiro ono  delfunction s:a_dict_func
699cc390ff5SBram Moolenaarendfunc
700cc390ff5SBram Moolenaar
7015f8f2d37SBram Moolenaarfunc Test_cmdline_complete_user_names()
7025f8f2d37SBram Moolenaar  if has('unix') && executable('whoami')
7035f8f2d37SBram Moolenaar    let whoami = systemlist('whoami')[0]
7045f8f2d37SBram Moolenaar    let first_letter = whoami[0]
7055f8f2d37SBram Moolenaar    if len(first_letter) > 0
7065f8f2d37SBram Moolenaar      " Trying completion of  :e ~x  where x is the first letter of
7075f8f2d37SBram Moolenaar      " the user name should complete to at least the user name.
7085f8f2d37SBram Moolenaar      call feedkeys(':e ~' . first_letter . "\<c-a>\<c-B>\"\<cr>", 'tx')
7095f8f2d37SBram Moolenaar      call assert_match('^"e \~.*\<' . whoami . '\>', @:)
7105f8f2d37SBram Moolenaar    endif
7116d91bcb4SBram Moolenaar  elseif has('win32')
7125f8f2d37SBram Moolenaar    " Just in case: check that the system has an Administrator account.
7135f8f2d37SBram Moolenaar    let names = system('net user')
7145f8f2d37SBram Moolenaar    if names =~ 'Administrator'
7155f8f2d37SBram Moolenaar      " Trying completion of  :e ~A  should complete to Administrator.
716346d2a35SBram Moolenaar      " There could be other names starting with "A" before Administrator.
7175f8f2d37SBram Moolenaar      call feedkeys(':e ~A' . "\<c-a>\<c-B>\"\<cr>", 'tx')
718346d2a35SBram Moolenaar      call assert_match('^"e \~.*Administrator', @:)
7195f8f2d37SBram Moolenaar    endif
7206d91bcb4SBram Moolenaar  else
7216d91bcb4SBram Moolenaar    throw 'Skipped: does not work on this platform'
7225f8f2d37SBram Moolenaar  endif
7235f8f2d37SBram Moolenaarendfunc
7245f8f2d37SBram Moolenaar
725297610baSBram Moolenaarfunc Test_cmdline_complete_bang()
7266d91bcb4SBram Moolenaar  CheckExecutable whoami
727297610baSBram Moolenaar  call feedkeys(":!whoam\<C-A>\<C-B>\"\<CR>", 'tx')
728297610baSBram Moolenaar  call assert_match('^".*\<whoami\>', @:)
729297610baSBram Moolenaarendfunc
730297610baSBram Moolenaar
7318b633135SBram Moolenaarfunc Test_cmdline_complete_languages()
73284cf6bd8SBram Moolenaar  let lang = substitute(execute('language time'), '.*"\(.*\)"$', '\1', '')
73384cf6bd8SBram Moolenaar  call assert_equal(lang, v:lc_time)
73484cf6bd8SBram Moolenaar
73584cf6bd8SBram Moolenaar  let lang = substitute(execute('language ctype'), '.*"\(.*\)"$', '\1', '')
73684cf6bd8SBram Moolenaar  call assert_equal(lang, v:ctype)
73784cf6bd8SBram Moolenaar
73884cf6bd8SBram Moolenaar  let lang = substitute(execute('language collate'), '.*"\(.*\)"$', '\1', '')
73984cf6bd8SBram Moolenaar  call assert_equal(lang, v:collate)
74084cf6bd8SBram Moolenaar
7415f8f2d37SBram Moolenaar  let lang = substitute(execute('language messages'), '.*"\(.*\)"$', '\1', '')
74284cf6bd8SBram Moolenaar  call assert_equal(lang, v:lang)
7435f8f2d37SBram Moolenaar
7445f8f2d37SBram Moolenaar  call feedkeys(":language \<c-a>\<c-b>\"\<cr>", 'tx')
74584cf6bd8SBram Moolenaar  call assert_match('^"language .*\<collate\>.*\<ctype\>.*\<messages\>.*\<time\>', @:)
7465f8f2d37SBram Moolenaar
7475f8f2d37SBram Moolenaar  call assert_match('^"language .*\<' . lang . '\>', @:)
7485f8f2d37SBram Moolenaar
7495f8f2d37SBram Moolenaar  call feedkeys(":language messages \<c-a>\<c-b>\"\<cr>", 'tx')
7505f8f2d37SBram Moolenaar  call assert_match('^"language .*\<' . lang . '\>', @:)
7515f8f2d37SBram Moolenaar
7525f8f2d37SBram Moolenaar  call feedkeys(":language ctype \<c-a>\<c-b>\"\<cr>", 'tx')
7535f8f2d37SBram Moolenaar  call assert_match('^"language .*\<' . lang . '\>', @:)
7545f8f2d37SBram Moolenaar
7555f8f2d37SBram Moolenaar  call feedkeys(":language time \<c-a>\<c-b>\"\<cr>", 'tx')
7565f8f2d37SBram Moolenaar  call assert_match('^"language .*\<' . lang . '\>', @:)
75784cf6bd8SBram Moolenaar
75884cf6bd8SBram Moolenaar  call feedkeys(":language collate \<c-a>\<c-b>\"\<cr>", 'tx')
75984cf6bd8SBram Moolenaar  call assert_match('^"language .*\<' . lang . '\>', @:)
7605f8f2d37SBram Moolenaarendfunc
7615f8f2d37SBram Moolenaar
762297610baSBram Moolenaarfunc Test_cmdline_complete_env_variable()
763297610baSBram Moolenaar  let $X_VIM_TEST_COMPLETE_ENV = 'foo'
764297610baSBram Moolenaar  call feedkeys(":edit $X_VIM_TEST_COMPLETE_E\<C-A>\<C-B>\"\<CR>", 'tx')
765297610baSBram Moolenaar  call assert_match('"edit $X_VIM_TEST_COMPLETE_ENV', @:)
766297610baSBram Moolenaar  unlet $X_VIM_TEST_COMPLETE_ENV
767297610baSBram Moolenaarendfunc
768297610baSBram Moolenaar
7694941b5efSBram Moolenaarfunc Test_cmdline_complete_expression()
7704941b5efSBram Moolenaar  let g:SomeVar = 'blah'
7714941b5efSBram Moolenaar  for cmd in ['exe', 'echo', 'echon', 'echomsg']
7724941b5efSBram Moolenaar    call feedkeys(":" .. cmd .. " SomeV\<Tab>\<C-B>\"\<CR>", 'tx')
7734941b5efSBram Moolenaar    call assert_match('"' .. cmd .. ' SomeVar', @:)
7744941b5efSBram Moolenaar    call feedkeys(":" .. cmd .. " foo SomeV\<Tab>\<C-B>\"\<CR>", 'tx')
7754941b5efSBram Moolenaar    call assert_match('"' .. cmd .. ' foo SomeVar', @:)
7764941b5efSBram Moolenaar  endfor
7774941b5efSBram Moolenaar  unlet g:SomeVar
7784941b5efSBram Moolenaarendfunc
7794941b5efSBram Moolenaar
78047016f57SBram Moolenaar" Unique function name for completion below
78147016f57SBram Moolenaarfunc s:WeirdFunc()
78247016f57SBram Moolenaar  echo 'weird'
78347016f57SBram Moolenaarendfunc
78447016f57SBram Moolenaar
78524ebd83eSBram Moolenaar" Test for various command-line completion
78624ebd83eSBram Moolenaarfunc Test_cmdline_complete_various()
78724ebd83eSBram Moolenaar  " completion for a command starting with a comment
78824ebd83eSBram Moolenaar  call feedkeys(": :|\"\<C-A>\<C-B>\"\<CR>", 'xt')
78924ebd83eSBram Moolenaar  call assert_equal("\" :|\"\<C-A>", @:)
79024ebd83eSBram Moolenaar
79124ebd83eSBram Moolenaar  " completion for a range followed by a comment
79224ebd83eSBram Moolenaar  call feedkeys(":1,2\"\<C-A>\<C-B>\"\<CR>", 'xt')
79324ebd83eSBram Moolenaar  call assert_equal("\"1,2\"\<C-A>", @:)
79424ebd83eSBram Moolenaar
79524ebd83eSBram Moolenaar  " completion for :k command
79624ebd83eSBram Moolenaar  call feedkeys(":ka\<C-A>\<C-B>\"\<CR>", 'xt')
79724ebd83eSBram Moolenaar  call assert_equal("\"ka\<C-A>", @:)
79824ebd83eSBram Moolenaar
79924ebd83eSBram Moolenaar  " completion for short version of the :s command
80024ebd83eSBram Moolenaar  call feedkeys(":sI \<C-A>\<C-B>\"\<CR>", 'xt')
80124ebd83eSBram Moolenaar  call assert_equal("\"sI \<C-A>", @:)
80224ebd83eSBram Moolenaar
80324ebd83eSBram Moolenaar  " completion for :write command
80424ebd83eSBram Moolenaar  call mkdir('Xdir')
80524ebd83eSBram Moolenaar  call writefile(['one'], 'Xdir/Xfile1')
80624ebd83eSBram Moolenaar  let save_cwd = getcwd()
80724ebd83eSBram Moolenaar  cd Xdir
80824ebd83eSBram Moolenaar  call feedkeys(":w >> \<C-A>\<C-B>\"\<CR>", 'xt')
80924ebd83eSBram Moolenaar  call assert_equal("\"w >> Xfile1", @:)
81024ebd83eSBram Moolenaar  call chdir(save_cwd)
81124ebd83eSBram Moolenaar  call delete('Xdir', 'rf')
81224ebd83eSBram Moolenaar
81324ebd83eSBram Moolenaar  " completion for :w ! and :r ! commands
81424ebd83eSBram Moolenaar  call feedkeys(":w !invalid_xyz_cmd\<C-A>\<C-B>\"\<CR>", 'xt')
81524ebd83eSBram Moolenaar  call assert_equal("\"w !invalid_xyz_cmd", @:)
81624ebd83eSBram Moolenaar  call feedkeys(":r !invalid_xyz_cmd\<C-A>\<C-B>\"\<CR>", 'xt')
81724ebd83eSBram Moolenaar  call assert_equal("\"r !invalid_xyz_cmd", @:)
81824ebd83eSBram Moolenaar
81924ebd83eSBram Moolenaar  " completion for :>> and :<< commands
82024ebd83eSBram Moolenaar  call feedkeys(":>>>\<C-A>\<C-B>\"\<CR>", 'xt')
82124ebd83eSBram Moolenaar  call assert_equal("\">>>\<C-A>", @:)
82224ebd83eSBram Moolenaar  call feedkeys(":<<<\<C-A>\<C-B>\"\<CR>", 'xt')
82324ebd83eSBram Moolenaar  call assert_equal("\"<<<\<C-A>", @:)
82424ebd83eSBram Moolenaar
82524ebd83eSBram Moolenaar  " completion for command with +cmd argument
82624ebd83eSBram Moolenaar  call feedkeys(":buffer +/pat Xabc\<C-A>\<C-B>\"\<CR>", 'xt')
82724ebd83eSBram Moolenaar  call assert_equal("\"buffer +/pat Xabc", @:)
82824ebd83eSBram Moolenaar  call feedkeys(":buffer +/pat\<C-A>\<C-B>\"\<CR>", 'xt')
82924ebd83eSBram Moolenaar  call assert_equal("\"buffer +/pat\<C-A>", @:)
83024ebd83eSBram Moolenaar
83124ebd83eSBram Moolenaar  " completion for a command with a trailing comment
83224ebd83eSBram Moolenaar  call feedkeys(":ls \" comment\<C-A>\<C-B>\"\<CR>", 'xt')
83324ebd83eSBram Moolenaar  call assert_equal("\"ls \" comment\<C-A>", @:)
83424ebd83eSBram Moolenaar
83524ebd83eSBram Moolenaar  " completion for a command with a trailing command
83624ebd83eSBram Moolenaar  call feedkeys(":ls | ls\<C-A>\<C-B>\"\<CR>", 'xt')
83724ebd83eSBram Moolenaar  call assert_equal("\"ls | ls", @:)
83824ebd83eSBram Moolenaar
83924ebd83eSBram Moolenaar  " completion for a command with an CTRL-V escaped argument
84024ebd83eSBram Moolenaar  call feedkeys(":ls \<C-V>\<C-V>a\<C-A>\<C-B>\"\<CR>", 'xt')
84124ebd83eSBram Moolenaar  call assert_equal("\"ls \<C-V>a\<C-A>", @:)
84224ebd83eSBram Moolenaar
84324ebd83eSBram Moolenaar  " completion for a command that doesn't take additional arguments
84424ebd83eSBram Moolenaar  call feedkeys(":all abc\<C-A>\<C-B>\"\<CR>", 'xt')
84524ebd83eSBram Moolenaar  call assert_equal("\"all abc\<C-A>", @:)
84624ebd83eSBram Moolenaar
84724ebd83eSBram Moolenaar  " completion for a command with a command modifier
84824ebd83eSBram Moolenaar  call feedkeys(":topleft new\<C-A>\<C-B>\"\<CR>", 'xt')
84924ebd83eSBram Moolenaar  call assert_equal("\"topleft new", @:)
85024ebd83eSBram Moolenaar
851e70e12b3SBram Moolenaar  " completion for vim9 and legacy commands
852e70e12b3SBram Moolenaar  call feedkeys(":vim9 call strle\<C-A>\<C-B>\"\<CR>", 'xt')
853e70e12b3SBram Moolenaar  call assert_equal("\"vim9 call strlen(", @:)
854e70e12b3SBram Moolenaar  call feedkeys(":legac call strle\<C-A>\<C-B>\"\<CR>", 'xt')
855e70e12b3SBram Moolenaar  call assert_equal("\"legac call strlen(", @:)
856e70e12b3SBram Moolenaar
8574ee9d8e0SBram Moolenaar  " completion for the :disassemble command
8584ee9d8e0SBram Moolenaar  call feedkeys(":disas deb\<C-A>\<C-B>\"\<CR>", 'xt')
8594ee9d8e0SBram Moolenaar  call assert_equal("\"disas debug", @:)
8604ee9d8e0SBram Moolenaar  call feedkeys(":disas pro\<C-A>\<C-B>\"\<CR>", 'xt')
8614ee9d8e0SBram Moolenaar  call assert_equal("\"disas profile", @:)
8624ee9d8e0SBram Moolenaar  call feedkeys(":disas debug Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
8634ee9d8e0SBram Moolenaar  call assert_equal("\"disas debug Test_cmdline_complete_various", @:)
8644ee9d8e0SBram Moolenaar  call feedkeys(":disas profile Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
8654ee9d8e0SBram Moolenaar  call assert_equal("\"disas profile Test_cmdline_complete_various", @:)
8669aecf79cSnaohiro ono  call feedkeys(":disas Test_cmdline_complete_var\<C-A>\<C-B>\"\<CR>", 'xt')
8679aecf79cSnaohiro ono  call assert_equal("\"disas Test_cmdline_complete_various", @:)
8684ee9d8e0SBram Moolenaar
86947016f57SBram Moolenaar  call feedkeys(":disas s:WeirdF\<C-A>\<C-B>\"\<CR>", 'xt')
8709aecf79cSnaohiro ono  call assert_match('"disas <SNR>\d\+_WeirdFunc', @:)
87147016f57SBram Moolenaar
872dfe04dbfSnaohiro ono  call feedkeys(":disas \<S-Tab>\<C-B>\"\<CR>", 'xt')
873dfe04dbfSnaohiro ono  call assert_match('"disas <SNR>\d\+_', @:)
874dfe04dbfSnaohiro ono  call feedkeys(":disas debug \<S-Tab>\<C-B>\"\<CR>", 'xt')
875dfe04dbfSnaohiro ono  call assert_match('"disas debug <SNR>\d\+_', @:)
876dfe04dbfSnaohiro ono
87724ebd83eSBram Moolenaar  " completion for the :match command
87824ebd83eSBram Moolenaar  call feedkeys(":match Search /pat/\<C-A>\<C-B>\"\<CR>", 'xt')
87924ebd83eSBram Moolenaar  call assert_equal("\"match Search /pat/\<C-A>", @:)
88024ebd83eSBram Moolenaar
88124ebd83eSBram Moolenaar  " completion for the :s command
88224ebd83eSBram Moolenaar  call feedkeys(":s/from/to/g\<C-A>\<C-B>\"\<CR>", 'xt')
88324ebd83eSBram Moolenaar  call assert_equal("\"s/from/to/g\<C-A>", @:)
88424ebd83eSBram Moolenaar
88524ebd83eSBram Moolenaar  " completion for the :dlist command
88624ebd83eSBram Moolenaar  call feedkeys(":dlist 10 /pat/ a\<C-A>\<C-B>\"\<CR>", 'xt')
88724ebd83eSBram Moolenaar  call assert_equal("\"dlist 10 /pat/ a\<C-A>", @:)
88824ebd83eSBram Moolenaar
88924ebd83eSBram Moolenaar  " completion for the :doautocmd command
89024ebd83eSBram Moolenaar  call feedkeys(":doautocmd User MyCmd a.c\<C-A>\<C-B>\"\<CR>", 'xt')
89124ebd83eSBram Moolenaar  call assert_equal("\"doautocmd User MyCmd a.c\<C-A>", @:)
89224ebd83eSBram Moolenaar
893afe8cf61SBram Moolenaar  " completion of autocmd group after comma
894afe8cf61SBram Moolenaar  call feedkeys(":doautocmd BufNew,BufEn\<C-A>\<C-B>\"\<CR>", 'xt')
895afe8cf61SBram Moolenaar  call assert_equal("\"doautocmd BufNew,BufEnter", @:)
896afe8cf61SBram Moolenaar
897bfb2bb16SDominique Pelle  " completion of file name in :doautocmd
898bfb2bb16SDominique Pelle  call writefile([], 'Xfile1')
899bfb2bb16SDominique Pelle  call writefile([], 'Xfile2')
900bfb2bb16SDominique Pelle  call feedkeys(":doautocmd BufEnter Xfi\<C-A>\<C-B>\"\<CR>", 'xt')
901bfb2bb16SDominique Pelle  call assert_equal("\"doautocmd BufEnter Xfile1 Xfile2", @:)
902bfb2bb16SDominique Pelle  call delete('Xfile1')
903bfb2bb16SDominique Pelle  call delete('Xfile2')
904bfb2bb16SDominique Pelle
90524ebd83eSBram Moolenaar  " completion for the :augroup command
906b4d82e2aSBram Moolenaar  augroup XTest.test
90724ebd83eSBram Moolenaar  augroup END
90824ebd83eSBram Moolenaar  call feedkeys(":augroup X\<C-A>\<C-B>\"\<CR>", 'xt')
909b4d82e2aSBram Moolenaar  call assert_equal("\"augroup XTest.test", @:)
910b4d82e2aSBram Moolenaar  call feedkeys(":au X\<C-A>\<C-B>\"\<CR>", 'xt')
911b4d82e2aSBram Moolenaar  call assert_equal("\"au XTest.test", @:)
912b4d82e2aSBram Moolenaar  augroup! XTest.test
91324ebd83eSBram Moolenaar
91424ebd83eSBram Moolenaar  " completion for the :unlet command
91524ebd83eSBram Moolenaar  call feedkeys(":unlet one two\<C-A>\<C-B>\"\<CR>", 'xt')
91624ebd83eSBram Moolenaar  call assert_equal("\"unlet one two", @:)
91724ebd83eSBram Moolenaar
91821c1a0c2SBram Moolenaar  " completion for the :buffer command with curlies
91939c47c31SBram Moolenaar  " FIXME: what should happen on MS-Windows?
92039c47c31SBram Moolenaar  if !has('win32')
92121c1a0c2SBram Moolenaar    edit \{someFile}
92221c1a0c2SBram Moolenaar    call feedkeys(":buf someFile\<C-A>\<C-B>\"\<CR>", 'xt')
92321c1a0c2SBram Moolenaar    call assert_equal("\"buf {someFile}", @:)
92421c1a0c2SBram Moolenaar    bwipe {someFile}
92539c47c31SBram Moolenaar  endif
92621c1a0c2SBram Moolenaar
92724ebd83eSBram Moolenaar  " completion for the :bdelete command
92824ebd83eSBram Moolenaar  call feedkeys(":bdel a b c\<C-A>\<C-B>\"\<CR>", 'xt')
92924ebd83eSBram Moolenaar  call assert_equal("\"bdel a b c", @:)
93024ebd83eSBram Moolenaar
93124ebd83eSBram Moolenaar  " completion for the :mapclear command
93224ebd83eSBram Moolenaar  call feedkeys(":mapclear \<C-A>\<C-B>\"\<CR>", 'xt')
93324ebd83eSBram Moolenaar  call assert_equal("\"mapclear <buffer>", @:)
93424ebd83eSBram Moolenaar
93524ebd83eSBram Moolenaar  " completion for user defined commands with menu names
93624ebd83eSBram Moolenaar  menu Test.foo :ls<CR>
93724ebd83eSBram Moolenaar  com -nargs=* -complete=menu MyCmd
93824ebd83eSBram Moolenaar  call feedkeys(":MyCmd Te\<C-A>\<C-B>\"\<CR>", 'xt')
93924ebd83eSBram Moolenaar  call assert_equal('"MyCmd Test.', @:)
94024ebd83eSBram Moolenaar  delcom MyCmd
94124ebd83eSBram Moolenaar  unmenu Test
94224ebd83eSBram Moolenaar
94324ebd83eSBram Moolenaar  " completion for user defined commands with mappings
94424ebd83eSBram Moolenaar  mapclear
94524ebd83eSBram Moolenaar  map <F3> :ls<CR>
94624ebd83eSBram Moolenaar  com -nargs=* -complete=mapping MyCmd
94724ebd83eSBram Moolenaar  call feedkeys(":MyCmd <F\<C-A>\<C-B>\"\<CR>", 'xt')
94824ebd83eSBram Moolenaar  call assert_equal('"MyCmd <F3>', @:)
94924ebd83eSBram Moolenaar  mapclear
95024ebd83eSBram Moolenaar  delcom MyCmd
95124ebd83eSBram Moolenaar
95224ebd83eSBram Moolenaar  " completion for :set path= with multiple backslashes
95324ebd83eSBram Moolenaar  call feedkeys(":set path=a\\\\\\ b\<C-A>\<C-B>\"\<CR>", 'xt')
95424ebd83eSBram Moolenaar  call assert_equal('"set path=a\\\ b', @:)
95524ebd83eSBram Moolenaar
95624ebd83eSBram Moolenaar  " completion for :set dir= with a backslash
95724ebd83eSBram Moolenaar  call feedkeys(":set dir=a\\ b\<C-A>\<C-B>\"\<CR>", 'xt')
95824ebd83eSBram Moolenaar  call assert_equal('"set dir=a\ b', @:)
95924ebd83eSBram Moolenaar
96024ebd83eSBram Moolenaar  " completion for the :py3 commands
96124ebd83eSBram Moolenaar  call feedkeys(":py3\<C-A>\<C-B>\"\<CR>", 'xt')
96224ebd83eSBram Moolenaar  call assert_equal('"py3 py3do py3file', @:)
96324ebd83eSBram Moolenaar
964df749a2bSBram Moolenaar  " completion for the :vim9 commands
965df749a2bSBram Moolenaar  call feedkeys(":vim9\<C-A>\<C-B>\"\<CR>", 'xt')
966df749a2bSBram Moolenaar  call assert_equal('"vim9cmd vim9script', @:)
967df749a2bSBram Moolenaar
96824ebd83eSBram Moolenaar  " redir @" is not the start of a comment. So complete after that
96924ebd83eSBram Moolenaar  call feedkeys(":redir @\" | cwin\t\<C-B>\"\<CR>", 'xt')
97024ebd83eSBram Moolenaar  call assert_equal('"redir @" | cwindow', @:)
97124ebd83eSBram Moolenaar
97224ebd83eSBram Moolenaar  " completion after a backtick
97324ebd83eSBram Moolenaar  call feedkeys(":e `a1b2c\t\<C-B>\"\<CR>", 'xt')
97424ebd83eSBram Moolenaar  call assert_equal('"e `a1b2c', @:)
97524ebd83eSBram Moolenaar
9768dfcce3aSBram Moolenaar  " completion for :language command with an invalid argument
9778dfcce3aSBram Moolenaar  call feedkeys(":language dummy \t\<C-B>\"\<CR>", 'xt')
9788dfcce3aSBram Moolenaar  call assert_equal("\"language dummy \t", @:)
9798dfcce3aSBram Moolenaar
9808dfcce3aSBram Moolenaar  " completion for commands after a :global command
9818b633135SBram Moolenaar  call feedkeys(":g/a\\xb/clearj\t\<C-B>\"\<CR>", 'xt')
9828b633135SBram Moolenaar  call assert_equal('"g/a\xb/clearjumps', @:)
9838dfcce3aSBram Moolenaar
9848dfcce3aSBram Moolenaar  " completion with ambiguous user defined commands
9858dfcce3aSBram Moolenaar  com TCmd1 echo 'TCmd1'
9868dfcce3aSBram Moolenaar  com TCmd2 echo 'TCmd2'
9878dfcce3aSBram Moolenaar  call feedkeys(":TCmd \t\<C-B>\"\<CR>", 'xt')
9888dfcce3aSBram Moolenaar  call assert_equal('"TCmd ', @:)
9898dfcce3aSBram Moolenaar  delcom TCmd1
9908dfcce3aSBram Moolenaar  delcom TCmd2
9918dfcce3aSBram Moolenaar
9928dfcce3aSBram Moolenaar  " completion after a range followed by a pipe (|) character
9938dfcce3aSBram Moolenaar  call feedkeys(":1,10 | chist\t\<C-B>\"\<CR>", 'xt')
9948dfcce3aSBram Moolenaar  call assert_equal('"1,10 | chistory', @:)
9959c929713SBram Moolenaar
9969c929713SBram Moolenaar  " use <Esc> as the 'wildchar' for completion
9979c929713SBram Moolenaar  set wildchar=<Esc>
9989c929713SBram Moolenaar  call feedkeys(":g/a\\xb/clearj\<Esc>\<C-B>\"\<CR>", 'xt')
9999c929713SBram Moolenaar  call assert_equal('"g/a\xb/clearjumps', @:)
10009c929713SBram Moolenaar  " pressing <esc> twice should cancel the command
10019c929713SBram Moolenaar  call feedkeys(":chist\<Esc>\<Esc>", 'xt')
10029c929713SBram Moolenaar  call assert_equal('"g/a\xb/clearjumps', @:)
10039c929713SBram Moolenaar  set wildchar&
100424ebd83eSBram Moolenaarendfunc
100524ebd83eSBram Moolenaar
1006c312b8b8SBram Moolenaarfunc Test_cmdline_write_alternatefile()
1007c312b8b8SBram Moolenaar  new
1008c312b8b8SBram Moolenaar  call setline('.', ['one', 'two'])
1009c312b8b8SBram Moolenaar  f foo.txt
1010c312b8b8SBram Moolenaar  new
1011c312b8b8SBram Moolenaar  f #-A
1012c312b8b8SBram Moolenaar  call assert_equal('foo.txt-A', expand('%'))
1013c312b8b8SBram Moolenaar  f #<-B.txt
1014c312b8b8SBram Moolenaar  call assert_equal('foo-B.txt', expand('%'))
1015c312b8b8SBram Moolenaar  f %<
1016c312b8b8SBram Moolenaar  call assert_equal('foo-B', expand('%'))
1017c312b8b8SBram Moolenaar  new
1018e2e4075fSBram Moolenaar  call assert_fails('f #<', 'E95:')
1019c312b8b8SBram Moolenaar  bw!
1020c312b8b8SBram Moolenaar  f foo-B.txt
1021c312b8b8SBram Moolenaar  f %<-A
1022c312b8b8SBram Moolenaar  call assert_equal('foo-B-A', expand('%'))
1023c312b8b8SBram Moolenaar  bw!
1024c312b8b8SBram Moolenaar  bw!
1025c312b8b8SBram Moolenaarendfunc
1026c312b8b8SBram Moolenaar
1027cbf20fbcSBram Moolenaar" using a leading backslash here
1028cbf20fbcSBram Moolenaarset cpo+=C
1029cbf20fbcSBram Moolenaar
1030cbf20fbcSBram Moolenaarfunc Test_cmdline_search_range()
1031cbf20fbcSBram Moolenaar  new
1032cbf20fbcSBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1033cbf20fbcSBram Moolenaar  /d
1034cbf20fbcSBram Moolenaar  1,\/s/b/B/
1035cbf20fbcSBram Moolenaar  call assert_equal('B', getline(2))
1036cbf20fbcSBram Moolenaar
1037cbf20fbcSBram Moolenaar  /a
1038cbf20fbcSBram Moolenaar  $
1039cbf20fbcSBram Moolenaar  \?,4s/c/C/
1040cbf20fbcSBram Moolenaar  call assert_equal('C', getline(3))
1041cbf20fbcSBram Moolenaar
1042cbf20fbcSBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1043cbf20fbcSBram Moolenaar  %s/c/c/
1044cbf20fbcSBram Moolenaar  1,\&s/b/B/
1045cbf20fbcSBram Moolenaar  call assert_equal('B', getline(2))
1046cbf20fbcSBram Moolenaar
1047f0cee197SBram Moolenaar  let @/ = 'apple'
10489b7bf9e9SBram Moolenaar  call assert_fails('\/print', ['E486:.*apple'])
1049f0cee197SBram Moolenaar
1050cbf20fbcSBram Moolenaar  bwipe!
1051cbf20fbcSBram Moolenaarendfunc
1052cbf20fbcSBram Moolenaar
1053f0cee197SBram Moolenaar" Test for the tick mark (') in an excmd range
1054f0cee197SBram Moolenaarfunc Test_tick_mark_in_range()
1055f0cee197SBram Moolenaar  " If only the tick is passed as a range and no command is specified, there
1056f0cee197SBram Moolenaar  " should not be an error
1057f0cee197SBram Moolenaar  call feedkeys(":'\<CR>", 'xt')
1058f0cee197SBram Moolenaar  call assert_equal("'", getreg(':'))
1059f0cee197SBram Moolenaar  call assert_fails("',print", 'E78:')
1060f0cee197SBram Moolenaarendfunc
1061f0cee197SBram Moolenaar
1062f0cee197SBram Moolenaar" Test for using a line number followed by a search pattern as range
1063f0cee197SBram Moolenaarfunc Test_lnum_and_pattern_as_range()
1064f0cee197SBram Moolenaar  new
1065f0cee197SBram Moolenaar  call setline(1, ['foo 1', 'foo 2', 'foo 3'])
1066f0cee197SBram Moolenaar  let @" = ''
1067f0cee197SBram Moolenaar  2/foo/yank
1068f0cee197SBram Moolenaar  call assert_equal("foo 3\n", @")
1069f0cee197SBram Moolenaar  call assert_equal(1, line('.'))
1070f0cee197SBram Moolenaar  close!
1071f0cee197SBram Moolenaarendfunc
1072f0cee197SBram Moolenaar
107365189a12SBram Moolenaar" Tests for getcmdline(), getcmdpos() and getcmdtype()
107465189a12SBram Moolenaarfunc Check_cmdline(cmdtype)
107565189a12SBram Moolenaar  call assert_equal('MyCmd a', getcmdline())
107665189a12SBram Moolenaar  call assert_equal(8, getcmdpos())
107765189a12SBram Moolenaar  call assert_equal(a:cmdtype, getcmdtype())
107865189a12SBram Moolenaar  return ''
107965189a12SBram Moolenaarendfunc
108065189a12SBram Moolenaar
108196e38a86SBram Moolenaarset cpo&
108296e38a86SBram Moolenaar
108365189a12SBram Moolenaarfunc Test_getcmdtype()
108465189a12SBram Moolenaar  call feedkeys(":MyCmd a\<C-R>=Check_cmdline(':')\<CR>\<Esc>", "xt")
108565189a12SBram Moolenaar
108665189a12SBram Moolenaar  let cmdtype = ''
108765189a12SBram Moolenaar  debuggreedy
108865189a12SBram Moolenaar  call feedkeys(":debug echo 'test'\<CR>", "t")
108965189a12SBram Moolenaar  call feedkeys("let cmdtype = \<C-R>=string(getcmdtype())\<CR>\<CR>", "t")
109065189a12SBram Moolenaar  call feedkeys("cont\<CR>", "xt")
109165189a12SBram Moolenaar  0debuggreedy
109265189a12SBram Moolenaar  call assert_equal('>', cmdtype)
109365189a12SBram Moolenaar
109465189a12SBram Moolenaar  call feedkeys("/MyCmd a\<C-R>=Check_cmdline('/')\<CR>\<Esc>", "xt")
109565189a12SBram Moolenaar  call feedkeys("?MyCmd a\<C-R>=Check_cmdline('?')\<CR>\<Esc>", "xt")
109665189a12SBram Moolenaar
109765189a12SBram Moolenaar  call feedkeys(":call input('Answer?')\<CR>", "t")
109831eb139bSBram Moolenaar  call feedkeys("MyCmd a\<C-R>=Check_cmdline('@')\<CR>\<C-C>", "xt")
109965189a12SBram Moolenaar
110065189a12SBram Moolenaar  call feedkeys(":insert\<CR>MyCmd a\<C-R>=Check_cmdline('-')\<CR>\<Esc>", "xt")
110165189a12SBram Moolenaar
110265189a12SBram Moolenaar  cnoremap <expr> <F6> Check_cmdline('=')
110365189a12SBram Moolenaar  call feedkeys("a\<C-R>=MyCmd a\<F6>\<Esc>\<Esc>", "xt")
110465189a12SBram Moolenaar  cunmap <F6>
11058d588cceSBram Moolenaar
11068d588cceSBram Moolenaar  call assert_equal('', getcmdline())
110765189a12SBram Moolenaarendfunc
110865189a12SBram Moolenaar
110981612b7aSBram Moolenaarfunc Test_getcmdwintype()
111021829c5fSBram Moolenaar  CheckFeature cmdwin
111121829c5fSBram Moolenaar
111281612b7aSBram Moolenaar  call feedkeys("q/:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
111381612b7aSBram Moolenaar  call assert_equal('/', a)
111481612b7aSBram Moolenaar
111581612b7aSBram Moolenaar  call feedkeys("q?:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
111681612b7aSBram Moolenaar  call assert_equal('?', a)
111781612b7aSBram Moolenaar
111881612b7aSBram Moolenaar  call feedkeys("q::let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
111981612b7aSBram Moolenaar  call assert_equal(':', a)
112081612b7aSBram Moolenaar
112181612b7aSBram Moolenaar  call feedkeys(":\<C-F>:let a = getcmdwintype()\<CR>:q\<CR>", 'x!')
112281612b7aSBram Moolenaar  call assert_equal(':', a)
112381612b7aSBram Moolenaar
112481612b7aSBram Moolenaar  call assert_equal('', getcmdwintype())
112581612b7aSBram Moolenaarendfunc
112681612b7aSBram Moolenaar
112796e38a86SBram Moolenaarfunc Test_getcmdwin_autocmd()
112821829c5fSBram Moolenaar  CheckFeature cmdwin
112921829c5fSBram Moolenaar
113096e38a86SBram Moolenaar  let s:seq = []
113196e38a86SBram Moolenaar  augroup CmdWin
113296e38a86SBram Moolenaar  au WinEnter * call add(s:seq, 'WinEnter ' .. win_getid())
113396e38a86SBram Moolenaar  au WinLeave * call add(s:seq, 'WinLeave ' .. win_getid())
113496e38a86SBram Moolenaar  au BufEnter * call add(s:seq, 'BufEnter ' .. bufnr())
113596e38a86SBram Moolenaar  au BufLeave * call add(s:seq, 'BufLeave ' .. bufnr())
113696e38a86SBram Moolenaar  au CmdWinEnter * call add(s:seq, 'CmdWinEnter ' .. win_getid())
113796e38a86SBram Moolenaar  au CmdWinLeave * call add(s:seq, 'CmdWinLeave ' .. win_getid())
113896e38a86SBram Moolenaar
113996e38a86SBram Moolenaar  let org_winid = win_getid()
114096e38a86SBram Moolenaar  let org_bufnr = bufnr()
114196e38a86SBram Moolenaar  call feedkeys("q::let a = getcmdwintype()\<CR>:let s:cmd_winid = win_getid()\<CR>:let s:cmd_bufnr = bufnr()\<CR>:q\<CR>", 'x!')
114296e38a86SBram Moolenaar  call assert_equal(':', a)
114396e38a86SBram Moolenaar  call assert_equal([
114496e38a86SBram Moolenaar	\ 'WinLeave ' .. org_winid,
114596e38a86SBram Moolenaar	\ 'WinEnter ' .. s:cmd_winid,
114696e38a86SBram Moolenaar	\ 'BufLeave ' .. org_bufnr,
114796e38a86SBram Moolenaar	\ 'BufEnter ' .. s:cmd_bufnr,
114896e38a86SBram Moolenaar	\ 'CmdWinEnter ' .. s:cmd_winid,
114996e38a86SBram Moolenaar	\ 'CmdWinLeave ' .. s:cmd_winid,
115096e38a86SBram Moolenaar	\ 'BufLeave ' .. s:cmd_bufnr,
115196e38a86SBram Moolenaar	\ 'WinLeave ' .. s:cmd_winid,
115296e38a86SBram Moolenaar	\ 'WinEnter ' .. org_winid,
115396e38a86SBram Moolenaar	\ 'BufEnter ' .. org_bufnr,
115496e38a86SBram Moolenaar	\ ], s:seq)
115596e38a86SBram Moolenaar
115696e38a86SBram Moolenaar  au!
115796e38a86SBram Moolenaar  augroup END
115896e38a86SBram Moolenaarendfunc
115996e38a86SBram Moolenaar
116052604f24SBram Moolenaarfunc Test_verbosefile()
116152604f24SBram Moolenaar  set verbosefile=Xlog
116252604f24SBram Moolenaar  echomsg 'foo'
116352604f24SBram Moolenaar  echomsg 'bar'
116452604f24SBram Moolenaar  set verbosefile=
116552604f24SBram Moolenaar  let log = readfile('Xlog')
116652604f24SBram Moolenaar  call assert_match("foo\nbar", join(log, "\n"))
116752604f24SBram Moolenaar  call delete('Xlog')
1168ad48e6c1SBram Moolenaar  call mkdir('Xdir')
11699b7bf9e9SBram Moolenaar  call assert_fails('set verbosefile=Xdir', ['E484:.*Xdir', 'E474:'])
1170ad48e6c1SBram Moolenaar  call delete('Xdir', 'd')
117152604f24SBram Moolenaarendfunc
117252604f24SBram Moolenaar
11734facea31SBram Moolenaarfunc Test_verbose_option()
11744facea31SBram Moolenaar  CheckScreendump
11754facea31SBram Moolenaar
11764facea31SBram Moolenaar  let lines =<< trim [SCRIPT]
11774facea31SBram Moolenaar    command DoSomething echo 'hello' |set ts=4 |let v = '123' |echo v
11784facea31SBram Moolenaar    call feedkeys("\r", 't') " for the hit-enter prompt
11794facea31SBram Moolenaar    set verbose=20
11804facea31SBram Moolenaar  [SCRIPT]
11814facea31SBram Moolenaar  call writefile(lines, 'XTest_verbose')
11824facea31SBram Moolenaar
11834facea31SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_verbose', {'rows': 12})
11846a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
11854facea31SBram Moolenaar  call term_sendkeys(buf, ":DoSomething\<CR>")
11864facea31SBram Moolenaar  call VerifyScreenDump(buf, 'Test_verbose_option_1', {})
11874facea31SBram Moolenaar
11884facea31SBram Moolenaar  " clean up
11894facea31SBram Moolenaar  call StopVimInTerminal(buf)
11904facea31SBram Moolenaar  call delete('XTest_verbose')
11914facea31SBram Moolenaarendfunc
11924facea31SBram Moolenaar
1193ff3be4feSBram Moolenaarfunc Test_setcmdpos()
1194ff3be4feSBram Moolenaar  func InsertTextAtPos(text, pos)
1195ff3be4feSBram Moolenaar    call assert_equal(0, setcmdpos(a:pos))
1196ff3be4feSBram Moolenaar    return a:text
1197ff3be4feSBram Moolenaar  endfunc
1198ff3be4feSBram Moolenaar
1199ff3be4feSBram Moolenaar  " setcmdpos() with position in the middle of the command line.
1200ff3be4feSBram Moolenaar  call feedkeys(":\"12\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
1201ff3be4feSBram Moolenaar  call assert_equal('"1ab2', @:)
1202ff3be4feSBram Moolenaar
1203ff3be4feSBram Moolenaar  call feedkeys(":\"12\<C-R>\<C-R>=InsertTextAtPos('a', 3)\<CR>b\<CR>", 'xt')
1204ff3be4feSBram Moolenaar  call assert_equal('"1b2a', @:)
1205ff3be4feSBram Moolenaar
1206ff3be4feSBram Moolenaar  " setcmdpos() with position beyond the end of the command line.
1207ff3be4feSBram Moolenaar  call feedkeys(":\"12\<C-B>\<C-R>=InsertTextAtPos('a', 10)\<CR>b\<CR>", 'xt')
1208ff3be4feSBram Moolenaar  call assert_equal('"12ab', @:)
1209ff3be4feSBram Moolenaar
1210ff3be4feSBram Moolenaar  " setcmdpos() returns 1 when not editing the command line.
1211196b4664SBram Moolenaar  call assert_equal(1, 3->setcmdpos())
1212ff3be4feSBram Moolenaarendfunc
1213ff3be4feSBram Moolenaar
1214c0676babSBram Moolenaarfunc Test_cmdline_overstrike()
121530276f2bSBram Moolenaar  let encodings = ['latin1', 'utf8']
1216c0676babSBram Moolenaar  let encoding_save = &encoding
1217c0676babSBram Moolenaar
1218c0676babSBram Moolenaar  for e in encodings
1219c0676babSBram Moolenaar    exe 'set encoding=' . e
1220c0676babSBram Moolenaar
1221c0676babSBram Moolenaar    " Test overstrike in the middle of the command line.
1222c0676babSBram Moolenaar    call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt')
122359cb041dSBram Moolenaar    call assert_equal('"0ab1cd4', @:, e)
1224c0676babSBram Moolenaar
1225c0676babSBram Moolenaar    " Test overstrike going beyond end of command line.
1226c0676babSBram Moolenaar    call feedkeys(":\"01234\<home>\<right>\<right>ab\<right>\<insert>cdefgh\<enter>", 'xt')
122759cb041dSBram Moolenaar    call assert_equal('"0ab1cdefgh', @:, e)
1228c0676babSBram Moolenaar
1229c0676babSBram Moolenaar    " Test toggling insert/overstrike a few times.
1230c0676babSBram Moolenaar    call feedkeys(":\"01234\<home>\<right>ab\<right>\<insert>cd\<right>\<insert>ef\<enter>", 'xt')
123159cb041dSBram Moolenaar    call assert_equal('"ab0cd3ef4', @:, e)
1232c0676babSBram Moolenaar  endfor
1233c0676babSBram Moolenaar
1234c0676babSBram Moolenaar  " Test overstrike with multi-byte characters.
1235c0676babSBram Moolenaar  call feedkeys(":\"テキストエディタ\<home>\<right>\<right>ab\<right>\<insert>cd\<enter>", 'xt')
123659cb041dSBram Moolenaar  call assert_equal('"テabキcdエディタ', @:, e)
1237c0676babSBram Moolenaar
1238c0676babSBram Moolenaar  let &encoding = encoding_save
1239c0676babSBram Moolenaarendfunc
1240a046b37cSBram Moolenaar
1241a046b37cSBram Moolenaarfunc Test_cmdwin_bug()
124221829c5fSBram Moolenaar  CheckFeature cmdwin
124321829c5fSBram Moolenaar
1244a046b37cSBram Moolenaar  let winid = win_getid()
1245a046b37cSBram Moolenaar  sp
1246a046b37cSBram Moolenaar  try
1247a046b37cSBram Moolenaar    call feedkeys("q::call win_gotoid(" .. winid .. ")\<CR>:q\<CR>", 'x!')
1248a046b37cSBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E11/
1249a046b37cSBram Moolenaar  endtry
1250a046b37cSBram Moolenaar  bw!
1251a046b37cSBram Moolenaarendfunc
125252410575SBram Moolenaar
12531c329c04SBram Moolenaarfunc Test_cmdwin_restore()
125421829c5fSBram Moolenaar  CheckFeature cmdwin
12551c329c04SBram Moolenaar  CheckScreendump
12561c329c04SBram Moolenaar
12571c329c04SBram Moolenaar  let lines =<< trim [SCRIPT]
1258*125ffd21SEgor Zvorykin    augroup vimHints | au! | augroup END
12591c329c04SBram Moolenaar    call setline(1, range(30))
12601c329c04SBram Moolenaar    2split
12611c329c04SBram Moolenaar  [SCRIPT]
12621c329c04SBram Moolenaar  call writefile(lines, 'XTest_restore')
12631c329c04SBram Moolenaar
12641c329c04SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_restore', {'rows': 12})
12656a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
12661c329c04SBram Moolenaar  call term_sendkeys(buf, "q:")
12671c329c04SBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdwin_restore_1', {})
12681c329c04SBram Moolenaar
12691c329c04SBram Moolenaar  " normal restore
12701c329c04SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
12711c329c04SBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdwin_restore_2', {})
12721c329c04SBram Moolenaar
12731c329c04SBram Moolenaar  " restore after setting 'lines' with one window
12741c329c04SBram Moolenaar  call term_sendkeys(buf, ":close\<CR>")
12751c329c04SBram Moolenaar  call term_sendkeys(buf, "q:")
12761c329c04SBram Moolenaar  call term_sendkeys(buf, ":set lines=18\<CR>")
12771c329c04SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
12781c329c04SBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdwin_restore_3', {})
12791c329c04SBram Moolenaar
12801c329c04SBram Moolenaar  " clean up
12811c329c04SBram Moolenaar  call StopVimInTerminal(buf)
12821c329c04SBram Moolenaar  call delete('XTest_restore')
12831c329c04SBram Moolenaarendfunc
12841c329c04SBram Moolenaar
1285e5b4486cSBram Moolenaarfunc Test_cmdwin_no_terminal()
1286e5b4486cSBram Moolenaar  CheckFeature cmdwin
1287e5b4486cSBram Moolenaar  CheckFeature terminal
12880b496484SBram Moolenaar  CheckNotMSWindows
1289e5b4486cSBram Moolenaar
1290e5b4486cSBram Moolenaar  let buf = RunVimInTerminal('', {'rows': 12})
1291e5b4486cSBram Moolenaar  call TermWait(buf, 50)
1292e5b4486cSBram Moolenaar  call term_sendkeys(buf, ":set cmdheight=2\<CR>")
1293e5b4486cSBram Moolenaar  call term_sendkeys(buf, "q:")
1294e5b4486cSBram Moolenaar  call term_sendkeys(buf, ":let buf = term_start(['/bin/echo'], #{hidden: 1})\<CR>")
1295e5b4486cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdwin_no_terminal', {})
1296e5b4486cSBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
1297e5b4486cSBram Moolenaar  call StopVimInTerminal(buf)
1298e5b4486cSBram Moolenaarendfunc
1299e5b4486cSBram Moolenaar
130052410575SBram Moolenaarfunc Test_buffers_lastused()
130152410575SBram Moolenaar  " check that buffers are sorted by time when wildmode has lastused
130252410575SBram Moolenaar  call test_settime(1550020000)	  " middle
130352410575SBram Moolenaar  edit bufa
130452410575SBram Moolenaar  enew
130552410575SBram Moolenaar  call test_settime(1550030000)	  " newest
130652410575SBram Moolenaar  edit bufb
130752410575SBram Moolenaar  enew
130852410575SBram Moolenaar  call test_settime(1550010000)	  " oldest
130952410575SBram Moolenaar  edit bufc
131052410575SBram Moolenaar  enew
131152410575SBram Moolenaar  call test_settime(0)
131252410575SBram Moolenaar  enew
131352410575SBram Moolenaar
131452410575SBram Moolenaar  call assert_equal(['bufa', 'bufb', 'bufc'],
131552410575SBram Moolenaar	\ getcompletion('', 'buffer'))
131652410575SBram Moolenaar
131752410575SBram Moolenaar  let save_wildmode = &wildmode
131852410575SBram Moolenaar  set wildmode=full:lastused
131952410575SBram Moolenaar
132052410575SBram Moolenaar  let cap = "\<c-r>=execute('let X=getcmdline()')\<cr>"
132152410575SBram Moolenaar  call feedkeys(":b \<tab>" .. cap .. "\<esc>", 'xt')
132252410575SBram Moolenaar  call assert_equal('b bufb', X)
132352410575SBram Moolenaar  call feedkeys(":b \<tab>\<tab>" .. cap .. "\<esc>", 'xt')
132452410575SBram Moolenaar  call assert_equal('b bufa', X)
132552410575SBram Moolenaar  call feedkeys(":b \<tab>\<tab>\<tab>" .. cap .. "\<esc>", 'xt')
132652410575SBram Moolenaar  call assert_equal('b bufc', X)
132752410575SBram Moolenaar  enew
132852410575SBram Moolenaar
132952410575SBram Moolenaar  edit other
133052410575SBram Moolenaar  call feedkeys(":b \<tab>" .. cap .. "\<esc>", 'xt')
133152410575SBram Moolenaar  call assert_equal('b bufb', X)
133252410575SBram Moolenaar  call feedkeys(":b \<tab>\<tab>" .. cap .. "\<esc>", 'xt')
133352410575SBram Moolenaar  call assert_equal('b bufa', X)
133452410575SBram Moolenaar  call feedkeys(":b \<tab>\<tab>\<tab>" .. cap .. "\<esc>", 'xt')
133552410575SBram Moolenaar  call assert_equal('b bufc', X)
133652410575SBram Moolenaar  enew
133752410575SBram Moolenaar
133852410575SBram Moolenaar  let &wildmode = save_wildmode
133952410575SBram Moolenaar
134052410575SBram Moolenaar  bwipeout bufa
134152410575SBram Moolenaar  bwipeout bufb
134252410575SBram Moolenaar  bwipeout bufc
134352410575SBram Moolenaarendfunc
134485db5475SBram Moolenaar
134585db5475SBram Moolenaarfunc Test_cmdwin_feedkeys()
134621829c5fSBram Moolenaar  CheckFeature cmdwin
134721829c5fSBram Moolenaar
134885db5475SBram Moolenaar  " This should not generate E488
134985db5475SBram Moolenaar  call feedkeys("q:\<CR>", 'x')
13501671f448SBram Moolenaar  " Using feedkeys with q: only should automatically close the cmd window
13511671f448SBram Moolenaar  call feedkeys('q:', 'xt')
13521671f448SBram Moolenaar  call assert_equal(1, winnr('$'))
13531671f448SBram Moolenaar  call assert_equal('', getcmdwintype())
135485db5475SBram Moolenaarendfunc
1355309976ecSBram Moolenaar
1356309976ecSBram Moolenaar" Tests for the issues fixed in 7.4.441.
1357309976ecSBram Moolenaar" When 'cedit' is set to Ctrl-C, opening the command window hangs Vim
1358309976ecSBram Moolenaarfunc Test_cmdwin_cedit()
135921829c5fSBram Moolenaar  CheckFeature cmdwin
136021829c5fSBram Moolenaar
1361309976ecSBram Moolenaar  exe "set cedit=\<C-c>"
1362309976ecSBram Moolenaar  normal! :
1363309976ecSBram Moolenaar  call assert_equal(1, winnr('$'))
1364309976ecSBram Moolenaar
1365309976ecSBram Moolenaar  let g:cmd_wintype = ''
1366309976ecSBram Moolenaar  func CmdWinType()
1367309976ecSBram Moolenaar      let g:cmd_wintype = getcmdwintype()
136800f3b4e0SBram Moolenaar      let g:wintype = win_gettype()
1369309976ecSBram Moolenaar      return ''
1370309976ecSBram Moolenaar  endfunc
1371309976ecSBram Moolenaar
1372309976ecSBram Moolenaar  call feedkeys("\<C-c>a\<C-R>=CmdWinType()\<CR>\<CR>")
1373309976ecSBram Moolenaar  echo input('')
1374309976ecSBram Moolenaar  call assert_equal('@', g:cmd_wintype)
137500f3b4e0SBram Moolenaar  call assert_equal('command', g:wintype)
1376309976ecSBram Moolenaar
1377309976ecSBram Moolenaar  set cedit&vim
1378309976ecSBram Moolenaar  delfunc CmdWinType
1379309976ecSBram Moolenaarendfunc
1380309976ecSBram Moolenaar
13818d588cceSBram Moolenaar" Test for CmdwinEnter autocmd
13828d588cceSBram Moolenaarfunc Test_cmdwin_autocmd()
138321829c5fSBram Moolenaar  CheckFeature cmdwin
138421829c5fSBram Moolenaar
13858d588cceSBram Moolenaar  augroup CmdWin
13868d588cceSBram Moolenaar    au!
1387b63f3ca6SBram Moolenaar    autocmd BufLeave * if &buftype == '' | update | endif
13888d588cceSBram Moolenaar    autocmd CmdwinEnter * startinsert
13898d588cceSBram Moolenaar  augroup END
13908d588cceSBram Moolenaar
13918d588cceSBram Moolenaar  call assert_fails('call feedkeys("q:xyz\<CR>", "xt")', 'E492:')
13928d588cceSBram Moolenaar  call assert_equal('xyz', @:)
13938d588cceSBram Moolenaar
13948d588cceSBram Moolenaar  augroup CmdWin
13958d588cceSBram Moolenaar    au!
13968d588cceSBram Moolenaar  augroup END
13978d588cceSBram Moolenaar  augroup! CmdWin
13988d588cceSBram Moolenaarendfunc
13998d588cceSBram Moolenaar
1400479950f6SBram Moolenaarfunc Test_cmdlineclear_tabenter()
1401479950f6SBram Moolenaar  CheckScreendump
1402479950f6SBram Moolenaar
1403479950f6SBram Moolenaar  let lines =<< trim [SCRIPT]
1404479950f6SBram Moolenaar    call setline(1, range(30))
1405479950f6SBram Moolenaar  [SCRIPT]
1406479950f6SBram Moolenaar
1407479950f6SBram Moolenaar  call writefile(lines, 'XtestCmdlineClearTabenter')
1408479950f6SBram Moolenaar  let buf = RunVimInTerminal('-S XtestCmdlineClearTabenter', #{rows: 10})
14096a2c5a7dSBram Moolenaar  call TermWait(buf, 25)
1410479950f6SBram Moolenaar  " in one tab make the command line higher with CTRL-W -
1411479950f6SBram Moolenaar  call term_sendkeys(buf, ":tabnew\<cr>\<C-w>-\<C-w>-gtgt")
1412479950f6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdlineclear_tabenter', {})
1413479950f6SBram Moolenaar
1414479950f6SBram Moolenaar  call StopVimInTerminal(buf)
1415479950f6SBram Moolenaar  call delete('XtestCmdlineClearTabenter')
1416479950f6SBram Moolenaarendfunc
1417479950f6SBram Moolenaar
141846aa6f93SYegappan Lakshmanan" Test for expanding special keywords in cmdline
14199f6277bdSBram Moolenaarfunc Test_cmdline_expand_special()
14209f6277bdSBram Moolenaar  %bwipe!
1421b8bd2e6eSBram Moolenaar  call assert_fails('e #', 'E194:')
14229f6277bdSBram Moolenaar  call assert_fails('e <afile>', 'E495:')
14239f6277bdSBram Moolenaar  call assert_fails('e <abuf>', 'E496:')
14249f6277bdSBram Moolenaar  call assert_fails('e <amatch>', 'E497:')
142546aa6f93SYegappan Lakshmanan
142646aa6f93SYegappan Lakshmanan  call writefile([], 'Xfile.cpp')
142746aa6f93SYegappan Lakshmanan  call writefile([], 'Xfile.java')
142846aa6f93SYegappan Lakshmanan  new Xfile.cpp
142946aa6f93SYegappan Lakshmanan  call feedkeys(":e %:r\<C-A>\<C-B>\"\<CR>", 'xt')
143046aa6f93SYegappan Lakshmanan  call assert_equal('"e Xfile.cpp Xfile.java', @:)
143146aa6f93SYegappan Lakshmanan  close
143246aa6f93SYegappan Lakshmanan  call delete('Xfile.cpp')
143346aa6f93SYegappan Lakshmanan  call delete('Xfile.java')
14349f6277bdSBram Moolenaarendfunc
14359f6277bdSBram Moolenaar
1436f0cee197SBram Moolenaarfunc Test_cmdwin_jump_to_win()
143721829c5fSBram Moolenaar  CheckFeature cmdwin
143821829c5fSBram Moolenaar
1439f0cee197SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>\<C-W>\<CR>", "xt")', 'E11:')
1440f0cee197SBram Moolenaar  new
1441f0cee197SBram Moolenaar  set modified
14429b7bf9e9SBram Moolenaar  call assert_fails('call feedkeys("q/:qall\<CR>", "xt")', ['E37:', 'E162:'])
1443f0cee197SBram Moolenaar  close!
1444f0cee197SBram Moolenaar  call feedkeys("q/:close\<CR>", "xt")
1445f0cee197SBram Moolenaar  call assert_equal(1, winnr('$'))
1446f0cee197SBram Moolenaar  call feedkeys("q/:exit\<CR>", "xt")
1447f0cee197SBram Moolenaar  call assert_equal(1, winnr('$'))
14488d588cceSBram Moolenaar
14498d588cceSBram Moolenaar  " opening command window twice should fail
14508d588cceSBram Moolenaar  call assert_beeps('call feedkeys("q:q:\<CR>\<CR>", "xt")')
14518d588cceSBram Moolenaar  call assert_equal(1, winnr('$'))
1452f0cee197SBram Moolenaarendfunc
1453f0cee197SBram Moolenaar
14549b7cce28SBram Moolenaarfunc Test_cmdwin_interrupted()
145521829c5fSBram Moolenaar  CheckFeature cmdwin
14569b7cce28SBram Moolenaar  CheckScreendump
14579b7cce28SBram Moolenaar
14589b7cce28SBram Moolenaar  " aborting the :smile output caused the cmdline window to use the current
14599b7cce28SBram Moolenaar  " buffer.
14609b7cce28SBram Moolenaar  let lines =<< trim [SCRIPT]
14619b7cce28SBram Moolenaar    au WinNew * smile
14629b7cce28SBram Moolenaar  [SCRIPT]
14639b7cce28SBram Moolenaar  call writefile(lines, 'XTest_cmdwin')
14649b7cce28SBram Moolenaar
14659b7cce28SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_cmdwin', {'rows': 18})
14669b7cce28SBram Moolenaar  " open cmdwin
14679b7cce28SBram Moolenaar  call term_sendkeys(buf, "q:")
1468c82dd860SBram Moolenaar  call WaitForAssert({-> assert_match('-- More --', term_getline(buf, 18))})
14699b7cce28SBram Moolenaar  " quit more prompt for :smile command
14709b7cce28SBram Moolenaar  call term_sendkeys(buf, "q")
1471c82dd860SBram Moolenaar  call WaitForAssert({-> assert_match('^$', term_getline(buf, 18))})
14729b7cce28SBram Moolenaar  " execute a simple command
14739b7cce28SBram Moolenaar  call term_sendkeys(buf, "aecho 'done'\<CR>")
14749b7cce28SBram Moolenaar  call VerifyScreenDump(buf, 'Test_cmdwin_interrupted', {})
14759b7cce28SBram Moolenaar
14769b7cce28SBram Moolenaar  " clean up
14779b7cce28SBram Moolenaar  call StopVimInTerminal(buf)
14789b7cce28SBram Moolenaar  call delete('XTest_cmdwin')
14799b7cce28SBram Moolenaarendfunc
14809b7cce28SBram Moolenaar
1481f0cee197SBram Moolenaar" Test for backtick expression in the command line
1482f0cee197SBram Moolenaarfunc Test_cmd_backtick()
1483f0cee197SBram Moolenaar  %argd
1484f0cee197SBram Moolenaar  argadd `=['a', 'b', 'c']`
1485f0cee197SBram Moolenaar  call assert_equal(['a', 'b', 'c'], argv())
1486f0cee197SBram Moolenaar  %argd
1487bfb2bb16SDominique Pelle
1488bfb2bb16SDominique Pelle  argadd `echo abc def`
1489bfb2bb16SDominique Pelle  call assert_equal(['abc def'], argv())
1490bfb2bb16SDominique Pelle  %argd
1491f0cee197SBram Moolenaarendfunc
1492f0cee197SBram Moolenaar
1493818fc9adSBram Moolenaar" Test for the :! command
1494818fc9adSBram Moolenaarfunc Test_cmd_bang()
14956d91bcb4SBram Moolenaar  CheckUnix
1496818fc9adSBram Moolenaar
1497818fc9adSBram Moolenaar  let lines =<< trim [SCRIPT]
1498818fc9adSBram Moolenaar    " Test for no previous command
1499818fc9adSBram Moolenaar    call assert_fails('!!', 'E34:')
1500818fc9adSBram Moolenaar    set nomore
1501818fc9adSBram Moolenaar    " Test for cmdline expansion with :!
1502818fc9adSBram Moolenaar    call setline(1, 'foo!')
1503818fc9adSBram Moolenaar    silent !echo <cWORD> > Xfile.out
1504818fc9adSBram Moolenaar    call assert_equal(['foo!'], readfile('Xfile.out'))
1505818fc9adSBram Moolenaar    " Test for using previous command
1506818fc9adSBram Moolenaar    silent !echo \! !
1507818fc9adSBram Moolenaar    call assert_equal(['! echo foo!'], readfile('Xfile.out'))
1508818fc9adSBram Moolenaar    call writefile(v:errors, 'Xresult')
1509818fc9adSBram Moolenaar    call delete('Xfile.out')
1510818fc9adSBram Moolenaar    qall!
1511818fc9adSBram Moolenaar  [SCRIPT]
1512818fc9adSBram Moolenaar  call writefile(lines, 'Xscript')
1513818fc9adSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
1514818fc9adSBram Moolenaar    call assert_equal([], readfile('Xresult'))
1515818fc9adSBram Moolenaar  endif
1516818fc9adSBram Moolenaar  call delete('Xscript')
1517818fc9adSBram Moolenaar  call delete('Xresult')
1518818fc9adSBram Moolenaarendfunc
1519818fc9adSBram Moolenaar
1520e0c3c3d6SBram Moolenaar" Test error: "E135: *Filter* Autocommands must not change current buffer"
1521e0c3c3d6SBram Moolenaarfunc Test_cmd_bang_E135()
1522e0c3c3d6SBram Moolenaar  new
1523e0c3c3d6SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd'])
1524e0c3c3d6SBram Moolenaar  augroup test_cmd_filter_E135
1525e0c3c3d6SBram Moolenaar    au!
1526e0c3c3d6SBram Moolenaar    autocmd FilterReadPost * help
1527e0c3c3d6SBram Moolenaar  augroup END
1528e0c3c3d6SBram Moolenaar  call assert_fails('2,3!echo "x"', 'E135:')
1529e0c3c3d6SBram Moolenaar
1530e0c3c3d6SBram Moolenaar  augroup test_cmd_filter_E135
1531e0c3c3d6SBram Moolenaar    au!
1532e0c3c3d6SBram Moolenaar  augroup END
1533e0c3c3d6SBram Moolenaar  %bwipe!
1534e0c3c3d6SBram Moolenaarendfunc
1535e0c3c3d6SBram Moolenaar
15368d588cceSBram Moolenaar" Test for using ~ for home directory in cmdline completion matches
15378d588cceSBram Moolenaarfunc Test_cmdline_expand_home()
15388d588cceSBram Moolenaar  call mkdir('Xdir')
15398d588cceSBram Moolenaar  call writefile([], 'Xdir/Xfile1')
15408d588cceSBram Moolenaar  call writefile([], 'Xdir/Xfile2')
15418d588cceSBram Moolenaar  cd Xdir
15428d588cceSBram Moolenaar  let save_HOME = $HOME
15438d588cceSBram Moolenaar  let $HOME = getcwd()
15448d588cceSBram Moolenaar  call feedkeys(":e ~/\<C-A>\<C-B>\"\<CR>", 'xt')
15458d588cceSBram Moolenaar  call assert_equal('"e ~/Xfile1 ~/Xfile2', @:)
15468d588cceSBram Moolenaar  let $HOME = save_HOME
15478d588cceSBram Moolenaar  cd ..
15488d588cceSBram Moolenaar  call delete('Xdir', 'rf')
15498d588cceSBram Moolenaarendfunc
15508d588cceSBram Moolenaar
1551578fe947SBram Moolenaar" Test for using CTRL-\ CTRL-G in the command line to go back to normal mode
1552578fe947SBram Moolenaar" or insert mode (when 'insertmode' is set)
1553578fe947SBram Moolenaarfunc Test_cmdline_ctrl_g()
1554578fe947SBram Moolenaar  new
1555578fe947SBram Moolenaar  call setline(1, 'abc')
1556578fe947SBram Moolenaar  call cursor(1, 3)
1557578fe947SBram Moolenaar  " If command line is entered from insert mode, using C-\ C-G should back to
1558578fe947SBram Moolenaar  " insert mode
1559578fe947SBram Moolenaar  call feedkeys("i\<C-O>:\<C-\>\<C-G>xy", 'xt')
1560578fe947SBram Moolenaar  call assert_equal('abxyc', getline(1))
1561578fe947SBram Moolenaar  call assert_equal(4, col('.'))
1562578fe947SBram Moolenaar
1563578fe947SBram Moolenaar  " If command line is entered in 'insertmode', using C-\ C-G should back to
1564578fe947SBram Moolenaar  " 'insertmode'
1565578fe947SBram Moolenaar  call feedkeys(":set im\<cr>\<C-L>:\<C-\>\<C-G>12\<C-L>:set noim\<cr>", 'xt')
1566578fe947SBram Moolenaar  call assert_equal('ab12xyc', getline(1))
1567578fe947SBram Moolenaar  close!
1568578fe947SBram Moolenaarendfunc
1569578fe947SBram Moolenaar
1570578fe947SBram Moolenaar" Test for 'wildmode'
1571578fe947SBram Moolenaarfunc Test_wildmode()
1572578fe947SBram Moolenaar  func T(a, c, p)
1573578fe947SBram Moolenaar    return "oneA\noneB\noneC"
1574578fe947SBram Moolenaar  endfunc
1575578fe947SBram Moolenaar  command -nargs=1 -complete=custom,T MyCmd
1576578fe947SBram Moolenaar
1577578fe947SBram Moolenaar  func SaveScreenLine()
157824ebd83eSBram Moolenaar    let g:Sline = Screenline(&lines - 1)
1579578fe947SBram Moolenaar    return ''
1580578fe947SBram Moolenaar  endfunc
1581578fe947SBram Moolenaar  cnoremap <expr> <F2> SaveScreenLine()
1582578fe947SBram Moolenaar
1583578fe947SBram Moolenaar  set nowildmenu
1584578fe947SBram Moolenaar  set wildmode=full,list
1585578fe947SBram Moolenaar  let g:Sline = ''
1586578fe947SBram Moolenaar  call feedkeys(":MyCmd \t\t\<F2>\<C-B>\"\<CR>", 'xt')
1587578fe947SBram Moolenaar  call assert_equal('oneA  oneB  oneC', g:Sline)
1588578fe947SBram Moolenaar  call assert_equal('"MyCmd oneA', @:)
1589578fe947SBram Moolenaar
1590578fe947SBram Moolenaar  set wildmode=longest,full
1591578fe947SBram Moolenaar  call feedkeys(":MyCmd o\t\<C-B>\"\<CR>", 'xt')
1592578fe947SBram Moolenaar  call assert_equal('"MyCmd one', @:)
1593578fe947SBram Moolenaar  call feedkeys(":MyCmd o\t\t\t\t\<C-B>\"\<CR>", 'xt')
1594578fe947SBram Moolenaar  call assert_equal('"MyCmd oneC', @:)
1595578fe947SBram Moolenaar
1596578fe947SBram Moolenaar  set wildmode=longest
1597578fe947SBram Moolenaar  call feedkeys(":MyCmd one\t\t\<C-B>\"\<CR>", 'xt')
1598578fe947SBram Moolenaar  call assert_equal('"MyCmd one', @:)
1599578fe947SBram Moolenaar
1600578fe947SBram Moolenaar  set wildmode=list:longest
1601578fe947SBram Moolenaar  let g:Sline = ''
1602578fe947SBram Moolenaar  call feedkeys(":MyCmd \t\<F2>\<C-B>\"\<CR>", 'xt')
1603578fe947SBram Moolenaar  call assert_equal('oneA  oneB  oneC', g:Sline)
1604578fe947SBram Moolenaar  call assert_equal('"MyCmd one', @:)
1605578fe947SBram Moolenaar
1606578fe947SBram Moolenaar  set wildmode=""
1607578fe947SBram Moolenaar  call feedkeys(":MyCmd \t\t\<C-B>\"\<CR>", 'xt')
1608578fe947SBram Moolenaar  call assert_equal('"MyCmd oneA', @:)
1609578fe947SBram Moolenaar
161024ebd83eSBram Moolenaar  " Test for wildmode=longest with 'fileignorecase' set
161124ebd83eSBram Moolenaar  set wildmode=longest
161224ebd83eSBram Moolenaar  set fileignorecase
16138dfcce3aSBram Moolenaar  argadd AAA AAAA AAAAA
16148dfcce3aSBram Moolenaar  call feedkeys(":buffer a\t\<C-B>\"\<CR>", 'xt')
16158dfcce3aSBram Moolenaar  call assert_equal('"buffer AAA', @:)
161624ebd83eSBram Moolenaar  set fileignorecase&
161724ebd83eSBram Moolenaar
161824ebd83eSBram Moolenaar  " Test for listing files with wildmode=list
161924ebd83eSBram Moolenaar  set wildmode=list
162024ebd83eSBram Moolenaar  let g:Sline = ''
162124ebd83eSBram Moolenaar  call feedkeys(":b A\t\t\<F2>\<C-B>\"\<CR>", 'xt')
16228dfcce3aSBram Moolenaar  call assert_equal('AAA    AAAA   AAAAA', g:Sline)
162324ebd83eSBram Moolenaar  call assert_equal('"b A', @:)
162424ebd83eSBram Moolenaar
162524ebd83eSBram Moolenaar  %argdelete
1626578fe947SBram Moolenaar  delcommand MyCmd
1627578fe947SBram Moolenaar  delfunc T
1628578fe947SBram Moolenaar  delfunc SaveScreenLine
1629578fe947SBram Moolenaar  cunmap <F2>
1630578fe947SBram Moolenaar  set wildmode&
163124ebd83eSBram Moolenaar  %bwipe!
1632578fe947SBram Moolenaarendfunc
1633578fe947SBram Moolenaar
1634578fe947SBram Moolenaar" Test for interrupting the command-line completion
1635578fe947SBram Moolenaarfunc Test_interrupt_compl()
1636578fe947SBram Moolenaar  func F(lead, cmdl, p)
1637578fe947SBram Moolenaar    if a:lead =~ 'tw'
1638578fe947SBram Moolenaar      call interrupt()
1639578fe947SBram Moolenaar      return
1640578fe947SBram Moolenaar    endif
1641578fe947SBram Moolenaar    return "one\ntwo\nthree"
1642578fe947SBram Moolenaar  endfunc
1643578fe947SBram Moolenaar  command -nargs=1 -complete=custom,F Tcmd
1644578fe947SBram Moolenaar
1645578fe947SBram Moolenaar  set nowildmenu
1646578fe947SBram Moolenaar  set wildmode=full
1647578fe947SBram Moolenaar  let interrupted = 0
1648578fe947SBram Moolenaar  try
1649578fe947SBram Moolenaar    call feedkeys(":Tcmd tw\<Tab>\<C-B>\"\<CR>", 'xt')
1650578fe947SBram Moolenaar  catch /^Vim:Interrupt$/
1651578fe947SBram Moolenaar    let interrupted = 1
1652578fe947SBram Moolenaar  endtry
1653578fe947SBram Moolenaar  call assert_equal(1, interrupted)
1654578fe947SBram Moolenaar
1655578fe947SBram Moolenaar  delcommand Tcmd
1656578fe947SBram Moolenaar  delfunc F
1657578fe947SBram Moolenaar  set wildmode&
1658578fe947SBram Moolenaarendfunc
1659578fe947SBram Moolenaar
1660d30ae2fcSBram Moolenaar" Test for moving the cursor on the : command line
1661578fe947SBram Moolenaarfunc Test_cmdline_edit()
1662d30ae2fcSBram Moolenaar  let str = ":one two\<C-U>"
1663d30ae2fcSBram Moolenaar  let str ..= "one two\<C-W>\<C-W>"
166491ffc8a5SBram Moolenaar  let str ..= "four\<BS>\<C-H>\<Del>\<kDel>"
1665d30ae2fcSBram Moolenaar  let str ..= "\<Left>five\<Right>"
1666d30ae2fcSBram Moolenaar  let str ..= "\<Home>two "
1667d30ae2fcSBram Moolenaar  let str ..= "\<C-Left>one "
1668d30ae2fcSBram Moolenaar  let str ..= "\<C-Right> three"
1669d30ae2fcSBram Moolenaar  let str ..= "\<End>\<S-Left>four "
1670d30ae2fcSBram Moolenaar  let str ..= "\<S-Right> six"
1671d30ae2fcSBram Moolenaar  let str ..= "\<C-B>\"\<C-E> seven\<CR>"
1672d30ae2fcSBram Moolenaar  call feedkeys(str, 'xt')
1673d30ae2fcSBram Moolenaar  call assert_equal("\"one two three four five six seven", @:)
1674d30ae2fcSBram Moolenaarendfunc
1675d30ae2fcSBram Moolenaar
1676d30ae2fcSBram Moolenaar" Test for moving the cursor on the / command line in 'rightleft' mode
1677d30ae2fcSBram Moolenaarfunc Test_cmdline_edit_rightleft()
1678d30ae2fcSBram Moolenaar  CheckFeature rightleft
1679d30ae2fcSBram Moolenaar  set rightleft
1680d30ae2fcSBram Moolenaar  set rightleftcmd=search
1681d30ae2fcSBram Moolenaar  let str = "/one two\<C-U>"
1682d30ae2fcSBram Moolenaar  let str ..= "one two\<C-W>\<C-W>"
168391ffc8a5SBram Moolenaar  let str ..= "four\<BS>\<C-H>\<Del>\<kDel>"
1684d30ae2fcSBram Moolenaar  let str ..= "\<Right>five\<Left>"
1685d30ae2fcSBram Moolenaar  let str ..= "\<Home>two "
1686d30ae2fcSBram Moolenaar  let str ..= "\<C-Right>one "
1687d30ae2fcSBram Moolenaar  let str ..= "\<C-Left> three"
1688d30ae2fcSBram Moolenaar  let str ..= "\<End>\<S-Right>four "
1689d30ae2fcSBram Moolenaar  let str ..= "\<S-Left> six"
1690d30ae2fcSBram Moolenaar  let str ..= "\<C-B>\"\<C-E> seven\<CR>"
1691d30ae2fcSBram Moolenaar  call assert_fails("call feedkeys(str, 'xt')", 'E486:')
1692d30ae2fcSBram Moolenaar  call assert_equal("\"one two three four five six seven", @/)
1693d30ae2fcSBram Moolenaar  set rightleftcmd&
1694d30ae2fcSBram Moolenaar  set rightleft&
1695d30ae2fcSBram Moolenaarendfunc
1696d30ae2fcSBram Moolenaar
1697d30ae2fcSBram Moolenaar" Test for using <C-\>e in the command line to evaluate an expression
1698d30ae2fcSBram Moolenaarfunc Test_cmdline_expr()
1699d30ae2fcSBram Moolenaar  " Evaluate an expression from the beginning of a command line
1700d30ae2fcSBram Moolenaar  call feedkeys(":abc\<C-B>\<C-\>e\"\\\"hello\"\<CR>\<CR>", 'xt')
1701d30ae2fcSBram Moolenaar  call assert_equal('"hello', @:)
1702d30ae2fcSBram Moolenaar
1703d30ae2fcSBram Moolenaar  " Use an invalid expression for <C-\>e
1704d30ae2fcSBram Moolenaar  call assert_beeps('call feedkeys(":\<C-\>einvalid\<CR>", "tx")')
1705d30ae2fcSBram Moolenaar
1706d30ae2fcSBram Moolenaar  " Insert literal <CTRL-\> in the command line
1707d30ae2fcSBram Moolenaar  call feedkeys(":\"e \<C-\>\<C-Y>\<CR>", 'xt')
1708d30ae2fcSBram Moolenaar  call assert_equal("\"e \<C-\>\<C-Y>", @:)
1709578fe947SBram Moolenaarendfunc
1710578fe947SBram Moolenaar
17110546d7dfSBram Moolenaar" Test for 'imcmdline' and 'imsearch'
17120546d7dfSBram Moolenaar" This test doesn't actually test the input method functionality.
17130546d7dfSBram Moolenaarfunc Test_cmdline_inputmethod()
17140546d7dfSBram Moolenaar  new
17150546d7dfSBram Moolenaar  call setline(1, ['', 'abc', ''])
17160546d7dfSBram Moolenaar  set imcmdline
17170546d7dfSBram Moolenaar
17180546d7dfSBram Moolenaar  call feedkeys(":\"abc\<CR>", 'xt')
17190546d7dfSBram Moolenaar  call assert_equal("\"abc", @:)
17200546d7dfSBram Moolenaar  call feedkeys(":\"\<C-^>abc\<C-^>\<CR>", 'xt')
17210546d7dfSBram Moolenaar  call assert_equal("\"abc", @:)
17220546d7dfSBram Moolenaar  call feedkeys("/abc\<CR>", 'xt')
17230546d7dfSBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
17240546d7dfSBram Moolenaar  call feedkeys("/\<C-^>abc\<C-^>\<CR>", 'xt')
17250546d7dfSBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
17260546d7dfSBram Moolenaar
17270546d7dfSBram Moolenaar  set imsearch=2
17280546d7dfSBram Moolenaar  call cursor(1, 1)
17290546d7dfSBram Moolenaar  call feedkeys("/abc\<CR>", 'xt')
17300546d7dfSBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
17310546d7dfSBram Moolenaar  call cursor(1, 1)
17320546d7dfSBram Moolenaar  call feedkeys("/\<C-^>abc\<C-^>\<CR>", 'xt')
17330546d7dfSBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
17340546d7dfSBram Moolenaar  set imdisable
17350546d7dfSBram Moolenaar  call feedkeys("/\<C-^>abc\<C-^>\<CR>", 'xt')
17360546d7dfSBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
17370546d7dfSBram Moolenaar  set imdisable&
17380546d7dfSBram Moolenaar  set imsearch&
17390546d7dfSBram Moolenaar
17400546d7dfSBram Moolenaar  set imcmdline&
17410546d7dfSBram Moolenaar  %bwipe!
17420546d7dfSBram Moolenaarendfunc
17430546d7dfSBram Moolenaar
174491ffc8a5SBram Moolenaar" Test for recursively getting multiple command line inputs
174591ffc8a5SBram Moolenaarfunc Test_cmdwin_multi_input()
174621829c5fSBram Moolenaar  CheckFeature cmdwin
174721829c5fSBram Moolenaar
174891ffc8a5SBram Moolenaar  call feedkeys(":\<C-R>=input('P: ')\<CR>\"cyan\<CR>\<CR>", 'xt')
174991ffc8a5SBram Moolenaar  call assert_equal('"cyan', @:)
175091ffc8a5SBram Moolenaarendfunc
175191ffc8a5SBram Moolenaar
175291ffc8a5SBram Moolenaar" Test for using CTRL-_ in the command line with 'allowrevins'
175391ffc8a5SBram Moolenaarfunc Test_cmdline_revins()
175491ffc8a5SBram Moolenaar  CheckNotMSWindows
175591ffc8a5SBram Moolenaar  CheckFeature rightleft
175691ffc8a5SBram Moolenaar  call feedkeys(":\"abc\<c-_>\<cr>", 'xt')
175791ffc8a5SBram Moolenaar  call assert_equal("\"abc\<c-_>", @:)
175891ffc8a5SBram Moolenaar  set allowrevins
175991ffc8a5SBram Moolenaar  call feedkeys(":\"abc\<c-_>xyz\<c-_>\<CR>", 'xt')
176091ffc8a5SBram Moolenaar  call assert_equal('"abcñèæ', @:)
176191ffc8a5SBram Moolenaar  set allowrevins&
176291ffc8a5SBram Moolenaarendfunc
176391ffc8a5SBram Moolenaar
176491ffc8a5SBram Moolenaar" Test for typing UTF-8 composing characters in the command line
176591ffc8a5SBram Moolenaarfunc Test_cmdline_composing_chars()
176691ffc8a5SBram Moolenaar  call feedkeys(":\"\<C-V>u3046\<C-V>u3099\<CR>", 'xt')
176791ffc8a5SBram Moolenaar  call assert_equal('"ゔ', @:)
176891ffc8a5SBram Moolenaarendfunc
176991ffc8a5SBram Moolenaar
1770f5f1e10dSBram Moolenaar" Test for normal mode commands not supported in the cmd window
1771f5f1e10dSBram Moolenaarfunc Test_cmdwin_blocked_commands()
177221829c5fSBram Moolenaar  CheckFeature cmdwin
177321829c5fSBram Moolenaar
1774f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:\<C-T>\<CR>", "xt")', 'E11:')
1775f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:\<C-]>\<CR>", "xt")', 'E11:')
1776f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:\<C-^>\<CR>", "xt")', 'E11:')
1777f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:Q\<CR>", "xt")', 'E11:')
1778f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:Z\<CR>", "xt")', 'E11:')
1779f5f1e10dSBram Moolenaar  call assert_fails('call feedkeys("q:\<F1>\<CR>", "xt")', 'E11:')
1780951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>s\<CR>", "xt")', 'E11:')
1781951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>v\<CR>", "xt")', 'E11:')
1782951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>^\<CR>", "xt")', 'E11:')
1783951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>n\<CR>", "xt")', 'E11:')
1784951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>z\<CR>", "xt")', 'E11:')
1785951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>o\<CR>", "xt")', 'E11:')
1786951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>w\<CR>", "xt")', 'E11:')
1787951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>j\<CR>", "xt")', 'E11:')
1788951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>k\<CR>", "xt")', 'E11:')
1789951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>h\<CR>", "xt")', 'E11:')
1790951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>l\<CR>", "xt")', 'E11:')
1791951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>T\<CR>", "xt")', 'E11:')
1792951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>x\<CR>", "xt")', 'E11:')
1793951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>r\<CR>", "xt")', 'E11:')
1794951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>R\<CR>", "xt")', 'E11:')
1795951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>K\<CR>", "xt")', 'E11:')
1796951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>}\<CR>", "xt")', 'E11:')
1797951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>]\<CR>", "xt")', 'E11:')
1798951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>f\<CR>", "xt")', 'E11:')
1799951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>d\<CR>", "xt")', 'E11:')
1800951a2fb1SBram Moolenaar  call assert_fails('call feedkeys("q:\<C-W>g\<CR>", "xt")', 'E11:')
1801f5f1e10dSBram Moolenaarendfunc
1802f5f1e10dSBram Moolenaar
1803ca68ae13SBram Moolenaar" Close the Cmd-line window in insert mode using CTRL-C
1804ca68ae13SBram Moolenaarfunc Test_cmdwin_insert_mode_close()
180521829c5fSBram Moolenaar  CheckFeature cmdwin
180621829c5fSBram Moolenaar
1807ca68ae13SBram Moolenaar  %bw!
1808ca68ae13SBram Moolenaar  let s = ''
1809ca68ae13SBram Moolenaar  exe "normal q:a\<C-C>let s='Hello'\<CR>"
1810ca68ae13SBram Moolenaar  call assert_equal('Hello', s)
1811ca68ae13SBram Moolenaar  call assert_equal(1, winnr('$'))
1812ca68ae13SBram Moolenaarendfunc
1813ca68ae13SBram Moolenaar
18140e71704bSBram Moolenaar" test that ";" works to find a match at the start of the first line
18150e71704bSBram Moolenaarfunc Test_zero_line_search()
18160e71704bSBram Moolenaar  new
18170e71704bSBram Moolenaar  call setline(1, ["1, pattern", "2, ", "3, pattern"])
18180e71704bSBram Moolenaar  call cursor(1,1)
18190e71704bSBram Moolenaar  0;/pattern/d
18200e71704bSBram Moolenaar  call assert_equal(["2, ", "3, pattern"], getline(1,'$'))
18210e71704bSBram Moolenaar  q!
18220e71704bSBram Moolenaarendfunc
18230e71704bSBram Moolenaar
1824c8cb8830SBram Moolenaarfunc Test_read_shellcmd()
1825c8cb8830SBram Moolenaar  CheckUnix
1826c8cb8830SBram Moolenaar  if executable('ls')
1827c8cb8830SBram Moolenaar    " There should be ls in the $PATH
1828c8cb8830SBram Moolenaar    call feedkeys(":r! l\<c-a>\<c-b>\"\<cr>", 'tx')
1829c8cb8830SBram Moolenaar    call assert_match('^"r! .*\<ls\>', @:)
1830c8cb8830SBram Moolenaar  endif
1831c8cb8830SBram Moolenaar
1832c8cb8830SBram Moolenaar  if executable('rm')
1833c8cb8830SBram Moolenaar    call feedkeys(":r! ++enc=utf-8 r\<c-a>\<c-b>\"\<cr>", 'tx')
1834c8cb8830SBram Moolenaar    call assert_notmatch('^"r!.*\<runtest.vim\>', @:)
1835c8cb8830SBram Moolenaar    call assert_match('^"r!.*\<rm\>', @:)
1836743d0620SBram Moolenaar
1837743d0620SBram Moolenaar    call feedkeys(":r ++enc=utf-8 !rm\<c-a>\<c-b>\"\<cr>", 'tx')
1838743d0620SBram Moolenaar    call assert_notmatch('^"r.*\<runtest.vim\>', @:)
1839743d0620SBram Moolenaar    call assert_match('^"r ++enc\S\+ !.*\<rm\>', @:)
1840c8cb8830SBram Moolenaar  endif
1841c8cb8830SBram Moolenaarendfunc
1842c8cb8830SBram Moolenaar
18434b2ce129SBram Moolenaar" Test for going up and down the directory tree using 'wildmenu'
18444b2ce129SBram Moolenaarfunc Test_wildmenu_dirstack()
18454b2ce129SBram Moolenaar  CheckUnix
18464b2ce129SBram Moolenaar  %bw!
18474b2ce129SBram Moolenaar  call mkdir('Xdir1/dir2/dir3', 'p')
18484b2ce129SBram Moolenaar  call writefile([], 'Xdir1/file1_1.txt')
18494b2ce129SBram Moolenaar  call writefile([], 'Xdir1/file1_2.txt')
18504b2ce129SBram Moolenaar  call writefile([], 'Xdir1/dir2/file2_1.txt')
18514b2ce129SBram Moolenaar  call writefile([], 'Xdir1/dir2/file2_2.txt')
18524b2ce129SBram Moolenaar  call writefile([], 'Xdir1/dir2/dir3/file3_1.txt')
18534b2ce129SBram Moolenaar  call writefile([], 'Xdir1/dir2/dir3/file3_2.txt')
18544b2ce129SBram Moolenaar  cd Xdir1/dir2/dir3
18554b2ce129SBram Moolenaar  set wildmenu
18564b2ce129SBram Moolenaar
18574b2ce129SBram Moolenaar  call feedkeys(":e \<Tab>\<C-B>\"\<CR>", 'xt')
18584b2ce129SBram Moolenaar  call assert_equal('"e file3_1.txt', @:)
18594b2ce129SBram Moolenaar  call feedkeys(":e \<Tab>\<Up>\<C-B>\"\<CR>", 'xt')
18604b2ce129SBram Moolenaar  call assert_equal('"e ../dir3/', @:)
18614b2ce129SBram Moolenaar  call feedkeys(":e \<Tab>\<Up>\<Up>\<C-B>\"\<CR>", 'xt')
18624b2ce129SBram Moolenaar  call assert_equal('"e ../../dir2/', @:)
18634b2ce129SBram Moolenaar  call feedkeys(":e \<Tab>\<Up>\<Up>\<Down>\<C-B>\"\<CR>", 'xt')
18644b2ce129SBram Moolenaar  call assert_equal('"e ../../dir2/dir3/', @:)
18654b2ce129SBram Moolenaar  call feedkeys(":e \<Tab>\<Up>\<Up>\<Down>\<Down>\<C-B>\"\<CR>", 'xt')
18664b2ce129SBram Moolenaar  call assert_equal('"e ../../dir2/dir3/file3_1.txt', @:)
18674b2ce129SBram Moolenaar
18684b2ce129SBram Moolenaar  cd -
18694b2ce129SBram Moolenaar  call delete('Xdir1', 'rf')
18704b2ce129SBram Moolenaar  set wildmenu&
18714b2ce129SBram Moolenaarendfunc
18724b2ce129SBram Moolenaar
187371c6f7a6Sobcat" Test for recalling newer or older cmdline from history with <Up>, <Down>,
187471c6f7a6Sobcat" <S-Up>, <S-Down>, <PageUp>, <PageDown>, <C-p>, or <C-n>.
187571c6f7a6Sobcatfunc Test_recalling_cmdline()
187671c6f7a6Sobcat  CheckFeature cmdline_hist
187771c6f7a6Sobcat
187871c6f7a6Sobcat  let g:cmdlines = []
187971c6f7a6Sobcat  cnoremap <Plug>(save-cmdline) <Cmd>let g:cmdlines += [getcmdline()]<CR>
188071c6f7a6Sobcat
188171c6f7a6Sobcat  let histories = [
188271c6f7a6Sobcat  \  {'name': 'cmd',    'enter': ':',                    'exit': "\<Esc>"},
188371c6f7a6Sobcat  \  {'name': 'search', 'enter': '/',                    'exit': "\<Esc>"},
188471c6f7a6Sobcat  \  {'name': 'expr',   'enter': ":\<C-r>=",             'exit': "\<Esc>\<Esc>"},
188571c6f7a6Sobcat  \  {'name': 'input',  'enter': ":call input('')\<CR>", 'exit': "\<CR>"},
188671c6f7a6Sobcat  "\ TODO: {'name': 'debug', ...}
188771c6f7a6Sobcat  \]
188871c6f7a6Sobcat  let keypairs = [
188971c6f7a6Sobcat  \  {'older': "\<Up>",     'newer': "\<Down>",     'prefixmatch': v:true},
189071c6f7a6Sobcat  \  {'older': "\<S-Up>",   'newer': "\<S-Down>",   'prefixmatch': v:false},
189171c6f7a6Sobcat  \  {'older': "\<PageUp>", 'newer': "\<PageDown>", 'prefixmatch': v:false},
189271c6f7a6Sobcat  \  {'older': "\<C-p>",    'newer': "\<C-n>",      'prefixmatch': v:false},
189371c6f7a6Sobcat  \]
189471c6f7a6Sobcat  let prefix = 'vi'
189571c6f7a6Sobcat  for h in histories
189671c6f7a6Sobcat    call histadd(h.name, 'vim')
189771c6f7a6Sobcat    call histadd(h.name, 'virtue')
189871c6f7a6Sobcat    call histadd(h.name, 'Virgo')
189971c6f7a6Sobcat    call histadd(h.name, 'vogue')
190071c6f7a6Sobcat    call histadd(h.name, 'emacs')
190171c6f7a6Sobcat    for k in keypairs
190271c6f7a6Sobcat      let g:cmdlines = []
190371c6f7a6Sobcat      let keyseqs = h.enter
190471c6f7a6Sobcat      \          .. prefix
190571c6f7a6Sobcat      \          .. repeat(k.older .. "\<Plug>(save-cmdline)", 2)
190671c6f7a6Sobcat      \          .. repeat(k.newer .. "\<Plug>(save-cmdline)", 2)
190771c6f7a6Sobcat      \          .. h.exit
190871c6f7a6Sobcat      call feedkeys(keyseqs, 'xt')
190971c6f7a6Sobcat      call histdel(h.name, -1) " delete the history added by feedkeys above
191071c6f7a6Sobcat      let expect = k.prefixmatch
191171c6f7a6Sobcat      \          ? ['virtue', 'vim',   'virtue', prefix]
191271c6f7a6Sobcat      \          : ['emacs',  'vogue', 'emacs',  prefix]
191371c6f7a6Sobcat      call assert_equal(expect, g:cmdlines)
191471c6f7a6Sobcat    endfor
191571c6f7a6Sobcat  endfor
191671c6f7a6Sobcat
191771c6f7a6Sobcat  unlet g:cmdlines
191871c6f7a6Sobcat  cunmap <Plug>(save-cmdline)
191971c6f7a6Sobcatendfunc
192071c6f7a6Sobcat
1921847fe7d7SBram Moolenaarfunc Test_cmd_map_cmdlineChanged()
1922847fe7d7SBram Moolenaar  let g:log = []
1923847fe7d7SBram Moolenaar  cnoremap <F1> l<Cmd><CR>s
1924847fe7d7SBram Moolenaar  augroup test
1925847fe7d7SBram Moolenaar    autocmd!
1926847fe7d7SBram Moolenaar    autocmd CmdlineChanged : let g:log += [getcmdline()]
1927847fe7d7SBram Moolenaar  augroup END
1928847fe7d7SBram Moolenaar
1929847fe7d7SBram Moolenaar  call feedkeys(":\<F1>\<CR>", 'xt')
1930847fe7d7SBram Moolenaar  call assert_equal(['l', 'ls'], g:log)
1931847fe7d7SBram Moolenaar
1932796139aeSBram Moolenaar  let @b = 'b'
1933796139aeSBram Moolenaar  cnoremap <F1> a<C-R>b
1934796139aeSBram Moolenaar  let g:log = []
1935796139aeSBram Moolenaar  call feedkeys(":\<F1>\<CR>", 'xt')
1936796139aeSBram Moolenaar  call assert_equal(['a', 'ab'], g:log)
1937796139aeSBram Moolenaar
1938847fe7d7SBram Moolenaar  unlet g:log
1939847fe7d7SBram Moolenaar  cunmap <F1>
1940847fe7d7SBram Moolenaar  augroup test
1941847fe7d7SBram Moolenaar    autocmd!
1942847fe7d7SBram Moolenaar  augroup END
1943847fe7d7SBram Moolenaarendfunc
1944847fe7d7SBram Moolenaar
194546aa6f93SYegappan Lakshmanan" Test for the 'suffixes' option
194646aa6f93SYegappan Lakshmananfunc Test_suffixes_opt()
194746aa6f93SYegappan Lakshmanan  call writefile([], 'Xfile')
194846aa6f93SYegappan Lakshmanan  call writefile([], 'Xfile.c')
194946aa6f93SYegappan Lakshmanan  call writefile([], 'Xfile.o')
195046aa6f93SYegappan Lakshmanan  set suffixes=
195146aa6f93SYegappan Lakshmanan  call feedkeys(":e Xfi*\<C-A>\<C-B>\"\<CR>", 'xt')
195246aa6f93SYegappan Lakshmanan  call assert_equal('"e Xfile Xfile.c Xfile.o', @:)
195346aa6f93SYegappan Lakshmanan  set suffixes=.c
195446aa6f93SYegappan Lakshmanan  call feedkeys(":e Xfi*\<C-A>\<C-B>\"\<CR>", 'xt')
195546aa6f93SYegappan Lakshmanan  call assert_equal('"e Xfile Xfile.o Xfile.c', @:)
195646aa6f93SYegappan Lakshmanan  set suffixes=,,
195746aa6f93SYegappan Lakshmanan  call feedkeys(":e Xfi*\<C-A>\<C-B>\"\<CR>", 'xt')
195846aa6f93SYegappan Lakshmanan  call assert_equal('"e Xfile.c Xfile.o Xfile', @:)
195946aa6f93SYegappan Lakshmanan  set suffixes&
196046aa6f93SYegappan Lakshmanan  call delete('Xfile')
196146aa6f93SYegappan Lakshmanan  call delete('Xfile.c')
196246aa6f93SYegappan Lakshmanan  call delete('Xfile.o')
196346aa6f93SYegappan Lakshmananendfunc
1964847fe7d7SBram Moolenaar
1965309976ecSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1966