有没有人知道一个vim脚本/帮助器/命令,它可以让你在一行内左右移动一个被括号括起来的文本?
例如我有这个带有和弦注释的文本,我希望有一个快捷方式,我可以在括号内移动和弦,例如。
Some lyrics and te[Am]xt line
^
Some lyrics and t[Am]ext line
^
这将向左移动一步。
我确信这是可能的(我猜几乎所有事情都可以通过vim),但我不知道怎么做,到目前为止还没找到任何东西。
答案 0 :(得分:6)
我不确定这正是您想要的,但您可以尝试以下代码:
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
它应该使用键序列[h
和]h
安装2个映射,以便将当前光标位置的方括号内的文本向左或向右移动。如果你想将文本移动得比单个字符更远,它应该接受一个计数:
如果你使用vim-repeat插件,那么你可以使用dot命令代替重复相同的映射:
...使用上一代码的修改版本:
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