È davvero abbastanza geniale. Analizziamolo. Il ex
comando
g/^$/xyzzy
cercherà tutte le righe vuote ed eseguirà il xyzzy
comando (un ex
comando arbitrario ) su ciascuna di esse. Nota che xyzzy
non è 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 /./-1
poiché è 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, ,/./-j
verrà 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, ,/./-j
imposterà 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 vim
documentazione afferma un algoritmo a due passaggi, uno per contrassegnare le linee, uno per eseguire l'operazione.