2010-06-16 10 views

Trả lời

6

Bạn sẽ phải hoặc là sử dụng searchpair(), hoặc để chơi với% (miễn là matchit được cài đặt, và như bạn đang trên bắt đầu/kết thúc), sau đó đánh dấu hai vị trí, kiểm tra xem đó là văn bản hoặc dấu ngoặc và cuối cùng là cập nhật hai dòng.

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 

Trường hợp lh#position#char_at_mark() được định nghĩa here.

PS: đây chắc chắn là câu hỏi SO vì nó kết hợp ngữ cảnh ruby ​​và tập lệnh vim nâng cao.

+0

Vâng, không có lý do gì cho giải pháp phức tạp. Chỉ cần sử dụng matchit.vim. :) – graywh

+0

Khớp không giải quyết yêu cầu của OP. (Và thậm chí không có vim được giới thiệu, nó vẫn còn liên quan đến việc điều chỉnh một công cụ phát triển, cho các mục đích phát triển) –

0

Có một plugin splitjoin.vim mà thực hiện điều này độc đáo (GJ/GS ánh xạ cho tách/tham gia).