2017-10-22 03:13:46 -07:00
|
|
|
" Tests for various Visual mode.
|
2016-07-11 18:27:56 -07:00
|
|
|
if !has('visual')
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
|
2018-01-21 02:26:40 -07:00
|
|
|
|
2016-07-11 18:27:56 -07:00
|
|
|
func Test_block_shift_multibyte()
|
2017-10-22 03:13:46 -07:00
|
|
|
" Uses double-wide character.
|
|
|
|
if !has('multi_byte')
|
|
|
|
return
|
|
|
|
endif
|
2016-07-11 18:27:56 -07:00
|
|
|
split
|
|
|
|
call setline(1, ['xヹxxx', 'ヹxxx'])
|
|
|
|
exe "normal 1G0l\<C-V>jl>"
|
|
|
|
call assert_equal('x ヹxxx', getline(1))
|
|
|
|
call assert_equal(' ヹxxx', getline(2))
|
|
|
|
q!
|
|
|
|
endfunc
|
2017-09-10 03:21:52 -07:00
|
|
|
|
2018-07-14 15:03:20 -07:00
|
|
|
func Test_block_shift_overflow()
|
|
|
|
" This used to cause a multiplication overflow followed by a crash.
|
|
|
|
new
|
|
|
|
normal ii
|
|
|
|
exe "normal \<C-V>876543210>"
|
|
|
|
q!
|
|
|
|
endfunc
|
|
|
|
|
2017-09-10 03:21:52 -07:00
|
|
|
func Test_Visual_ctrl_o()
|
|
|
|
new
|
|
|
|
call setline(1, ['one', 'two', 'three'])
|
|
|
|
call cursor(1,2)
|
|
|
|
set noshowmode
|
|
|
|
set tw=0
|
|
|
|
call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx')
|
|
|
|
call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3))
|
|
|
|
call assert_equal(88, &tw)
|
|
|
|
set tw&
|
|
|
|
bw!
|
|
|
|
endfu
|
2017-09-23 18:48:52 -07:00
|
|
|
|
|
|
|
func Test_Visual_vapo()
|
|
|
|
new
|
|
|
|
normal oxx
|
|
|
|
normal vapo
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
2017-10-22 03:13:46 -07:00
|
|
|
|
|
|
|
func Test_dotregister_paste()
|
|
|
|
new
|
|
|
|
exe "norm! ihello world\<esc>"
|
|
|
|
norm! 0ve".p
|
|
|
|
call assert_equal('hello world world', getline(1))
|
|
|
|
q!
|
|
|
|
endfunc
|
2018-01-01 08:08:26 -07:00
|
|
|
|
|
|
|
func Test_Visual_inner_quote()
|
|
|
|
new
|
|
|
|
normal oxX
|
|
|
|
normal vki'
|
|
|
|
bwipe!
|
|
|
|
endfunc
|
2018-02-02 15:14:30 -07:00
|
|
|
|
|
|
|
" Test for visual block shift and tab characters.
|
|
|
|
func Test_block_shift_tab()
|
|
|
|
enew!
|
|
|
|
call append(0, repeat(['one two three'], 5))
|
|
|
|
call cursor(1,1)
|
|
|
|
exe "normal i\<C-G>u"
|
|
|
|
exe "normal fe\<C-V>4jR\<Esc>ugvr1"
|
|
|
|
call assert_equal('on1 two three', getline(1))
|
|
|
|
call assert_equal('on1 two three', getline(2))
|
|
|
|
call assert_equal('on1 two three', getline(5))
|
|
|
|
|
|
|
|
enew!
|
|
|
|
call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5))
|
|
|
|
call cursor(1,1)
|
|
|
|
exe "normal \<C-V>4jI \<Esc>j<<11|D"
|
|
|
|
exe "normal j7|a\<Tab>\<Tab>"
|
|
|
|
exe "normal j7|a\<Tab>\<Tab> "
|
|
|
|
exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<"
|
|
|
|
call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
|
|
|
|
call assert_equal('abcdefghij', getline(2))
|
|
|
|
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
|
|
|
|
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4))
|
|
|
|
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
|
|
|
|
|
|
|
|
%s/\s\+//g
|
|
|
|
call cursor(1,1)
|
|
|
|
exe "normal \<C-V>4jI \<Esc>j<<"
|
|
|
|
exe "normal j7|a\<Tab>\<Tab>"
|
|
|
|
exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>"
|
|
|
|
exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<"
|
|
|
|
call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
|
|
|
|
call assert_equal('abcdefghij', getline(2))
|
|
|
|
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
|
|
|
|
call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4))
|
|
|
|
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
|
|
|
|
|
|
|
|
enew!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Tests Blockwise Visual when there are TABs before the text.
|
|
|
|
func Test_blockwise_visual()
|
|
|
|
enew!
|
|
|
|
call append(0, ['123456',
|
|
|
|
\ '234567',
|
|
|
|
\ '345678',
|
|
|
|
\ '',
|
|
|
|
\ 'test text test tex start here',
|
|
|
|
\ "\t\tsome text",
|
|
|
|
\ "\t\ttest text",
|
|
|
|
\ 'test text'])
|
|
|
|
call cursor(1,1)
|
|
|
|
exe "normal /start here$\<CR>"
|
|
|
|
exe 'normal "by$' . "\<C-V>jjlld"
|
|
|
|
exe "normal /456$\<CR>"
|
|
|
|
exe "normal \<C-V>jj" . '"bP'
|
|
|
|
call assert_equal(['123start here56',
|
|
|
|
\ '234start here67',
|
|
|
|
\ '345start here78',
|
|
|
|
\ '',
|
|
|
|
\ 'test text test tex rt here',
|
|
|
|
\ "\t\tsomext",
|
|
|
|
\ "\t\ttesext"], getline(1, 7))
|
|
|
|
|
|
|
|
enew!
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Test Virtual replace mode.
|
|
|
|
func Test_virtual_replace()
|
2018-02-11 06:41:03 -07:00
|
|
|
throw 'skipped: TODO: '
|
2018-02-02 15:14:30 -07:00
|
|
|
exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
|
|
|
|
enew!
|
|
|
|
exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
|
|
|
|
call cursor(1,1)
|
|
|
|
set ai bs=2
|
|
|
|
exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
|
|
|
|
call assert_equal([' 1',
|
|
|
|
\ ' A',
|
|
|
|
\ ' BCDEFGHIJ',
|
|
|
|
\ ' KL',
|
|
|
|
\ ' MNO',
|
|
|
|
\ ' PQR',
|
|
|
|
\ ], getline(1, 6))
|
|
|
|
normal G
|
|
|
|
mark a
|
2018-02-11 06:41:03 -07:00
|
|
|
inoremap <C-D> <Del>
|
2018-02-02 15:14:30 -07:00
|
|
|
exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n"
|
|
|
|
exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29)
|
|
|
|
call assert_equal([' 1',
|
|
|
|
\ 'abcdefghi',
|
|
|
|
\ 'jk lmn',
|
|
|
|
\ ' opq rst',
|
|
|
|
\ 'uvwxyz'], getline(7, 11))
|
|
|
|
normal G
|
|
|
|
exe "normal iab\tcdefghi\tjkl"
|
|
|
|
exe "normal 0gRAB......CDEFGHI.J\<Esc>o"
|
|
|
|
exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR"
|
|
|
|
call assert_equal(['AB......CDEFGHI.Jkl',
|
|
|
|
\ 'AB IJKLMNO QRst'], getline(12, 13))
|
|
|
|
enew!
|
|
|
|
endfunc
|
2018-07-13 23:04:42 -07:00
|
|
|
|
|
|
|
" Test for Visual mode not being reset causing E315 error.
|
|
|
|
func TriggerTheProblem()
|
|
|
|
" At this point there is no visual selection because :call reset it.
|
|
|
|
" Let's restore the selection:
|
|
|
|
normal gv
|
|
|
|
'<,'>del _
|
|
|
|
try
|
|
|
|
exe "normal \<Esc>"
|
|
|
|
catch /^Vim\%((\a\+)\)\=:E315/
|
|
|
|
echom 'Snap! E315 error!'
|
|
|
|
let g:msg='Snap! E315 error!'
|
|
|
|
endtry
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_visual_mode_reset()
|
|
|
|
set belloff=all
|
|
|
|
enew
|
|
|
|
let g:msg="Everything's fine."
|
|
|
|
enew
|
|
|
|
setl buftype=nofile
|
|
|
|
call append(line('$'), 'Delete this line.')
|
|
|
|
|
|
|
|
" NOTE: this has to be done by a call to a function because executing :del
|
|
|
|
" the ex-way will require the colon operator which resets the visual mode
|
|
|
|
" thus preventing the problem:
|
|
|
|
exe "normal! GV:call TriggerTheProblem()\<CR>"
|
|
|
|
call assert_equal("Everything's fine.", g:msg)
|
|
|
|
|
|
|
|
set belloff&
|
|
|
|
endfunc
|