Fügen Sie Zeilen innerhalb von Absätzen in vim ein

5078
dggoldst

Angenommen, Sie haben ein langes Dokument in vim mit automatischem Zeilenumbruch eingegeben, sodass alle Zeilen mit etwa 79 Zeichen unterbrochen wurden. Möglicherweise haben Sie sogar das gesamte Dokument formatiert, um alle Zeilen dieser Länge zu unterbrechen.

Absätze werden in Ihrem Dokument durch Leerzeilen abgegrenzt.

Jetzt entscheiden Sie, dass Sie überhaupt keine Zeilenumbrüche innerhalb von Absätzen wünschen.

Wie können Sie alle Zeilenumbrüche in Absätzen entfernen, ohne die Absatzgrenzen vollständig zu entfernen?

Ich habe diesen schnellen und idiotischen Hack gemacht, suche aber den richtigen Weg.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@ ggVGgJ - join all lines in the file :%s/@@@@@/\r\r/g - replace @@@@@ with line breaks 
11

4 Antworten auf die Frage

11
Gilles

Ich denke, das macht, was Sie wollen: Stellen Sie sicher, dass am Ende der Datei eine leere Zeile steht, und fügen Sie dann jeden Absatz hinzu (durch eine leere Zeile abgeschlossen).

G:a  . :g/^./ .,/^$/-1 join 

Erläuterung: Gehen Sie zuerst zum Ende der Datei und hängen Sie eine zusätzliche leere Zeile mit an :a(vielleicht gibt es eine elegantere Möglichkeit, dies zu tun; interaktiv können Sie die ersten drei Zeilen mit ersetzen o<ESC>). Wenden Sie dann für jede nicht leere Zeile, die noch nicht berücksichtigt wurde ( :g/^./), den joinBefehl auf den Bereich an, der an der ausgewählten Zeile ( .) beginnt und eine Zeile vor der nächsten leeren Zeile endet ( /^$/-1).

Optional, :g/^$/dwenn keine leere Zeile verbleiben soll (dann können Sie die Zeile entfernen -1).

Vielen Dank. Dies kommt mir sehr nahe, jedoch werden die leeren Zeilen zwischen den Absätzen gelöscht. (Ich habe Dateiformat Unix und DOS ausprobiert, um zu sehen, ob es eine Windows-Sache ist). Könnten Sie die Befehle auch etwas übersetzen? G geht zur letzten Zeile. : laut hilfe ist "anfügen" aber ich bin mir nicht sicher, was das macht. Auch das g / pattern / cmd, das Sie dort haben, hat mich verloren. Was ist der Befehl? dggoldst vor 13 Jahren 0
@dggoldst: Ich habe den Befehl geändert, um leere Zeilen beizubehalten. In den ersten drei Zeilen wird nur eine leere Zeile am Ende der Datei eingefügt (andernfalls wird der letzte Absatz nicht angepasst). Der letzte Befehl ist `: g`, der einen Befehl auf alle übereinstimmenden Zeilen anwendet. Siehe `: help: g` und vielleicht [dieser Thread darüber, wie`: g` sich beim Löschen von Zeilenumbrüchen verhält] (http://unix.stackexchange.com/questions/1788/why-does-the-substitution-of- newlines-using-g-re-p-only-apply-to-every-other-line / 1797 (1797). Gilles vor 13 Jahren 0
`: $ pu _` setzt am Ende ein schwarzes Lochregister, das am Ende eine leere Zeile ergibt. SergioAraujo vor 5 Jahren 0
10
garyjohn

Das sollte es tun:

:set tw=99999 gggqG 

twwird auf einen Wert gesetzt, der mindestens der Anzahl der Zeichen im längsten Absatz entspricht. ggbewegt den Cursor in die erste Zeile; gqist der Befehl zur Neuformatierung; GBewegt den Cursor in die letzte Zeile und fordert Sie gqauf, die aktuelle Cursorposition in der letzten Zeile neu zu formatieren.

3
Juan

1) Setzen Sie den Cursor in den gewünschten Absatz

2) Typ: "vipJ"

("vip" markiert den aktuellen Absatz, "J" fügt alle Zeilen zusammen)

2
goldPseudo

Es könnte nicht der sauberste Weg sein, aber ich würde Folgendes verwenden:

ggqav}bgJ}wq999@a # go to the top of the file (gg) # start recording macro "a" (qa) # select the entire paragraph (v}) # go back one word so as not to join the blank line (b) # join the selected lines without spaces (gJ) # go to first word of the next paragraph (}w) # finish recording the macro (q) # 999 times (arbitrary number of paragraphs to join) # run macro "a" (@a) 

( Funktioniert in VIM 7.2. )

Je nachdem, wie genau die Absätze bei der ursprünglichen Formatierung aufgeteilt wurden, möchten Sie den gJBefehl (Join ohne Leerzeichen) durch den JBefehl (Join mit Leerzeichen) ersetzen .

Die willkürliche 999Zählung muss nur sein zumindest die Anzahl der Absätze in der Datei - Sie können eine größere Zahl wählen, wenn Sie wollen, und nichts als Prozessorzyklen verlieren. Wenn Sie nur eine einzige leere Zeile zwischen den Absätzen annehmen, können Sie eine genauere Absatzanzahl erzielen, indem Sie Folgendes verwenden:

:%s/^$//gn # returns "999 matches on 999 lines" 
Das funktioniert für mich. Es wäre gut, am Anfang ein "gg" hinzuzufügen, um den Cursor an den Anfang der Datei zu setzen. Die Verwendung von J anstelle von gJ führt nicht dazu, dass einzelne Wörter zu einem Wort zusammengefügt werden. Dies mag nur für meine Werte von "formatoptions" der Fall sein, die mich derzeit verwirren. dggoldst vor 13 Jahren 0