1" Test editing line in Ex mode (see :help Q and :help gQ). 2 3source check.vim 4 5" Helper function to test editing line in Q Ex mode 6func Ex_Q(cmd) 7 " Is there a simpler way to test editing Ex line? 8 call feedkeys("Q" 9 \ .. "let s:test_ex =<< END\<CR>" 10 \ .. a:cmd .. "\<CR>" 11 \ .. "END\<CR>" 12 \ .. "visual\<CR>", 'tx') 13 return s:test_ex[0] 14endfunc 15 16" Helper function to test editing line in gQ Ex mode 17func Ex_gQ(cmd) 18 call feedkeys("gQ" .. a:cmd .. "\<C-b>\"\<CR>", 'tx') 19 let ret = @:[1:] " Remove leading quote. 20 call feedkeys("visual\<CR>", 'tx') 21 return ret 22endfunc 23 24" Helper function to test editing line with both Q and gQ Ex mode. 25func Ex(cmd) 26 return [Ex_Q(a:cmd), Ex_gQ(a:cmd)] 27endfunc 28 29" Test editing line in Ex mode (both Q and gQ) 30func Test_ex_mode() 31 let encoding_save = &encoding 32 set sw=2 33 34 for e in ['utf8', 'latin1'] 35 exe 'set encoding=' . e 36 37 call assert_equal(['bar', 'bar'], Ex("foo bar\<C-u>bar"), e) 38 call assert_equal(["1\<C-u>2", "1\<C-u>2"], Ex("1\<C-v>\<C-u>2"), e) 39 call assert_equal(["1\<C-b>2\<C-e>3", '213'], Ex("1\<C-b>2\<C-e>3"), e) 40 call assert_equal(['0123', '2013'], Ex("01\<Home>2\<End>3"), e) 41 call assert_equal(['0123', '0213'], Ex("01\<Left>2\<Right>3"), e) 42 call assert_equal(['01234', '0342'], Ex("012\<Left>\<Left>\<Insert>3\<Insert>4"), e) 43 call assert_equal(["foo bar\<C-w>", 'foo '], Ex("foo bar\<C-w>"), e) 44 call assert_equal(['foo', 'foo'], Ex("fooba\<Del>\<Del>"), e) 45 call assert_equal(["foo\tbar", 'foobar'], Ex("foo\<Tab>bar"), e) 46 call assert_equal(["abbrev\t", 'abbreviate'], Ex("abbrev\<Tab>"), e) 47 call assert_equal([' 1', "1\<C-t>\<C-t>"], Ex("1\<C-t>\<C-t>"), e) 48 call assert_equal([' 1', "1\<C-t>\<C-t>"], Ex("1\<C-t>\<C-t>\<C-d>"), e) 49 call assert_equal([' foo', ' foo'], Ex(" foo\<C-d>"), e) 50 call assert_equal(['foo', ' foo0'], Ex(" foo0\<C-d>"), e) 51 call assert_equal(['foo', ' foo^'], Ex(" foo^\<C-d>"), e) 52 call assert_equal(['foo', 'foo'], 53 \ Ex("\<BS>\<C-H>\<Del>\<kDel>foo"), e) 54 " default wildchar <Tab> interferes with this test 55 set wildchar=<c-e> 56 call assert_equal(["a\tb", "a\tb"], Ex("a\t\t\<C-H>b"), e) 57 call assert_equal(["\t mn", "\tm\<C-T>n"], Ex("\tm\<C-T>n"), e) 58 set wildchar& 59 endfor 60 61 set sw& 62 let &encoding = encoding_save 63endfunc 64 65" Test substitute confirmation prompt :%s/pat/str/c in Ex mode 66func Test_Ex_substitute() 67 CheckRunVimInTerminal 68 let buf = RunVimInTerminal('', {'rows': 6}) 69 70 call term_sendkeys(buf, ":call setline(1, ['foo foo', 'foo foo', 'foo foo'])\<CR>") 71 call term_sendkeys(buf, ":set number\<CR>") 72 call term_sendkeys(buf, "gQ") 73 call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000) 74 75 call term_sendkeys(buf, "%s/foo/bar/gc\<CR>") 76 call WaitForAssert({-> assert_match(' 1 foo foo', term_getline(buf, 5))}, 77 \ 1000) 78 call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 1000) 79 call term_sendkeys(buf, "n\<CR>") 80 call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 81 \ 1000) 82 call term_sendkeys(buf, "y\<CR>") 83 84 call term_sendkeys(buf, "q\<CR>") 85 call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000) 86 87 " Pressing enter in ex mode should print the current line 88 call term_sendkeys(buf, "\<CR>") 89 call WaitForAssert({-> assert_match(' 3 foo foo', 90 \ term_getline(buf, 5))}, 1000) 91 92 call term_sendkeys(buf, ":vi\<CR>") 93 call WaitForAssert({-> assert_match('foo bar', term_getline(buf, 1))}, 1000) 94 95 call StopVimInTerminal(buf) 96endfunc 97 98" Test for displaying lines from an empty buffer in Ex mode 99func Test_Ex_emptybuf() 100 new 101 call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E749:') 102 call setline(1, "abc") 103 call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E501:') 104 call assert_fails('call feedkeys("Q%d\<CR>", "xt")', 'E749:') 105 close! 106endfunc 107 108" Test for the :open command 109func Test_open_command() 110 new 111 call setline(1, ['foo foo', 'foo bar', 'foo baz']) 112 call feedkeys("Qopen\<CR>j", 'xt') 113 call assert_equal('foo bar', getline('.')) 114 call feedkeys("Qopen /bar/\<CR>", 'xt') 115 call assert_equal(5, col('.')) 116 call assert_fails('call feedkeys("Qopen /baz/\<CR>", "xt")', 'E479:') 117 close! 118endfunc 119 120" Test for :g/pat/visual to run vi commands in Ex mode 121" This used to hang Vim before 8.2.0274. 122func Test_Ex_global() 123 new 124 call setline(1, ['', 'foo', 'bar', 'foo', 'bar', 'foo']) 125 call feedkeys("Q\<bs>g/bar/visual\<CR>$rxQ$ryQvisual\<CR>j", "xt") 126 call assert_equal('bax', getline(3)) 127 call assert_equal('bay', getline(5)) 128 bwipe! 129endfunc 130 131" In Ex-mode, a backslash escapes a newline 132func Test_Ex_escape_enter() 133 call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt') 134 call assert_equal("a\rb", l) 135endfunc 136 137" Test for :append! command in Ex mode 138func Test_Ex_append() 139 new 140 call setline(1, "\t abc") 141 call feedkeys("Qappend!\npqr\nxyz\n.\nvisual\n", 'xt') 142 call assert_equal(["\t abc", "\t pqr", "\t xyz"], getline(1, '$')) 143 close! 144endfunc 145 146" In Ex-mode, backslashes at the end of a command should be halved. 147func Test_Ex_echo_backslash() 148 " This test works only when the language is English 149 CheckEnglish 150 let bsl = '\\\\' 151 let bsl2 = '\\\' 152 call assert_fails('call feedkeys("Qecho " .. bsl .. "\nvisual\n", "xt")', 153 \ "E15: Invalid expression: \\\\") 154 call assert_fails('call feedkeys("Qecho " .. bsl2 .. "\nm\nvisual\n", "xt")', 155 \ "E15: Invalid expression: \\\nm") 156endfunc 157 158func Test_ex_mode_errors() 159 " Not allowed to enter ex mode when text is locked 160 au InsertCharPre <buffer> normal! gQ<CR> 161 let caught_e523 = 0 162 try 163 call feedkeys("ix\<esc>", 'xt') 164 catch /^Vim\%((\a\+)\)\=:E523/ " catch E523 165 let caught_e523 = 1 166 endtry 167 call assert_equal(1, caught_e523) 168 au! InsertCharPre 169endfunc 170 171" vim: shiftwidth=2 sts=2 expandtab 172