1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 02:10:05 +08:00
SpaceVim/bundle/vim-textobj-user/t/move.vim
2020-06-13 14:06:35 +08:00

269 lines
9.2 KiB
VimL

" Anchored-word is <a> <word> <like> <this>.
" But <> is not valid, because it doesn't contain a word.
" "pattern" "{{{1
call textobj#user#plugin('anchoredwordp', {
\ '-': {
\ 'pattern': '<\a\+>',
\ 'move-n': '[pn]',
\ 'move-N': '[pN]',
\ 'move-p': '[pp]',
\ 'move-P': '[pP]',
\ }
\ })
" "move-*-function" "{{{1
let s:pattern = '<\a\+>'
function! s:regionize(bp, ep)
if a:bp[0] != 0 && a:ep[0] != 0
return ['v', [0, a:bp[0], a:bp[1], 0], [0, a:ep[0], a:ep[1], 0]]
else
return 0
endif
endfunction
function! s:_move(type)
if a:type ==# 'n'
let bp = searchpos(s:pattern, 'W')
let ep = searchpos(s:pattern, 'ceW')
elseif a:type ==# 'N'
let ep = searchpos(s:pattern, 'eW')
let bp = searchpos(s:pattern, 'bcW')
call cursor(ep)
elseif a:type ==# 'p'
let bp = searchpos(s:pattern, 'bW')
let ep = searchpos(s:pattern, 'ceW')
call cursor(bp)
else " if a:type ==# 'P'
let ep = searchpos(s:pattern, 'beW')
let bp = searchpos(s:pattern, 'bcW')
endif
return s:regionize(bp, ep)
endfunction
function! s:move(type, count)
for i in range(a:count)
silent! unlet r
let r = s:_move(a:type)
if r is 0
break
endif
let rr = r
endfor
return exists('rr') ? rr : 0
endfunction
function! Move_n()
return s:move('n', v:count1)
endfunction
function! Move_N()
return s:move('N', v:count1)
endfunction
function! Move_p()
return s:move('p', v:count1)
endfunction
function! Move_P()
return s:move('P', v:count1)
endfunction
call textobj#user#plugin('anchoredwordf', {
\ '-': {
\ 'move-n': '[fn]',
\ 'move-n-function': 'Move_n',
\ 'move-N': '[fN]',
\ 'move-N-function': 'Move_N',
\ 'move-p': '[fp]',
\ 'move-p-function': 'Move_p',
\ 'move-P': '[fP]',
\ 'move-P-function': 'Move_P',
\ }
\ })
" Test cases "{{{1
function! s:test_on_normal_mode(type, cases)
for [il, ic, c, d, ebl, ebc, eel, eec, eyanked] in a:cases
call cursor(il, ic)
Expect [il, ic] == getpos('.')[1:2]
execute 'silent! normal' printf('%s[%s%s]', c ? c : '', a:type, d)
let [_, al, ac, _] = getpos('.')
let el = d =~# '[pP]' ? ebl : eel
let ec = d =~# '[pP]' ? ebc : eec
Expect [il, ic, c, d, al, ac] == [il, ic, c, d, el, ec]
endfor
endfunction
function! s:test_on_visual_mode(type, cases, variant)
for [il, ic, c, d, ebl, ebc, eel, eec, eyanked] in a:cases
call cursor(il, ic)
Expect [il, ic] == getpos('.')[1:2]
if a:variant ==# 'basic'
execute 'silent! normal' printf("v%s[%s%s]\<Esc>", c ? c : '', a:type, d)
let [_, al, ac, _] = getpos('.')
let el = d =~# '[pP]' ? ebl : eel
let ec = d =~# '[pP]' ? ebc : eec
Expect [a:variant, il, ic, c, d, al, ac] == [a:variant, il, ic, c, d, el, ec]
elseif a:variant ==# 'kept'
let @0 = 'some random string'
" If Visual mode is not kept by the move command, nothing is yanked.
execute 'silent! normal' printf("v%s[%s%s]y", c ? c : '', a:type, d)
let [vbl, vbc] = getpos("'<")[1:2]
let [vel, vec] = getpos("'>")[1:2]
Expect [vbl, vbc] == getpos('.')[1:2]
Expect [a:variant, il, ic, c, d, vbl, vbc, vel, vec, @0] == [a:variant, il, ic, c, d, ebl, ebc, eel, eec, eyanked]
elseif a:variant ==# 'manually_repeated'
let @0 = 'some random string'
" If Visual mode is not kept by the move command, nothing is yanked.
silent! normal! v
for i in range(max([1, c]))
execute 'silent! normal' printf("[%s%s]", a:type, d)
endfor
silent! normal! y
let [vbl, vbc] = getpos("'<")[1:2]
let [vel, vec] = getpos("'>")[1:2]
Expect [vbl, vbc] == getpos('.')[1:2]
Expect [a:variant, il, ic, c, d, vbl, vbc, vel, vec, @0] == [a:variant, il, ic, c, d, ebl, ebc, eel, eec, eyanked]
else
throw 'unreachable'
endif
endfor
endfunction
function! s:test_on_operator_pending_mode(type, cases)
for [il, ic, c, d, ebl, ebc, eel, eec, eyanked] in a:cases
call cursor(il, ic)
Expect [il, ic] == getpos('.')[1:2]
execute 'silent! normal' printf('y%s[%s%s]', c ? c : '', a:type, d)
let [_, abl, abc, _] = getpos("'[")
let [_, ael, aec, _] = getpos("']")
Expect [il, ic, c, d, abl, abc, ael, aec]
\ == [il, ic, c, d, ebl, ebc, eel, eec]
endfor
endfunction
let s:cases = [
\ [1, 4, 0, 'n', 1, 4, 1, 5, ' <'],
\ [1, 5, 0, 'n', 1, 5, 1, 29, '<quick> brown fox jumps <'],
\ [1, 6, 0, 'n', 1, 6, 1, 29, 'quick> brown fox jumps <'],
\ [1, 10, 0, 'n', 1, 10, 1, 29, 'k> brown fox jumps <'],
\ [1, 11, 0, 'n', 1, 11, 1, 29, '> brown fox jumps <'],
\ [1, 12, 0, 'n', 1, 12, 1, 29, ' brown fox jumps <'],
\ [2, 11, 0, 'n', 2, 11, 2, 12, ' <'],
\ [2, 12, 0, 'n', 2, 12, 2, 12, '<'],
\ [2, 13, 0, 'n', 2, 13, 2, 13, 'b'],
\ [2, 17, 0, 'n', 2, 17, 2, 17, 'n'],
\ [2, 18, 0, 'n', 2, 18, 2, 18, '>'],
\ [2, 19, 0, 'n', 2, 19, 2, 19, ' '],
\ [1, 1, 1, 'n', 1, 1, 1, 5, 'The <'],
\ [1, 1, 2, 'n', 1, 1, 1, 29, 'The <quick> brown fox jumps <'],
\ [1, 1, 3, 'n', 1, 1, 2, 12, "The <quick> brown fox jumps <over> the lazy <dog\nThe> quick <"],
\ [1, 1, 4, 'n', 1, 1, 2, 12, "The <quick> brown fox jumps <over> the lazy <dog\nThe> quick <"],
\
\ [1, 4, 0, 'N', 1, 4, 1, 11, ' <quick>'],
\ [1, 5, 0, 'N', 1, 5, 1, 11, '<quick>'],
\ [1, 6, 0, 'N', 1, 6, 1, 11, 'quick>'],
\ [1, 10, 0, 'N', 1, 10, 1, 11, 'k>'],
\ [1, 11, 0, 'N', 1, 11, 1, 34, '> brown fox jumps <over>'],
\ [1, 12, 0, 'N', 1, 12, 1, 34, ' brown fox jumps <over>'],
\ [2, 11, 0, 'N', 2, 11, 2, 18, ' <brown>'],
\ [2, 12, 0, 'N', 2, 12, 2, 18, '<brown>'],
\ [2, 13, 0, 'N', 2, 13, 2, 18, 'brown>'],
\ [2, 17, 0, 'N', 2, 17, 2, 18, 'n>'],
\ [2, 18, 0, 'N', 2, 18, 2, 18, '>'],
\ [2, 19, 0, 'N', 2, 19, 2, 19, ' '],
\ [1, 1, 1, 'N', 1, 1, 1, 11, 'The <quick>'],
\ [1, 1, 2, 'N', 1, 1, 1, 34, 'The <quick> brown fox jumps <over>'],
\ [1, 1, 3, 'N', 1, 1, 2, 18, "The <quick> brown fox jumps <over> the lazy <dog\nThe> quick <brown>"],
\ [1, 1, 4, 'N', 1, 1, 2, 18, "The <quick> brown fox jumps <over> the lazy <dog\nThe> quick <brown>"],
\
\ [1, 4, 0, 'p', 1, 4, 1, 4, ' '],
\ [1, 5, 0, 'p', 1, 5, 1, 5, '<'],
\ [1, 6, 0, 'p', 1, 5, 1, 6, '<q'],
\ [1, 10, 0, 'p', 1, 5, 1, 10, '<quick'],
\ [1, 11, 0, 'p', 1, 5, 1, 11, '<quick>'],
\ [1, 12, 0, 'p', 1, 5, 1, 12, '<quick> '],
\ [2, 11, 0, 'p', 1, 29, 2, 11, "<over> the lazy <dog\nThe> quick "],
\ [2, 12, 0, 'p', 1, 29, 2, 12, "<over> the lazy <dog\nThe> quick <"],
\ [2, 13, 0, 'p', 2, 12, 2, 13, '<b'],
\ [2, 17, 0, 'p', 2, 12, 2, 17, '<brown'],
\ [2, 18, 0, 'p', 2, 12, 2, 18, '<brown>'],
\ [2, 19, 0, 'p', 2, 12, 2, 19, '<brown> '],
\ [2, 48, 1, 'p', 2, 12, 2, 48, '<brown> fox <jumps over the> lazy dog'],
\ [2, 48, 2, 'p', 1, 29, 2, 48, "<over> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\ [2, 48, 3, 'p', 1, 5, 2, 48, "<quick> brown fox jumps <over> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\ [2, 48, 4, 'p', 1, 5, 2, 48, "<quick> brown fox jumps <over> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\
\ [1, 4, 0, 'P', 1, 4, 1, 4, ' '],
\ [1, 5, 0, 'P', 1, 5, 1, 5, '<'],
\ [1, 6, 0, 'P', 1, 6, 1, 6, 'q'],
\ [1, 10, 0, 'P', 1, 10, 1, 10, 'k'],
\ [1, 11, 0, 'P', 1, 11, 1, 11, '>'],
\ [1, 12, 0, 'P', 1, 11, 1, 12, '> '],
\ [2, 11, 0, 'P', 1, 34, 2, 11, "> the lazy <dog\nThe> quick "],
\ [2, 12, 0, 'P', 1, 34, 2, 12, "> the lazy <dog\nThe> quick <"],
\ [2, 13, 0, 'P', 1, 34, 2, 13, "> the lazy <dog\nThe> quick <b"],
\ [2, 17, 0, 'P', 1, 34, 2, 17, "> the lazy <dog\nThe> quick <brown"],
\ [2, 18, 0, 'P', 1, 34, 2, 18, "> the lazy <dog\nThe> quick <brown>"],
\ [2, 19, 0, 'P', 2, 18, 2, 19, '> '],
\ [2, 48, 1, 'P', 2, 18, 2, 48, '> fox <jumps over the> lazy dog'],
\ [2, 48, 2, 'P', 1, 34, 2, 48, "> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\ [2, 48, 3, 'P', 1, 11, 2, 48, "> brown fox jumps <over> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\ [2, 48, 4, 'P', 1, 11, 2, 48, "> brown fox jumps <over> the lazy <dog\nThe> quick <brown> fox <jumps over the> lazy dog"],
\ ]
" }}}1
describe '"move-*"'
before
new
put ='The <quick> brown fox jumps <over> the lazy <dog'
put ='The> quick <brown> fox <jumps over the> lazy dog'
1 delete _
end
after
close!
end
context 'defined by "pattern"'
it 'works in Normal mode'
call s:test_on_normal_mode('p', s:cases)
end
it 'works in Visual mode'
call s:test_on_visual_mode('p', s:cases, 'basic')
call s:test_on_visual_mode('p', s:cases, 'kept')
call s:test_on_visual_mode('p', s:cases, 'manually_repeated')
end
it 'works in Operator-pending mode'
call s:test_on_operator_pending_mode('p', s:cases)
end
end
context 'defined by "move-*-function"'
it 'works in Normal mode'
call s:test_on_normal_mode('f', s:cases)
end
it 'works in Visual mode'
call s:test_on_visual_mode('f', s:cases, 'basic')
call s:test_on_visual_mode('f', s:cases, 'kept')
call s:test_on_visual_mode('f', s:cases, 'manually_repeated')
end
it 'works in Operator-pending mode'
call s:test_on_operator_pending_mode('f', s:cases)
end
end
end
" vim: foldmethod=marker