Mögliche Erklärung des Problems
Ich denke, der Grund, warum :g/;/j
nicht funktioniert, ist, dass der :g
Befehl mit einem 2-Pass-Algorithmus arbeitet:
- Während des ersten Durchgangs werden die Linien markiert, die das Muster enthalten
;
- Während des zweiten Durchgangs werden die markierten Linien bearbeitet
:g
Verbindet die Linie während des zweiten Durchgangs mit der Linie 1;
, 2;
da 1;
sie während des ersten Durchgangs markiert wurde. Ich vermute jedoch (nicht sicher), dass es nicht 1; 2;
mit verbunden ist, 3;
da die Zeile 2;
nicht mehr existiert. Ihr Inhalt wurde mit der 1;
bereits verarbeiteten Zeile zusammengeführt .
So :g
sieht für die nächste Zeile , die während der ersten Durchlauf markiert wurde ( 3;
) und verbindet es mit dem folgenden ( 4;
). Danach das Problem wiederholt, ist es nicht beitreten kann 3; 4;
mit , 5;
weil die Leitung 4;
nicht mehr existiert.
Lösung 1 (mit Vimscript)
Vielleicht können Sie eine Funktion aufrufen, wenn eine Zeile mit ;
gefunden wird, um zu überprüfen, ob die vorherige Zeile auch ein Semikolon enthält:
function! JoinLines()
if getline(line('.')-1) =~ ';'
.-1join
endif
endfunction
Verwenden Sie dann den folgenden globalen Befehl:
:g/;/call JoinLines()
Oder ohne Funktion:
:g/;/if getline(line('.')-1) =~ ';' | -j | endif
Lösung 2 (ohne Vimscript)
:g/;/.,/^[^;]*$/-1j
Immer wenn der globale Befehl :g
das Muster findet ;
, führt er den Befehl aus: .,/^[^;]*$/-1j
Es kann so aufgeschlüsselt werden:
:g/pattern/a,bj
Wo :
pattern = ;
a = . = number of current line
b = /^[^;]*$/-1 = number of next line without any semicolon minus one
b
kann so weiter aufgeschlüsselt werden:
/ = look for the number of the next line matching the following pattern
^ = a beginning of line
[^;] = then any character except a semicolon
* = the last character can be repeated 0 or more times
$ = an end of line
/ = end of pattern
-1 = removes one to the number you just got
j
ist die abgekürzte Form des Ex-Befehls, :join
der wie die meisten anderen Ex-Befehle ein Bereich vorangestellt werden kann.
Hier wird es von dem Bereich voran: .,/^[^;]*$/-1
( a,b
)
ein Bereich folgt die Form , a,b
wo a
und im b
Allgemeinen 2 Zeilennummern sind, und ermöglicht es auf einer Gruppe von Zeilen , deren Zahl zu betreiben ist zwischen a
und b
, statt nur einem.
Der j
Befehl verbindet also alle Zeilen zwischen dem aktuellen ( a
) und dem nächsten, die kein Semikolon minus eins ( b
) enthalten.
Weitere Informationen finden Sie unter:
:help :global
:help :join
:help :range
:g/;/j
funktioniert nicht, da dies in zwei Durchgängen erfolgt: Zuerst wird der Puffer gescannt, dann wird der Befehl auf die übereinstimmenden Zeilen angewendet.