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 split 10 call setline(1, ['xヹxxx', 'ヹxxx']) 11 exe "normal 1G0l\<C-V>jl>" 12 call assert_equal('x ヹxxx', getline(1)) 13 call assert_equal(' ヹxxx', getline(2)) 14 q! 15endfunc 16 17func Test_block_shift_overflow() 18 " This used to cause a multiplication overflow followed by a crash. 19 new 20 normal ii 21 exe "normal \<C-V>876543210>" 22 q! 23endfunc 24 25func Test_dotregister_paste() 26 new 27 exe "norm! ihello world\<esc>" 28 norm! 0ve".p 29 call assert_equal('hello world world', getline(1)) 30 q! 31endfunc 32 33func Test_Visual_ctrl_o() 34 new 35 call setline(1, ['one', 'two', 'three']) 36 call cursor(1,2) 37 set noshowmode 38 set tw=0 39 call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx') 40 call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3)) 41 call assert_equal(88, &tw) 42 set tw& 43 bw! 44endfu 45 46func Test_Visual_vapo() 47 new 48 normal oxx 49 normal vapo 50 bwipe! 51endfunc 52 53func Test_Visual_inner_quote() 54 new 55 normal oxX 56 normal vki' 57 bwipe! 58endfunc 59 60" Test for Visual mode not being reset causing E315 error. 61func TriggerTheProblem() 62 " At this point there is no visual selection because :call reset it. 63 " Let's restore the selection: 64 normal gv 65 '<,'>del _ 66 try 67 exe "normal \<Esc>" 68 catch /^Vim\%((\a\+)\)\=:E315/ 69 echom 'Snap! E315 error!' 70 let g:msg = 'Snap! E315 error!' 71 endtry 72endfunc 73 74func Test_visual_mode_reset() 75 enew 76 let g:msg = "Everything's fine." 77 enew 78 setl buftype=nofile 79 call append(line('$'), 'Delete this line.') 80 81 " NOTE: this has to be done by a call to a function because executing :del 82 " the ex-way will require the colon operator which resets the visual mode 83 " thus preventing the problem: 84 exe "normal! GV:call TriggerTheProblem()\<CR>" 85 call assert_equal("Everything's fine.", g:msg) 86 87endfunc 88 89" Test for visual block shift and tab characters. 90func Test_block_shift_tab() 91 enew! 92 call append(0, repeat(['one two three'], 5)) 93 call cursor(1,1) 94 exe "normal i\<C-G>u" 95 exe "normal fe\<C-V>4jR\<Esc>ugvr1" 96 call assert_equal('on1 two three', getline(1)) 97 call assert_equal('on1 two three', getline(2)) 98 call assert_equal('on1 two three', getline(5)) 99 100 enew! 101 call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5)) 102 call cursor(1,1) 103 exe "normal \<C-V>4jI \<Esc>j<<11|D" 104 exe "normal j7|a\<Tab>\<Tab>" 105 exe "normal j7|a\<Tab>\<Tab> " 106 exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<" 107 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1)) 108 call assert_equal('abcdefghij', getline(2)) 109 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3)) 110 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4)) 111 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5)) 112 113 %s/\s\+//g 114 call cursor(1,1) 115 exe "normal \<C-V>4jI \<Esc>j<<" 116 exe "normal j7|a\<Tab>\<Tab>" 117 exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>" 118 exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<" 119 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1)) 120 call assert_equal('abcdefghij', getline(2)) 121 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3)) 122 call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4)) 123 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5)) 124 125 enew! 126endfunc 127 128" Tests Blockwise Visual when there are TABs before the text. 129func Test_blockwise_visual() 130 enew! 131 call append(0, ['123456', 132 \ '234567', 133 \ '345678', 134 \ '', 135 \ 'test text test tex start here', 136 \ "\t\tsome text", 137 \ "\t\ttest text", 138 \ 'test text']) 139 call cursor(1,1) 140 exe "normal /start here$\<CR>" 141 exe 'normal "by$' . "\<C-V>jjlld" 142 exe "normal /456$\<CR>" 143 exe "normal \<C-V>jj" . '"bP' 144 call assert_equal(['123start here56', 145 \ '234start here67', 146 \ '345start here78', 147 \ '', 148 \ 'test text test tex rt here', 149 \ "\t\tsomext", 150 \ "\t\ttesext"], getline(1, 7)) 151 152 enew! 153endfunc 154 155" Test swapping corners in blockwise visual mode with o and O 156func Test_blockwise_visual_o_O() 157 enew! 158 159 exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr " 160 exe "norm! gvO\<Esc>ra" 161 exe "norm! gvO\<Esc>rb" 162 exe "norm! gvo\<C-c>rc" 163 exe "norm! gvO\<C-c>rd" 164 165 call assert_equal(['..........', 166 \ '...c d..', 167 \ '... ..', 168 \ '...a b..', 169 \ '..........'], getline(1, '$')) 170 171 enew! 172endfun 173 174" Test Virtual replace mode. 175func Test_virtual_replace() 176 if exists('&t_kD') 177 let save_t_kD = &t_kD 178 endif 179 if exists('&t_kb') 180 let save_t_kb = &t_kb 181 endif 182 exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08" 183 enew! 184 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 185 call cursor(1,1) 186 set ai bs=2 187 exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 188 call assert_equal([' 1', 189 \ ' A', 190 \ ' BCDEFGHIJ', 191 \ ' KL', 192 \ ' MNO', 193 \ ' PQR', 194 \ ], getline(1, 6)) 195 normal G 196 mark a 197 exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n" 198 exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29) 199 call assert_equal([' 1', 200 \ 'abcdefghi', 201 \ 'jk lmn', 202 \ ' opq rst', 203 \ 'uvwxyz'], getline(7, 11)) 204 normal G 205 exe "normal iab\tcdefghi\tjkl" 206 exe "normal 0gRAB......CDEFGHI.J\<Esc>o" 207 exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR" 208 call assert_equal(['AB......CDEFGHI.Jkl', 209 \ 'AB IJKLMNO QRst'], getline(12, 13)) 210 enew! 211 set noai bs&vim 212 if exists('save_t_kD') 213 let &t_kD = save_t_kD 214 endif 215 if exists('save_t_kb') 216 let &t_kb = save_t_kb 217 endif 218endfunc 219 220" Test Virtual replace mode. 221func Test_virtual_replace2() 222 enew! 223 set bs=2 224 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 225 call cursor(1,1) 226 " Test 1: Test that del deletes the newline 227 exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 228 call assert_equal(['0 1', 229 \ 'A', 230 \ 'BCDEFGHIJ', 231 \ ' KL', 232 \ 'MNO', 233 \ 'PQR', 234 \ ], getline(1, 6)) 235 " Test 2: 236 " a newline is not deleted, if no newline has been added in virtual replace mode 237 %d_ 238 call setline(1, ['abcd', 'efgh', 'ijkl']) 239 call cursor(2,1) 240 exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>" 241 call assert_equal(['abcd', 242 \ '123h', 243 \ 'ijkl'], getline(1, '$')) 244 " Test 3: 245 " a newline is deleted, if a newline has been inserted before in virtual replace mode 246 %d_ 247 call setline(1, ['abcd', 'efgh', 'ijkl']) 248 call cursor(2,1) 249 exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>" 250 call assert_equal(['abcd', 251 \ '1234', 252 \ 'ijkl'], getline(1, '$')) 253 " Test 4: 254 " delete add a newline, delete it, add it again and check undo 255 %d_ 256 call setline(1, ['abcd', 'efgh', 'ijkl']) 257 call cursor(2,1) 258 " break undo sequence explicitly 259 let &ul = &ul 260 exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>" 261 let &ul = &ul 262 call assert_equal(['abcd', 263 \ '123456', 264 \ ''], getline(1, '$')) 265 norm! u 266 call assert_equal(['abcd', 267 \ 'efgh', 268 \ 'ijkl'], getline(1, '$')) 269 " clean up 270 %d_ 271 set bs&vim 272endfunc 273 274func Test_Visual_word_textobject() 275 new 276 call setline(1, ['First sentence. Second sentence.']) 277 278 " When start and end of visual area are identical, 'aw' or 'iw' select 279 " the whole word. 280 norm! 1go2fcvawy 281 call assert_equal('Second ', @") 282 norm! 1go2fcviwy 283 call assert_equal('Second', @") 284 285 " When start and end of visual area are not identical, 'aw' or 'iw' 286 " extend the word in direction of the end of the visual area. 287 norm! 1go2fcvlawy 288 call assert_equal('cond ', @") 289 norm! gv2awy 290 call assert_equal('cond sentence.', @") 291 292 norm! 1go2fcvliwy 293 call assert_equal('cond', @") 294 norm! gv2iwy 295 call assert_equal('cond sentence', @") 296 297 " Extend visual area in opposite direction. 298 norm! 1go2fcvhawy 299 call assert_equal(' Sec', @") 300 norm! gv2awy 301 call assert_equal(' sentence. Sec', @") 302 303 norm! 1go2fcvhiwy 304 call assert_equal('Sec', @") 305 norm! gv2iwy 306 call assert_equal('. Sec', @") 307 308 bwipe! 309endfunc 310 311func Test_Visual_sentence_textobject() 312 new 313 call setline(1, ['First sentence. Second sentence. Third', 'sentence. Fourth sentence']) 314 315 " When start and end of visual area are identical, 'as' or 'is' select 316 " the whole sentence. 317 norm! 1gofdvasy 318 call assert_equal('Second sentence. ', @") 319 norm! 1gofdvisy 320 call assert_equal('Second sentence.', @") 321 322 " When start and end of visual area are not identical, 'as' or 'is' 323 " extend the sentence in direction of the end of the visual area. 324 norm! 1gofdvlasy 325 call assert_equal('d sentence. ', @") 326 norm! gvasy 327 call assert_equal("d sentence. Third\nsentence. ", @") 328 329 norm! 1gofdvlisy 330 call assert_equal('d sentence.', @") 331 norm! gvisy 332 call assert_equal('d sentence. ', @") 333 norm! gvisy 334 call assert_equal("d sentence. Third\nsentence.", @") 335 336 " Extend visual area in opposite direction. 337 norm! 1gofdvhasy 338 call assert_equal(' Second', @") 339 norm! gvasy 340 call assert_equal("First sentence. Second", @") 341 342 norm! 1gofdvhisy 343 call assert_equal('Second', @") 344 norm! gvisy 345 call assert_equal(' Second', @") 346 norm! gvisy 347 call assert_equal('First sentence. Second', @") 348 349 bwipe! 350endfunc 351 352func Test_Visual_paragraph_textobject() 353 new 354 call setline(1, ['First line.', 355 \ '', 356 \ 'Second line.', 357 \ 'Third line.', 358 \ 'Fourth line.', 359 \ 'Fifth line.', 360 \ '', 361 \ 'Sixth line.']) 362 363 " When start and end of visual area are identical, 'ap' or 'ip' select 364 " the whole paragraph. 365 norm! 4ggvapy 366 call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n\n", @") 367 norm! 4ggvipy 368 call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n", @") 369 370 " When start and end of visual area are not identical, 'ap' or 'ip' 371 " extend the sentence in direction of the end of the visual area. 372 " FIXME: actually, it is not sufficient to have different start and 373 " end of visual selection, the start line and end line have to differ, 374 " which is not consistent with the documentation. 375 norm! 4ggVjapy 376 call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @") 377 norm! gvapy 378 call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @") 379 norm! 4ggVjipy 380 call assert_equal("Third line.\nFourth line.\nFifth line.\n", @") 381 norm! gvipy 382 call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @") 383 norm! gvipy 384 call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @") 385 386 " Extend visual area in opposite direction. 387 norm! 5ggVkapy 388 call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @") 389 norm! gvapy 390 call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @") 391 norm! 5ggVkipy 392 call assert_equal("Second line.\nThird line.\nFourth line.\n", @") 393 norma gvipy 394 call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @") 395 norm! gvipy 396 call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @") 397 398 bwipe! 399endfunc 400