2010-04-20 13 views
9

Ciao a Gvim Ho bisogno di inserire una riga vuota o due prima di ogni commento nel file.Come inserisco una riga vuota prima di ogni commento (ad esempio "#") in VIM?

Eg

#comment 1 
#comment 2 
statement 1 
statement 2 
#comment 3 

Dopo aver eseguito il comamnd dovrebbe essere

#comment 1 

#comment 2 
statement 1 
statement 2 

#comment 3 

Come faccio a fare questo?

Grazie

Update: Grazie per le risposte

Ma se i commenti sono continui, io non voglio nuova riga da aggiungere tra di loro. C'è un modo per fare questo?

esempio

#comment 1 
#comment 2 

io non volere che sia

#comment 1 

#comment 2 

risposta

20

È inoltre possibile utilizzare questo comando: :g/^#/norm O

Ok, qui è una spiegazione:

Questa è una scorciatoia di :global/^#/normal O che significa:

  • per ogni linea che iniziano con '#' (:global/^#/)
  • fare comando 'O' in 'modalità normale' (normal O) - il che significa fare cosa fa una chiave 'O' nella modalità VIM 'normale' (non inserire e non: comando). E 'O' inserisce una nuova riga.
+0

Penso che questa sia la migliore risposta finora dal momento che è il più intuitivo, ma forse dovresti spiegare come e perché funziona. – matias

+0

spiegazione aggiunta –

+0

': g [lobal]' trumps ': s [ubstitute]' +1 per te sir –

0

Utilizzare questo comando: :%s/^\ze\s*#/\r/

1

che non interessano la prima linea

L'output esempio sembra che non ci dovrebbe essere alcun ritorno a capo prima della prima riga del file. È possibile aggiungere un controllo dietro a per ottenerlo.

:%s/^\n\@<=\ze\s*#/\r/

\n\@<= corrisponde solo se c'è una nuova riga prima della posizione corrente, quindi la prima linea non corrisponderà. Per ulteriori informazioni, vedere :h \@<=

Ciò può anche essere eseguito con un controllo di linea . La seguente regex corrisponde solo a quelle linee che non sono la prima riga.

:%s/^\%>1l\ze\s*#/\r/

\%>1 Risultati sotto la linea 1.Vedere :h \%>l


Ecco qualcosa che dovrebbe funzionare con la domanda aggiornato, cioè, solo aggiungere una nuova riga prima della linea corrente, se non v'è alcuna linea commento prima.

:g/^\%^\@<!\(^\s*#.*\n\)\@<!\s*#/norm O

^\%^\@<! non corrispondono questa linea se l'inizio del file è prima di esso. :h \%^ e: h \@<!

\(^\s*#.*\n\)\@<! Abbinare questa riga solo se il primo carattere non vuoto sulla riga precedente non è #.

Questa espressione regolare cambierà

 
#comment 1 
#comment 2 
statement 1 
statement 2 
#comment 3 

a

 
#comment 1 
#comment 2 
statement 1 
statement 2 

#comment 3 
2

c'è una soluzione, che opera nel "VI non migliorata", così:

: 2, $ g/^ [ TAB] * #/s/^/^ M/

dove TAB e^M devono essere immessi come il carattere di controllo corrispondente.

Spero che questo aiuti - e il mio grazie va a Heikki per puntare al 1 ° problema di linea

0

Ancora un altro modo (funziona per 1 ° linea troppo)

:s/^[ TAB]*#-1s/^/\r/ 
Problemi correlati