1" Tests for various Visual mode. 2if !has('visual') 3 finish 4endif 5 6 7func Test_block_shift_multibyte() 8 " Uses double-wide character. 9 if !has('multi_byte') 10 return 11 endif 12 split 13 call setline(1, ['xヹxxx', 'ヹxxx']) 14 exe "normal 1G0l\<C-V>jl>" 15 call assert_equal('x ヹxxx', getline(1)) 16 call assert_equal(' ヹxxx', getline(2)) 17 q! 18endfunc 19 20func Test_block_shift_overflow() 21 " This used to cause a multiplication overflow followed by a crash. 22 new 23 normal ii 24 exe "normal \<C-V>876543210>" 25 q! 26endfunc 27 28func Test_dotregister_paste() 29 new 30 exe "norm! ihello world\<esc>" 31 norm! 0ve".p 32 call assert_equal('hello world world', getline(1)) 33 q! 34endfunc 35 36func Test_Visual_ctrl_o() 37 new 38 call setline(1, ['one', 'two', 'three']) 39 call cursor(1,2) 40 set noshowmode 41 set tw=0 42 call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx') 43 call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3)) 44 call assert_equal(88, &tw) 45 set tw& 46 bw! 47endfu 48 49func Test_Visual_vapo() 50 new 51 normal oxx 52 normal vapo 53 bwipe! 54endfunc 55 56func Test_Visual_inner_quote() 57 new 58 normal oxX 59 normal vki' 60 bwipe! 61endfunc 62 63" Test for Visual mode not being reset causing E315 error. 64func TriggerTheProblem() 65 " At this point there is no visual selection because :call reset it. 66 " Let's restore the selection: 67 normal gv 68 '<,'>del _ 69 try 70 exe "normal \<Esc>" 71 catch /^Vim\%((\a\+)\)\=:E315/ 72 echom 'Snap! E315 error!' 73 let g:msg = 'Snap! E315 error!' 74 endtry 75endfunc 76 77func Test_visual_mode_reset() 78 enew 79 let g:msg = "Everything's fine." 80 enew 81 setl buftype=nofile 82 call append(line('$'), 'Delete this line.') 83 84 " NOTE: this has to be done by a call to a function because executing :del 85 " the ex-way will require the colon operator which resets the visual mode 86 " thus preventing the problem: 87 exe "normal! GV:call TriggerTheProblem()\<CR>" 88 call assert_equal("Everything's fine.", g:msg) 89 90endfunc 91 92" Test for visual block shift and tab characters. 93func Test_block_shift_tab() 94 enew! 95 call append(0, repeat(['one two three'], 5)) 96 call cursor(1,1) 97 exe "normal i\<C-G>u" 98 exe "normal fe\<C-V>4jR\<Esc>ugvr1" 99 call assert_equal('on1 two three', getline(1)) 100 call assert_equal('on1 two three', getline(2)) 101 call assert_equal('on1 two three', getline(5)) 102 103 enew! 104 call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5)) 105 call cursor(1,1) 106 exe "normal \<C-V>4jI \<Esc>j<<11|D" 107 exe "normal j7|a\<Tab>\<Tab>" 108 exe "normal j7|a\<Tab>\<Tab> " 109 exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<" 110 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1)) 111 call assert_equal('abcdefghij', getline(2)) 112 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3)) 113 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4)) 114 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5)) 115 116 %s/\s\+//g 117 call cursor(1,1) 118 exe "normal \<C-V>4jI \<Esc>j<<" 119 exe "normal j7|a\<Tab>\<Tab>" 120 exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>" 121 exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<" 122 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1)) 123 call assert_equal('abcdefghij', getline(2)) 124 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3)) 125 call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4)) 126 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5)) 127 128 enew! 129endfunc 130 131" Tests Blockwise Visual when there are TABs before the text. 132func Test_blockwise_visual() 133 enew! 134 call append(0, ['123456', 135 \ '234567', 136 \ '345678', 137 \ '', 138 \ 'test text test tex start here', 139 \ "\t\tsome text", 140 \ "\t\ttest text", 141 \ 'test text']) 142 call cursor(1,1) 143 exe "normal /start here$\<CR>" 144 exe 'normal "by$' . "\<C-V>jjlld" 145 exe "normal /456$\<CR>" 146 exe "normal \<C-V>jj" . '"bP' 147 call assert_equal(['123start here56', 148 \ '234start here67', 149 \ '345start here78', 150 \ '', 151 \ 'test text test tex rt here', 152 \ "\t\tsomext", 153 \ "\t\ttesext"], getline(1, 7)) 154 155 enew! 156endfunc 157 158" Test Virtual replace mode. 159func Test_virtual_replace() 160 if exists('&t_kD') 161 let save_t_kD = &t_kD 162 endif 163 if exists('&t_kb') 164 let save_t_kb = &t_kb 165 endif 166 exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08" 167 enew! 168 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 169 call cursor(1,1) 170 set ai bs=2 171 exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 172 call assert_equal([' 1', 173 \ ' A', 174 \ ' BCDEFGHIJ', 175 \ ' KL', 176 \ ' MNO', 177 \ ' PQR', 178 \ ], getline(1, 6)) 179 normal G 180 mark a 181 exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n" 182 exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29) 183 call assert_equal([' 1', 184 \ 'abcdefghi', 185 \ 'jk lmn', 186 \ ' opq rst', 187 \ 'uvwxyz'], getline(7, 11)) 188 normal G 189 exe "normal iab\tcdefghi\tjkl" 190 exe "normal 0gRAB......CDEFGHI.J\<Esc>o" 191 exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR" 192 call assert_equal(['AB......CDEFGHI.Jkl', 193 \ 'AB IJKLMNO QRst'], getline(12, 13)) 194 enew! 195 set noai bs&vim 196 if exists('save_t_kD') 197 let &t_kD = save_t_kD 198 endif 199 if exists('save_t_kb') 200 let &t_kb = save_t_kb 201 endif 202endfunc 203 204" Test Virtual replace mode. 205func Test_virtual_replace2() 206 enew! 207 set bs=2 208 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 209 call cursor(1,1) 210 " Test 1: Test that del deletes the newline 211 exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 212 call assert_equal(['0 1', 213 \ 'A', 214 \ 'BCDEFGHIJ', 215 \ ' KL', 216 \ 'MNO', 217 \ 'PQR', 218 \ ], getline(1, 6)) 219 " Test 2: 220 " a newline is not deleted, if no newline has been added in virtual replace mode 221 %d_ 222 call setline(1, ['abcd', 'efgh', 'ijkl']) 223 call cursor(2,1) 224 exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>" 225 call assert_equal(['abcd', 226 \ '123h', 227 \ 'ijkl'], getline(1, '$')) 228 " Test 3: 229 " a newline is deleted, if a newline has been inserted before in virtual replace mode 230 %d_ 231 call setline(1, ['abcd', 'efgh', 'ijkl']) 232 call cursor(2,1) 233 exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>" 234 call assert_equal(['abcd', 235 \ '1234', 236 \ 'ijkl'], getline(1, '$')) 237 " Test 4: 238 " delete add a newline, delete it, add it again and check undo 239 %d_ 240 call setline(1, ['abcd', 'efgh', 'ijkl']) 241 call cursor(2,1) 242 " break undo sequence explicitly 243 let &ul = &ul 244 exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>" 245 let &ul = &ul 246 call assert_equal(['abcd', 247 \ '123456', 248 \ ''], getline(1, '$')) 249 norm! u 250 call assert_equal(['abcd', 251 \ 'efgh', 252 \ 'ijkl'], getline(1, '$')) 253 " clean up 254 %d_ 255 set bs&vim 256endfunc 257