2010-06-16 50 views

回答

6

你必須要麼使用和searchpair(),或用%玩(只要安裝matchit,和你在開始/結束)然後標記這兩個位置,測試它是文本還是括號,最後更新這兩行。

nnoremap <buffer> <c-x>{ :call <sid>ToggleBeginOrBracket()<cr> 

let s:k_be = [ 'begin', 'end' ] 
function! s:ToggleBeginOrBracket() 
    let c = lh#position#char_at_mark('.') 
    if c =~ '[{}]' 
    " don't use matchit for {,} 
    exe 'normal! %s'.s:k_be[1-(c=='}')]."\<esc>``s".s:k_be[(c=='}')]."\<esc>" 
    else 
    let w = expand('<cword>') 
    if w == 'begin' 
     " use mathit 
     normal % 
     exe "normal! ciw}\<esc>``ciw{\<esc>" 
    elseif w == 'end' 
     " use mathit 
     normal % 
     exe "normal! ciw{\<esc>``ciw}\<esc>" 
    else 
     throw 'Cannot toggle block: cursor is not on {, }, begin, nor end' 
    endif 
    endif 
endfunction 

lh#position#char_at_mark()定義here。 PS:由於它結合了ruby上下文和先進的vim腳本,因此這絕對是一個SO問題。

+0

是的,沒有理由爲複雜的解決方案。只需使用matchit.vim。 :) – graywh 2010-07-14 21:32:26

+0

Matchit沒有解決OP的請求。 (即使沒有vim參與,它仍然涉及開發工具的調整,用於開發目的) – 2010-07-15 18:12:24

0

有一個splitjoin.vim插件,這是否很好(GJ/GS映射分割/結合)。

相關問題