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