2013-03-16 11 views
6

Qualcuno ha un plugin o macro per sostituire corrispondenza { bretelle } con do e end in Vim? Preferibilmente girando una dichiarazione singola riga come questa:Sostituzione corrispondenti {} parentesi graffe con do/fine a Vim (Ruby)

foo.each { |f| f.whatever } 

in:

foo.each do |f| 
    f.whatever 
end 

avrei potuto fare una macro me stesso per quel un caso, ma mi piacerebbe qualcosa che potrebbe anche gestire più la conversione esistente -line, teoricamente complesso blocchi, come:

foo.each { |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
} 

in:

foo.each do |f| 
    f.bars.each { |b| b.whatever } 
    hash = { a: 123, b: 456 } 
end 

Ho visto vim-surround e rails.vim e non ho trovato la via con nessuno dei due.

+0

non so molto di rubino. ma perché il tuo esempio multilinea (output) solo l'esterno '{,}' è stato sostituito, l'interno 'f.bars.each {...' not? – Kent

+0

Sarebbe bello supportare entrambi, ma normalmente non vorrei che un solo livello espanso alla volta. Il mio scenario è che preferisco i blocchi in linea per le singole affermazioni, ma spesso mi trovo a voler aggiungere un'altra affermazione o due, e mi piacerebbe espandere il blocco per quello. Sì, so che dovrei rifattenerlo in un metodo. –

risposta

7

C'è un plug-in Vim chiamato Vim Blockle che esegue questa funzione.

Una volta installato il plugin si mette il cursore sul {}do o end e premere <Leader>b per scambiare gli stili di blocco.

+0

Grazie! Un po 'bizzarro, ma questo è più o meno quello che stavo cercando. –

+1

Così ho iniziato a installare Blockle e sono incappato in una raccomandazione dell'autore Blockle di installare 'splitjoin' invece: https://github.com/jgdavey/vim-blockle/issues/5 –

0

Presumo che nel tuo esempio multi-linea, l'output sarà:

foo.each do |f| 
    f.bars.each do |b| b.whatever end 
    hash = { a: 123, b: 456 } 
end 

che è, il f.bars.each{...} dovrebbe essere sostituito anche.

se è l'obiettivo, provate questo:

gg/each\s*{<enter>qqf{%send<esc><c-o>sdo<esc>[email protected] 

breve spiegazione:

gg    " move cursor to top 
/each\s*{<enter> " search pattern we want 
qq    " start recording macro to register q 
f{    " move to { 
%send<esc>  " move to closing {, and change it to "end", back to normal 
<c-o>sdo   " back to beginning { and change it into "do" 
<esc>nq   " back to normal, and go to next match, stop recording 

allora si potrebbe fare per esempio [email protected] e controllare il risultato.

+0

Non è proprio quello che sto cercando. Vedi il mio commento sulla domanda. Voglio solo farlo per l'ambito della linea corrente. Verificherò e vedrò se posso lavorarci, però. –

Problemi correlati