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 swapping corners in blockwise visual mode with o and O 159func Test_blockwise_visual_o_O() 160 enew! 161 162 exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr " 163 exe "norm! gvO\<Esc>ra" 164 exe "norm! gvO\<Esc>rb" 165 exe "norm! gvo\<C-c>rc" 166 exe "norm! gvO\<C-c>rd" 167 168 call assert_equal(['..........', 169 \ '...c d..', 170 \ '... ..', 171 \ '...a b..', 172 \ '..........'], getline(1, '$')) 173 174 enew! 175endfun 176 177" Test Virtual replace mode. 178func Test_virtual_replace() 179 if exists('&t_kD') 180 let save_t_kD = &t_kD 181 endif 182 if exists('&t_kb') 183 let save_t_kb = &t_kb 184 endif 185 exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08" 186 enew! 187 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 188 call cursor(1,1) 189 set ai bs=2 190 exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 191 call assert_equal([' 1', 192 \ ' A', 193 \ ' BCDEFGHIJ', 194 \ ' KL', 195 \ ' MNO', 196 \ ' PQR', 197 \ ], getline(1, 6)) 198 normal G 199 mark a 200 exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n" 201 exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29) 202 call assert_equal([' 1', 203 \ 'abcdefghi', 204 \ 'jk lmn', 205 \ ' opq rst', 206 \ 'uvwxyz'], getline(7, 11)) 207 normal G 208 exe "normal iab\tcdefghi\tjkl" 209 exe "normal 0gRAB......CDEFGHI.J\<Esc>o" 210 exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR" 211 call assert_equal(['AB......CDEFGHI.Jkl', 212 \ 'AB IJKLMNO QRst'], getline(12, 13)) 213 enew! 214 set noai bs&vim 215 if exists('save_t_kD') 216 let &t_kD = save_t_kD 217 endif 218 if exists('save_t_kb') 219 let &t_kb = save_t_kb 220 endif 221endfunc 222 223" Test Virtual replace mode. 224func Test_virtual_replace2() 225 enew! 226 set bs=2 227 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" 228 call cursor(1,1) 229 " Test 1: Test that del deletes the newline 230 exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" 231 call assert_equal(['0 1', 232 \ 'A', 233 \ 'BCDEFGHIJ', 234 \ ' KL', 235 \ 'MNO', 236 \ 'PQR', 237 \ ], getline(1, 6)) 238 " Test 2: 239 " a newline is not deleted, if no newline has been added in virtual replace mode 240 %d_ 241 call setline(1, ['abcd', 'efgh', 'ijkl']) 242 call cursor(2,1) 243 exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>" 244 call assert_equal(['abcd', 245 \ '123h', 246 \ 'ijkl'], getline(1, '$')) 247 " Test 3: 248 " a newline is deleted, if a newline has been inserted before in virtual replace mode 249 %d_ 250 call setline(1, ['abcd', 'efgh', 'ijkl']) 251 call cursor(2,1) 252 exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>" 253 call assert_equal(['abcd', 254 \ '1234', 255 \ 'ijkl'], getline(1, '$')) 256 " Test 4: 257 " delete add a newline, delete it, add it again and check undo 258 %d_ 259 call setline(1, ['abcd', 'efgh', 'ijkl']) 260 call cursor(2,1) 261 " break undo sequence explicitly 262 let &ul = &ul 263 exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>" 264 let &ul = &ul 265 call assert_equal(['abcd', 266 \ '123456', 267 \ ''], getline(1, '$')) 268 norm! u 269 call assert_equal(['abcd', 270 \ 'efgh', 271 \ 'ijkl'], getline(1, '$')) 272 " clean up 273 %d_ 274 set bs&vim 275endfunc 276