将括号括起的文本向左或向右移动

时间:2017-10-07 09:33:38

标签: vim

有没有人知道一个vim脚本/帮助器/命令,它可以让你在一行内左右移动一个被括号括起来的文本?

例如我有这个带有和弦注释的文本,我希望有一个快捷方式,我可以在括号内移动和弦,例如。

Some lyrics and te[Am]xt line
                   ^
Some lyrics and t[Am]ext line
                  ^

这将向左移动一步。

我确信这是可能的(我猜几乎所有事情都可以通过vim),但我不知道怎么做,到目前为止还没找到任何东西。

1 个答案:

答案 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个映射,以便将当前光标位置的方括号内的文本向左或向右移动。如果你想将文本移动得比单个字符更远,它应该接受一个计数:

enter image description here

如果你使用vim-repeat插件,那么你可以使用dot命令代替重复相同的映射:

enter image description here

...使用上一代码的修改版本:

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