有没有人知道一个vim脚本/帮助器/命令,它可以让你在一行内左右移动一个被括号括起来的文本?
例如,我有这个带有和弦注释的文本,我希望有一个快捷方式,我可以在括号内移动和弦,例如
Some lyrics and te[Am]xt line ^ Some lyrics and t[Am]ext line ^
这将向左移动一步.
我确信这是可能的(我猜几乎一切都可能与vim),但我不知道如何,到目前为止还没有找到任何东西.
我不确定这是你想要的,但你可以尝试以下代码:
nno[h : call move_chords(0, v:count1) nno ]h : call move_chords(1, v:count1) 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插件,那么你可以使用dot命令代替重复相同的映射:
...使用以前代码的修改版本:
nmap[h (move_chords_backward) nmap ]h (move_chords_forward) nno (move_chords_backward) : call move_chords(0, v:count1) nno (move_chords_forward) : call move_chords(1, v:count1) 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("\ (move_chords_".(a:fwd ? 'forward' : 'backward').')', a:cnt) endfu