Come funziona: g /^$/,/./- j (riduce più righe vuote in un singolo spazio vuoto) in vim?


21

Nell'articolo, Vim Regular Expressions , Oleg Raisky fornisce il seguente comando per ridurre più righe vuote in un singolo vuoto:

:g/^$/,/./-j

Qualcuno può descrivere come funziona?

Conosco il :gcomando e le espressioni regolari. Ma non ho capito cosa fa la parte /,/./-j.

Risposte:


24

È davvero abbastanza geniale. Analizziamolo. Il excomando

g/^$/xyzzy

cercherà tutte le righe vuote ed eseguirà il xyzzycomando (un excomando arbitrario ) su ciascuna di esse. Nota che xyzzynon è un vero ex comando, è solo lì come segnaposto, come da paragrafo successivo.

Il punto difficile qui è che il xyzzy"comando" nel tuo caso è l'ennesimo comando di ricerca:

,/./-j

La ,/./-specifica un intervallo. Questo è del modulo <start>,<end>e, poiché non c'è nulla prima della virgola, presuppone che la riga corrente (quella in cui è stata trovata la riga vuota) sia l'inizio.

Dopo la virgola è /./-che significa cercare il carattere successivo ( .significa qualsiasi carattere) quindi eseguire il backup di una riga ( /./-è l'abbreviazione /./-1poiché è implicito se non viene fornito alcun valore). Troverai quel modello .sulla prima riga non vuota che segue quella su cui stai operando.

In altre parole, la fine dell'intervallo è l'ultima riga vuota dopo o su quella su cui si sta attualmente operando.

Quindi si esegue un join su tale intervallo.

Se l'inizio e la fine dell'intervallo erano uguali (nella sezione era presente solo una riga vuota), join non fa nulla. Se non sono uguali, unisciti li unirà tutti.

Questo è il modo in cui combina più righe vuote in una sola.

Vediamo un esempio (i numeri di riga sono solo a scopo esplicativo, non si trovano nel file effettivo):

1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9

Il g/^$/comando troverà tutte le linee vuote ed eseguirà le sue operazioni su di esse (queste sono le linee 2, 5, 6, 7 e 8).

Per la linea 2, ,/./-jverrà impostato un intervallo da 2 a 2 (il successivo .si trova sulla linea 3, quindi sottrarre 1 per ottenere 2). Un join nell'intervallo 2,2 non fa nulla.

Per la linea 5, ,/./-jimposterà un intervallo da 5 a 8 (successivo .trovato sulla linea 9 quindi sottrarre 1). Un join nell'intervallo 5,8 unirà tutte quelle linee insieme.

L'operazione non viene eseguita su linee che scompaiono come parte di un'operazione precedente. Questo perché non avrebbe senso elaborare le linee che sono state eliminate in precedenza nel ciclo.

In altre parole, poiché le righe da 6 a 8 vengono eliminate (in combinazione con la riga 5), ​​il comando globale non funziona su di esse dopo.

Ciò si basa sul fatto che la vimdocumentazione afferma un algoritmo a due passaggi, uno per contrassegnare le linee, uno per eseguire l'operazione.


2
Si noti che questo comando si lamenterà se ci sono righe vuote alla fine del file.
Wildcard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.