2010-06-16 2 views

Répondre

6

Il faudrait soit utiliser searchpair(), ou jouer avec% (aussi longtemps que matchit est installé et que vous le début/fin), marquez ensuite les deux positions, testez s'il s'agit de texte ou de crochets, et enfin mettez à jour les deux lignes.

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() est défini here. PS: c'est définitivement une question SO car elle combine le contexte ruby ​​et le script vim avancé.

+0

Oui, il n'y a aucune raison pour la solution compliquée. Utilisez simplement matchit.vim. :) – graywh

+0

Matchit ne résout pas la demande de l'OP. (Et même sans vim involded, il s'agit toujours de l'optimisation d'un outil de développement, à des fins de développement) –

0

Il y a un plugin splitjoin.vim qui fait cela joliment (Gj/gs correspondances pour le fractionnement/adhésion).

Questions connexes