2013-03-16 15 views
6

jemand ein Plugin oder Makro { Klammern passend zu ersetzen Hat } mit do und end in Vim? Vorzugsweise drehen eine Erklärung einzeiligen wie folgt aus:Ersetzen passende {geschweifte Klammern} mit do/end in Vim (Rubin)

foo.each { |f| f.whatever } 

in:

foo.each do |f| 
    f.whatever 
end 

ich ein Makro mich für diesen einen Fall machen könnte, aber ich würde etwas, das auch bestehende Multi umgehen konnte Umwandlung -Linie, möglicherweise Blöcke kompliziert, wie:

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 

Ich habe mir und rails.vim angesehen, und habe auch keinen Weg gefunden.

+0

weiß nicht viel über Rubin. aber warum dein multiline Beispiel (output) nur der outter '{,}' wurde ersetzt, der innere 'f.bars.each {...' nicht? – Kent

+0

Es wäre nett, beide zu unterstützen, aber normalerweise würde ich nicht mehr als eine Ebene gleichzeitig erweitern wollen. Mein Szenario ist, dass ich In-Line-Blöcke für einzelne Anweisungen bevorzuge, aber oft finde ich, dass ich ein oder zwei weitere Statements hinzufügen möchte, und ich möchte den Block dafür erweitern. Ja, ich weiß, ich sollte alles in eine Methode umwandeln. –

Antwort

7

Es gibt ein Vim-Plugin namens Vim Blockle, das diese Funktion ausführt.

Sobald Sie das Plugin installieren setzen Sie den Cursor auf dem {}do oder end und drücken <Leader>b die Block Stile zu tauschen.

+0

Danke! Ein wenig skurril, aber das ist genau das, wonach ich gesucht habe. –

+1

Also habe ich in die Installation von Blockle geschaut und bin auf eine Empfehlung des Blockle-Autors gestoßen, stattdessen 'splitjoin' zu installieren: https://github.com/jgdavey/vim-blockle/issues/5 –

0

Ich gehe davon aus, dass in Ihrem mehrzeiligen Beispiel wäre die Ausgabe:

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

, das ist, sollte die f.bars.each{...} zu ersetzen.

wenn es das Ziel ist, versuchen Sie dies:

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

kurze Erklärung:

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 

dann könnte man [email protected] zum Beispiel tun, und das Ergebnis überprüfen.

+0

Das ist nicht ganz das, wonach ich suche. Siehe meinen Kommentar zu der Frage. Ich möchte das nur für den Umfang der aktuellen Zeile tun. Ich werde das überprüfen und sehen, ob ich damit arbeiten kann. –

Verwandte Themen