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>foo"), e) 54 endfor 55 56 set sw& 57 let &encoding = encoding_save 58endfunc 59 60" Test substitute confirmation prompt :%s/pat/str/c in Ex mode 61func Test_Ex_substitute() 62 CheckRunVimInTerminal 63 let buf = RunVimInTerminal('', {'rows': 6}) 64 65 call term_sendkeys(buf, ":call setline(1, ['foo foo', 'foo foo', 'foo foo'])\<CR>") 66 call term_sendkeys(buf, ":set number\<CR>") 67 call term_sendkeys(buf, "gQ") 68 call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000) 69 70 call term_sendkeys(buf, "%s/foo/bar/gc\<CR>") 71 call WaitForAssert({-> assert_match(' 1 foo foo', term_getline(buf, 5))}, 72 \ 1000) 73 call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 1000) 74 call term_sendkeys(buf, "n\<CR>") 75 call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 76 \ 1000) 77 call term_sendkeys(buf, "y\<CR>") 78 79 call term_sendkeys(buf, "q\<CR>") 80 call WaitForAssert({-> assert_match(':', term_getline(buf, 6))}, 1000) 81 82 " Pressing enter in ex mode should print the current line 83 call term_sendkeys(buf, "\<CR>") 84 call WaitForAssert({-> assert_match(' 3 foo foo', 85 \ term_getline(buf, 5))}, 1000) 86 87 call term_sendkeys(buf, ":vi\<CR>") 88 call WaitForAssert({-> assert_match('foo bar', term_getline(buf, 1))}, 1000) 89 90 call term_sendkeys(buf, ":q!\n") 91 call StopVimInTerminal(buf) 92endfunc 93 94" Test for displaying lines from an empty buffer in Ex mode 95func Test_Ex_emptybuf() 96 new 97 call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E749:') 98 call setline(1, "abc") 99 call assert_fails('call feedkeys("Q\<CR>", "xt")', 'E501:') 100 call assert_fails('call feedkeys("Q%d\<CR>", "xt")', 'E749:') 101 close! 102endfunc 103 104" Test for the :open command 105func Test_open_command() 106 new 107 call setline(1, ['foo foo', 'foo bar', 'foo baz']) 108 call feedkeys("Qopen\<CR>j", 'xt') 109 call assert_equal('foo bar', getline('.')) 110 call feedkeys("Qopen /bar/\<CR>", 'xt') 111 call assert_equal(5, col('.')) 112 call assert_fails('call feedkeys("Qopen /baz/\<CR>", "xt")', 'E479:') 113 close! 114endfunc 115 116" Test for :g/pat/visual to run vi commands in Ex mode 117" This used to hang Vim before 8.2.0274. 118func Test_Ex_global() 119 new 120 call setline(1, ['', 'foo', 'bar', 'foo', 'bar', 'foo']) 121 call feedkeys("Q\<bs>g/bar/visual\<CR>$rxQ$ryQvisual\<CR>j", "xt") 122 call assert_equal('bax', getline(3)) 123 call assert_equal('bay', getline(5)) 124 bwipe! 125endfunc 126 127" In Ex-mode, a backslash escapes a newline 128func Test_Ex_escape_enter() 129 call feedkeys("gQlet l = \"a\\\<kEnter>b\"\<cr>vi\<cr>", 'xt') 130 call assert_equal("a\rb", l) 131endfunc 132 133" Test for :append! command in Ex mode 134func Test_Ex_append() 135 new 136 call setline(1, "\t abc") 137 call feedkeys("Qappend!\npqr\nxyz\n.\nvisual\n", 'xt') 138 call assert_equal(["\t abc", "\t pqr", "\t xyz"], getline(1, '$')) 139 close! 140endfunc 141 142" vim: shiftwidth=2 sts=2 expandtab 143