我不知道這正是你想要的,但你可以嘗試下面的代碼:
nno <silent> [h :<c-u>call <sid>move_chords(0, v:count1)<cr>
nno <silent> ]h :<c-u>call <sid>move_chords(1, v:count1)<cr>
fu! s:move_chords(fwd, cnt) abort
let pos = virtcol('.')
let pat1 = '\[?\k{-}%#&(\[\k*\])('.repeat('.', a:cnt).')'
let pat2 = repeat('.', a:cnt).'\[?\k{-}%#&('.repeat('.', a:cnt).')(\[\k*\])'
exe 'keepj keepp s/\v'.(a:fwd ? pat1 : pat2).'/\2\1/e'
exe &modified ? 'norm! '.(pos+(a:fwd ? a:cnt : -a:cnt)).'|' : ''
endfu
應該安裝2個映射,使用該密鑰序列[h
和]h
,在文本中移動方括號表示當前光標位置左側或右側。它應該接受一個計數,如果你想在文本移動比單個字符漸行漸遠:
如果使用vim-repeat插件的話,而不是重複相同的映射,你可以使用點命令:
...使用以前的代碼的修改版本:
nmap <silent> [h <plug>(move_chords_backward)
nmap <silent> ]h <plug>(move_chords_forward)
nno <plug>(move_chords_backward) :<c-u>call <sid>move_chords(0, v:count1)<cr>
nno <plug>(move_chords_forward) :<c-u>call <sid>move_chords(1, v:count1)<cr>
fu! s:move_chords(fwd, cnt) abort
let pos = virtcol('.')
let pat1 = '\[?\k{-}%#&(\[\k*\])('.repeat('.', a:cnt).')'
let pat2 = repeat('.', a:cnt).'\[?\k{-}%#&('.repeat('.', a:cnt).')(\[\k*\])'
exe 'keepj keepp s/\v'.(a:fwd ? pat1 : pat2).'/\2\1/e'
exe &modified ? 'norm! '.(pos+(a:fwd ? a:cnt : -a:cnt)).'|' : ''
sil! call repeat#set("\<plug>(move_chords_".(a:fwd ? 'forward' : 'backward').')', a:cnt)
endfu
你可以使用'da [',使用移動命令,然後根據需要使用'p'或'P'來切割...使其成爲一個快捷方式,使用映射..對不同的運動使用不同的映射...不知道什麼否則你需要 – Sundeep