xref: /vim-8.2.3635/src/testdir/test_ex_mode.vim (revision 6b02b38e)
159cb041dSBram Moolenaar" Test editing line in Ex mode (see :help Q and :help gQ).
259cb041dSBram Moolenaar
3e20b9eceSBram Moolenaarsource check.vim
43b6d57f2SBram Moolenaarsource shared.vim
5e20b9eceSBram Moolenaar
659cb041dSBram Moolenaar" Helper function to test editing line in Q Ex mode
759cb041dSBram Moolenaarfunc Ex_Q(cmd)
859cb041dSBram Moolenaar  " Is there a simpler way to test editing Ex line?
959cb041dSBram Moolenaar  call feedkeys("Q"
1059cb041dSBram Moolenaar        \    .. "let s:test_ex =<< END\<CR>"
1159cb041dSBram Moolenaar        \    .. a:cmd .. "\<CR>"
1259cb041dSBram Moolenaar        \    .. "END\<CR>"
1359cb041dSBram Moolenaar        \    .. "visual\<CR>", 'tx')
1459cb041dSBram Moolenaar  return s:test_ex[0]
1559cb041dSBram Moolenaarendfunc
1659cb041dSBram Moolenaar
1759cb041dSBram Moolenaar" Helper function to test editing line in gQ Ex mode
1859cb041dSBram Moolenaarfunc Ex_gQ(cmd)
1959cb041dSBram Moolenaar  call feedkeys("gQ" .. a:cmd .. "\<C-b>\"\<CR>", 'tx')
2059cb041dSBram Moolenaar  let ret = @:[1:] " Remove leading quote.
2159cb041dSBram Moolenaar  call feedkeys("visual\<CR>", 'tx')
2259cb041dSBram Moolenaar  return ret
2359cb041dSBram Moolenaarendfunc
2459cb041dSBram Moolenaar
2559cb041dSBram Moolenaar" Helper function to test editing line with both Q and gQ Ex mode.
2659cb041dSBram Moolenaarfunc Ex(cmd)
2759cb041dSBram Moolenaar return [Ex_Q(a:cmd), Ex_gQ(a:cmd)]
2859cb041dSBram Moolenaarendfunc
2959cb041dSBram Moolenaar
3059cb041dSBram Moolenaar" Test editing line in Ex mode (both Q and gQ)
3159cb041dSBram Moolenaarfunc Test_ex_mode()
3259cb041dSBram Moolenaar  let encoding_save = &encoding
3359cb041dSBram Moolenaar  set sw=2
3459cb041dSBram Moolenaar
3559cb041dSBram Moolenaar  for e in ['utf8', 'latin1']
3659cb041dSBram Moolenaar    exe 'set encoding=' . e
3759cb041dSBram Moolenaar
3859cb041dSBram Moolenaar    call assert_equal(['bar', 'bar'],             Ex("foo bar\<C-u>bar"), e)
3959cb041dSBram Moolenaar    call assert_equal(["1\<C-u>2", "1\<C-u>2"],   Ex("1\<C-v>\<C-u>2"), e)
4059cb041dSBram Moolenaar    call assert_equal(["1\<C-b>2\<C-e>3", '213'], Ex("1\<C-b>2\<C-e>3"), e)
4159cb041dSBram Moolenaar    call assert_equal(['0123', '2013'],           Ex("01\<Home>2\<End>3"), e)
4259cb041dSBram Moolenaar    call assert_equal(['0123', '0213'],           Ex("01\<Left>2\<Right>3"), e)
4359cb041dSBram Moolenaar    call assert_equal(['01234', '0342'],          Ex("012\<Left>\<Left>\<Insert>3\<Insert>4"), e)
4459cb041dSBram Moolenaar    call assert_equal(["foo bar\<C-w>", 'foo '],  Ex("foo bar\<C-w>"), e)
4559cb041dSBram Moolenaar    call assert_equal(['foo', 'foo'],             Ex("fooba\<Del>\<Del>"), e)
4659cb041dSBram Moolenaar    call assert_equal(["foo\tbar", 'foobar'],     Ex("foo\<Tab>bar"), e)
4759cb041dSBram Moolenaar    call assert_equal(["abbrev\t", 'abbreviate'], Ex("abbrev\<Tab>"), e)
4859cb041dSBram Moolenaar    call assert_equal(['    1', "1\<C-t>\<C-t>"], Ex("1\<C-t>\<C-t>"), e)
4959cb041dSBram Moolenaar    call assert_equal(['  1', "1\<C-t>\<C-t>"],   Ex("1\<C-t>\<C-t>\<C-d>"), e)
5059cb041dSBram Moolenaar    call assert_equal(['  foo', '    foo'],       Ex("    foo\<C-d>"), e)
5159cb041dSBram Moolenaar    call assert_equal(['foo', '    foo0'],        Ex("    foo0\<C-d>"), e)
5259cb041dSBram Moolenaar    call assert_equal(['foo', '    foo^'],        Ex("    foo^\<C-d>"), e)
530546d7dfSBram Moolenaar    call assert_equal(['foo', 'foo'],
5491ffc8a5SBram Moolenaar          \ Ex("\<BS>\<C-H>\<Del>\<kDel>foo"), e)
5591ffc8a5SBram Moolenaar    " default wildchar <Tab> interferes with this test
5691ffc8a5SBram Moolenaar    set wildchar=<c-e>
5791ffc8a5SBram Moolenaar    call assert_equal(["a\tb", "a\tb"],           Ex("a\t\t\<C-H>b"), e)
58bd7206e0SBram Moolenaar    call assert_equal(["\t  mn", "\tm\<C-T>n"],        Ex("\tm\<C-T>n"), e)
5991ffc8a5SBram Moolenaar    set wildchar&
6059cb041dSBram Moolenaar  endfor
6159cb041dSBram Moolenaar
6259cb041dSBram Moolenaar  set sw&
6359cb041dSBram Moolenaar  let &encoding = encoding_save
6459cb041dSBram Moolenaarendfunc
65e20b9eceSBram Moolenaar
66bc2b71d4SBram Moolenaar" Test substitute confirmation prompt :%s/pat/str/c in Ex mode
67e20b9eceSBram Moolenaarfunc Test_Ex_substitute()
68e20b9eceSBram Moolenaar  CheckRunVimInTerminal
69e20b9eceSBram Moolenaar  let buf = RunVimInTerminal('', {'rows': 6})
70e20b9eceSBram Moolenaar
71e20b9eceSBram Moolenaar  call term_sendkeys(buf, ":call setline(1, ['foo foo', 'foo foo', 'foo foo'])\<CR>")
72e20b9eceSBram Moolenaar  call term_sendkeys(buf, ":set number\<CR>")
73e20b9eceSBram Moolenaar  call term_sendkeys(buf, "gQ")
74e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000)
75e20b9eceSBram Moolenaar
76e20b9eceSBram Moolenaar  call term_sendkeys(buf, "%s/foo/bar/gc\<CR>")
77e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match('  1 foo foo', term_getline(buf, 5))},
78e20b9eceSBram Moolenaar        \ 1000)
79e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match('    ^^^', term_getline(buf, 6))}, 1000)
80e5b0b98aSBram Moolenaar  call term_sendkeys(buf, "N\<CR>")
81e5b0b98aSBram Moolenaar  call term_wait(buf)
82e5b0b98aSBram Moolenaar  call WaitForAssert({-> assert_match('    ^^^', term_getline(buf, 6))}, 1000)
83e20b9eceSBram Moolenaar  call term_sendkeys(buf, "n\<CR>")
84e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match('        ^^^', term_getline(buf, 6))},
85e20b9eceSBram Moolenaar        \ 1000)
86e20b9eceSBram Moolenaar  call term_sendkeys(buf, "y\<CR>")
87e20b9eceSBram Moolenaar
88e20b9eceSBram Moolenaar  call term_sendkeys(buf, "q\<CR>")
89e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000)
90e20b9eceSBram Moolenaar
91bc2b71d4SBram Moolenaar  " Pressing enter in ex mode should print the current line
92bc2b71d4SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
93bc2b71d4SBram Moolenaar  call WaitForAssert({-> assert_match('  3 foo foo',
94bc2b71d4SBram Moolenaar        \ term_getline(buf, 5))}, 1000)
95bc2b71d4SBram Moolenaar
96e20b9eceSBram Moolenaar  call term_sendkeys(buf, ":vi\<CR>")
97e20b9eceSBram Moolenaar  call WaitForAssert({-> assert_match('foo bar', term_getline(buf, 1))}, 1000)
98e20b9eceSBram Moolenaar
99e20b9eceSBram Moolenaar  call StopVimInTerminal(buf)
100e20b9eceSBram Moolenaarendfunc
101e20b9eceSBram Moolenaar
1029f6277bdSBram Moolenaar" Test for displaying lines from an empty buffer in Ex mode
1039f6277bdSBram Moolenaarfunc Test_Ex_emptybuf()
1049f6277bdSBram Moolenaar  new
1059f6277bdSBram Moolenaar  call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E749:')
1069f6277bdSBram Moolenaar  call setline(1, "abc")
1079f6277bdSBram Moolenaar  call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E501:')
1089f6277bdSBram Moolenaar  call assert_fails('call feedkeys("Q%d\<CR>", "xt")', 'E749:')
1099f6277bdSBram Moolenaar  close!
1109f6277bdSBram Moolenaarendfunc
1119f6277bdSBram Moolenaar
1129f6277bdSBram Moolenaar" Test for the :open command
1139f6277bdSBram Moolenaarfunc Test_open_command()
1149f6277bdSBram Moolenaar  new
1159f6277bdSBram Moolenaar  call setline(1, ['foo foo', 'foo bar', 'foo baz'])
1169f6277bdSBram Moolenaar  call feedkeys("Qopen\<CR>j", 'xt')
1179f6277bdSBram Moolenaar  call assert_equal('foo bar', getline('.'))
1189f6277bdSBram Moolenaar  call feedkeys("Qopen /bar/\<CR>", 'xt')
1199f6277bdSBram Moolenaar  call assert_equal(5, col('.'))
1209f6277bdSBram Moolenaar  call assert_fails('call feedkeys("Qopen /baz/\<CR>", "xt")', 'E479:')
1219f6277bdSBram Moolenaar  close!
1229f6277bdSBram Moolenaarendfunc
1239f6277bdSBram Moolenaar
124818fc9adSBram Moolenaar" Test for :g/pat/visual to run vi commands in Ex mode
125818fc9adSBram Moolenaar" This used to hang Vim before 8.2.0274.
126818fc9adSBram Moolenaarfunc Test_Ex_global()
1279e2bcb5dSBram Moolenaar  new
128818fc9adSBram Moolenaar  call setline(1, ['', 'foo', 'bar', 'foo', 'bar', 'foo'])
129578fe947SBram Moolenaar  call feedkeys("Q\<bs>g/bar/visual\<CR>$rxQ$ryQvisual\<CR>j", "xt")
130818fc9adSBram Moolenaar  call assert_equal('bax', getline(3))
131818fc9adSBram Moolenaar  call assert_equal('bay', getline(5))
1329e2bcb5dSBram Moolenaar  bwipe!
1339e2bcb5dSBram Moolenaarendfunc
1349e2bcb5dSBram Moolenaar
135578fe947SBram Moolenaar" In Ex-mode, a backslash escapes a newline
136578fe947SBram Moolenaarfunc Test_Ex_escape_enter()
137578fe947SBram Moolenaar  call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt')
138578fe947SBram Moolenaar  call assert_equal("a\rb", l)
139578fe947SBram Moolenaarendfunc
140578fe947SBram Moolenaar
1410546d7dfSBram Moolenaar" Test for :append! command in Ex mode
1420546d7dfSBram Moolenaarfunc Test_Ex_append()
1430546d7dfSBram Moolenaar  new
1440546d7dfSBram Moolenaar  call setline(1, "\t   abc")
1450546d7dfSBram Moolenaar  call feedkeys("Qappend!\npqr\nxyz\n.\nvisual\n", 'xt')
1460546d7dfSBram Moolenaar  call assert_equal(["\t   abc", "\t   pqr", "\t   xyz"], getline(1, '$'))
1470546d7dfSBram Moolenaar  close!
1480546d7dfSBram Moolenaarendfunc
1490546d7dfSBram Moolenaar
15091ffc8a5SBram Moolenaar" In Ex-mode, backslashes at the end of a command should be halved.
15191ffc8a5SBram Moolenaarfunc Test_Ex_echo_backslash()
15291ffc8a5SBram Moolenaar  " This test works only when the language is English
153cde0ff39SBram Moolenaar  CheckEnglish
15491ffc8a5SBram Moolenaar  let bsl = '\\\\'
15591ffc8a5SBram Moolenaar  let bsl2 = '\\\'
15691ffc8a5SBram Moolenaar  call assert_fails('call feedkeys("Qecho " .. bsl .. "\nvisual\n", "xt")',
157*6b02b38eSBram Moolenaar        \ 'E15: Invalid expression: "\\"')
15891ffc8a5SBram Moolenaar  call assert_fails('call feedkeys("Qecho " .. bsl2 .. "\nm\nvisual\n", "xt")',
159*6b02b38eSBram Moolenaar        \ "E15: Invalid expression: \"\\\nm\"")
16091ffc8a5SBram Moolenaarendfunc
16191ffc8a5SBram Moolenaar
1621671f448SBram Moolenaarfunc Test_ex_mode_errors()
1631671f448SBram Moolenaar  " Not allowed to enter ex mode when text is locked
1641671f448SBram Moolenaar  au InsertCharPre <buffer> normal! gQ<CR>
165ff06f283SBram Moolenaar  let caught_e565 = 0
1661671f448SBram Moolenaar  try
1671671f448SBram Moolenaar    call feedkeys("ix\<esc>", 'xt')
168ff06f283SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E565/ " catch E565
169ff06f283SBram Moolenaar    let caught_e565 = 1
1701671f448SBram Moolenaar  endtry
171ff06f283SBram Moolenaar  call assert_equal(1, caught_e565)
1721671f448SBram Moolenaar  au! InsertCharPre
173158ea175SBram Moolenaar
174158ea175SBram Moolenaar  new
175158ea175SBram Moolenaar  au CmdLineEnter * call ExEnterFunc()
176158ea175SBram Moolenaar  func ExEnterFunc()
177158ea175SBram Moolenaar
178158ea175SBram Moolenaar  endfunc
179158ea175SBram Moolenaar  call feedkeys("gQvi\r", 'xt')
180158ea175SBram Moolenaar
181158ea175SBram Moolenaar  au! CmdLineEnter
182158ea175SBram Moolenaar  delfunc ExEnterFunc
183158ea175SBram Moolenaar  quit
1841671f448SBram Moolenaarendfunc
1851671f448SBram Moolenaar
1863b6d57f2SBram Moolenaarfunc Test_ex_mode_with_global()
187399db046SBram Moolenaar  CheckNotGui
1883b6d57f2SBram Moolenaar  CheckFeature timers
1893b6d57f2SBram Moolenaar
1903b6d57f2SBram Moolenaar  " This will get stuck in Normal mode after the failed "J", use a timer to
1913b6d57f2SBram Moolenaar  " get going again.
1923b6d57f2SBram Moolenaar  let lines =<< trim END
1933b6d57f2SBram Moolenaar    call ch_logfile('logfile', 'w')
1943b6d57f2SBram Moolenaar    pedit
1953b6d57f2SBram Moolenaar    func FeedQ(id)
1963b6d57f2SBram Moolenaar      call feedkeys('Q', 't')
1973b6d57f2SBram Moolenaar    endfunc
1983b6d57f2SBram Moolenaar    call timer_start(10, 'FeedQ')
1993b6d57f2SBram Moolenaar    g/^/vi|HJ
2003b6d57f2SBram Moolenaar    call writefile(['done'], 'Xdidexmode')
2013b6d57f2SBram Moolenaar    qall!
2023b6d57f2SBram Moolenaar  END
2033b6d57f2SBram Moolenaar  call writefile(lines, 'Xexmodescript')
2043b6d57f2SBram Moolenaar  call assert_equal(1, RunVim([], [], '-e -s -S Xexmodescript'))
2053b6d57f2SBram Moolenaar  call assert_equal(['done'], readfile('Xdidexmode'))
2063b6d57f2SBram Moolenaar
207f637bcebSBram Moolenaar  call delete('logfile')
2083b6d57f2SBram Moolenaar  call delete('Xdidexmode')
2093b6d57f2SBram Moolenaar  call delete('Xexmodescript')
2103b6d57f2SBram Moolenaarendfunc
2113b6d57f2SBram Moolenaar
2121d859e24SBram Moolenaarfunc Test_ex_mode_count_overflow()
21397202d95SBram Moolenaar  " The multiplication causes an integer overflow
21497202d95SBram Moolenaar  CheckNotAsan
21597202d95SBram Moolenaar
2161d859e24SBram Moolenaar  " this used to cause a crash
2171d859e24SBram Moolenaar  let lines =<< trim END
2181d859e24SBram Moolenaar    call feedkeys("\<Esc>Q\<CR>")
2191d859e24SBram Moolenaar    v9|9silent! vi|333333233333y32333333%O
2201d859e24SBram Moolenaar    call writefile(['done'], 'Xdidexmode')
2211d859e24SBram Moolenaar    qall!
2221d859e24SBram Moolenaar  END
2231d859e24SBram Moolenaar  call writefile(lines, 'Xexmodescript')
2241d859e24SBram Moolenaar  call assert_equal(1, RunVim([], [], '-e -s -S Xexmodescript -c qa'))
2251d859e24SBram Moolenaar  call assert_equal(['done'], readfile('Xdidexmode'))
2261d859e24SBram Moolenaar
2271d859e24SBram Moolenaar  call delete('Xdidexmode')
2281d859e24SBram Moolenaar  call delete('Xexmodescript')
2291d859e24SBram Moolenaarendfunc
2301d859e24SBram Moolenaar
231e20b9eceSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
232