2010-06-16 7 views

Antwort

6

Sie entweder verwenden searchpair() haben würde, oder mit% zu spielen (solange matchit installiert ist, und wie Sie beginnen, werden/Ende), Markieren Sie dann die zwei Positionen, testen Sie, ob es sich um Text oder Klammern handelt, und aktualisieren Sie schließlich die beiden Zeilen.

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 

Wo lh#position#char_at_mark()here definiert ist.

PS: Dies ist definitiv eine SO Frage, da es Ruby Kontext und erweiterte Vim Scripting kombiniert.

+0

Ja, es gibt keinen Grund für die komplizierte Lösung. Verwenden Sie einfach matchit.vim. :) – graywh

+0

Matchit löst nicht die Anfrage von OP. (Und auch ohne vim involviert, handelt es sich immer noch um das Tuning eines Entwicklungswerkzeugs, für Entwicklungszwecke) –

0

Es ist ein splitjoin.vim Plugin, das diese gut tut (GJ/GS-Mappings für das Aufspalten/Verbinden).

Verwandte Themen