Verbinden Sie Linien innerhalb von Absätzen in vim

13

Angenommen, Sie haben ein langes Dokument in vim mit aktiviertem automatischen Zeilenumbruch eingegeben, sodass alle Zeilen beispielsweise mit 79 Zeichen unterbrochen wurden. Möglicherweise haben Sie sogar das gesamte Dokument formatiert, um alle Zeilen in 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 möchten.

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

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

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
quelle
Hey, klopfe nicht an, wenn deine Lösung funktioniert und deine Lösung funktioniert.
pdwalker

Antworten:

12

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

G:a

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

Erläuterung: Gehen Sie zuerst zum Ende der Datei und fügen Sie eine zusätzliche leere Zeile hinzu :a(möglicherweise gibt es eine elegantere Möglichkeit, dies zu tun; interaktiv können Sie die ersten drei Zeilen durch 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).

:g/^$/dWenn Sie nicht möchten, dass eine leere Zeile übrig bleibt, können Sie optional die entfernen -1.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Dies kommt mir sehr nahe, löscht jedoch die Leerzeilen zwischen Absätzen. (Ich habe versucht, Dateiformat Unix und Dos, um zu sehen, ob es eine Windows-Sache war). Könnten Sie die Befehle auch ein wenig übersetzen? G geht zur letzten Zeile. : a laut hilfe ist "anhängen" aber ich bin mir nicht sicher was das macht. Auch das g / pattern / cmd, das du dort hast, hat mich verloren. Was ist der Befehl?
dggoldst
@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 abgeglichen). Der letzte Befehl ist :g, der einen Befehl auf alle übereinstimmenden Zeilen anwendet. Sehen Sie :help :gund vielleicht diesen Thread darüber, wie :gsich das Löschen von Zeilenumbrüchen verhält .
Gilles 'SO - hör auf böse zu sein'
:$pu _ am Ende das Schwarzlochregister setzen, was am Ende zu einer leeren Zeile führt.
SergioAraujo
12

Dies sollte es tun:

:set tw=99999
gggqG

twist auf einen Wert eingestellt, der mindestens so groß ist wie die Anzahl der Zeichen im längsten Absatz. ggbewegt den Cursor in die erste Zeile; gqist der Befehl zur Neuformatierung; GBewegt den Cursor in die letzte Zeile und weist ihn gqan, von der aktuellen Cursorposition in die letzte Zeile neu zu formatieren.

Garyjohn
quelle
5
  1. Setzen Sie den Cursor innerhalb des gewünschten Absatzes

  2. Art: vipJ

( viphebt den aktuellen Absatz hervor, Jverbindet alle Zeilen)

Juan
quelle
2

Könnte nicht der sauberste Weg sein, aber hier ist, was ich verwenden würde:

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. )

Abhängig davon, wie genau die Absätze bei der ursprünglichen Formatierung aufgeteilt wurden, möchten Sie möglicherweise den gJBefehl (Join ohne Leerzeichen) durch den JBefehl (Join with Leerzeichen) ersetzen .

Die willkürliche 999Anzahl muss nur mindestens die Anzahl der Absätze in der Datei sein. Sie können eine größere Anzahl auswählen, wenn Sie nur Prozessorzyklen verlieren möchten. Unter der Annahme einer und nur einer Leerzeile zwischen Absätzen können Sie eine genauere Absatzanzahl erhalten, indem Sie:

:%s/^$//gn     # returns "999 matches on 999 lines"
goldPseudo
quelle
Das funktioniert bei mir. Es wäre gut, am Anfang ein "gg" hinzuzufügen, um den Cursor oben in die Datei zu setzen. Die Verwendung von J anstelle von gJ führt auch nicht dazu, dass separate Wörter zu einem zusammengefügt werden. Dies ist möglicherweise nur bei meinen Werten für "Formatoptionen" der Fall, die mich derzeit verwirren.
dggoldst