2017-10-07 146 views
3

有誰知道vim腳本/幫助程序/命令,可以讓您移動一個文本,該文本在一行內左右括括號括起來?將括號括起來的文字左移或右移

例如,我有這個帶有和絃註釋的文本,並且我想要一個快捷方式,我可以在括號內移動和絃,例如,

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

這將是一個舉動向左。我敢肯定,這是可能的(我猜幾乎所有的東西都可以用vim),但是我不知道如何,到目前爲止還沒有找到任何東西。

+2

你可以使用'da [',使用移動命令,然後根據需要使用'p'或'P'來切割...使其成爲一個快捷方式,使用映射..對不同的運動使用不同的映射...不知道什麼否則你需要 – Sundeep

回答

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 

應該安裝2個映射,使用該密鑰序列[h]h,在文本中移動方括號表示當前光標位置左側或右側。它應該接受一個計數,如果你想在文本移動比單個字符漸行漸遠:

enter image description here

如果使用vim-repeat插件的話,而不是重複相同的映射,你可以使用點命令:

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