Wie kann ich Text in Vim bis zu einer gewissen Länge umbrechen?

102

Sprechen wir von relativen Maßen. Mein Vim sieht aus wie:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Ich möchte, dass es kleiner ist:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Wie kann ich es bekommen? Und wie kann ich die Länge eines solchen Blocks festlegen?

Léo Léopold Hertz 준영
quelle
Meinen Sie Zeilenumbruch und nicht Einrückungstext?
lc.
lc: Ich kenne den Unterschied nicht. Ich wollte Wrap schreiben, wie es mir empfohlen wurde, aber ich habe es nie zum Laufen gebracht.
Léo Léopold Hertz 준영

Antworten:

177

Sie können tatsächlich zwei Dinge tun:

  1. Lassen Sie vim Ihren Text formatieren (dh ändern), um kürzere Zeilen zu erhalten, indem Sie Zeilenumbrüche einfügen
  2. Lassen Sie die Zeilen unverändert, zeigen Sie sie jedoch umbrochen an

Welches möchtest du haben?

Option 1 würde durch Einstellen erreicht textwidth(zum Beispiel :set textwidth=30(aus Swaarops Antwort)). Anschließend können Sie Ihren Text neu formatieren, indem Sie ihn markieren (im visuellen Modus) und eingeben gq. ( textwidthkann daher als abgekürzt twwerden :set tw=30.)

Option 2 kann durch Ausführen von :set wrap/ umgeschaltet werden :set nowrap. Dadurch werden Zeilen umbrochen, die für das Fenster zu lang sind.

Beide sind unabhängig.

sleske
quelle
33
+1 für den Befehl gq key aus dem visuellen Modus, das ist unglaublich nützlich
Fire Crow
3
Zu Ihrer Information, dies bricht in Leerzeichen und gqgq macht nichts mit einer Linie wie in der Frage gezeigt, selbst wenn tw = 5 ist.
Dlamblin
2
@Dlamblin: Richtig. Wenn Sie mit genau der angegebenen Breite falten möchten, ohne das Leerzeichen zu foldberücksichtigen , verwenden Sie den Befehl wie in der Antwort von fgm.
Sleske
Ihre Option zu funktioniert meines Erachtens nicht. wrapwird an der Fenstergrenze gewickelt, nicht an textwidth.
DerWeh
@DerWeh: Ja, Wrap wird an der Fenstergrenze umbrochen. Ich habe bearbeitet, um zu klären.
Sleske
60

Sobald Sie 'Textbreite' eingestellt haben, können Sie Text im visuellen Modus auswählen und gq drücken, um ihn schön zu verpacken (Sie können Q auch bei einigen älteren / älteren Konfigurationen verwenden).

Einige nützliche Tipps:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Vlad Dogaru
quelle
3
+1, ich habe versehentlich gq getroffen, während ich in vim war, habe die letzte halbe Stunde damit verbracht, zu sehen, was ich getroffen habe. Das ist so nützlich.
user176121
gqqumschließt auch die aktuelle Zeile (anstelle von gqgqoder gq$).
Ash
21

Die Verwendung von Falte (1) ist eine Möglichkeit:

:%!fold -w5 

Ergebnis:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Fritz G. Mehner
quelle
1
Dies berücksichtigt auch keine Leerzeichen zum Falten
Lionel
7
@ Lionel: Ja. Fügen Sie dem Befehl fold die Option "-s" hinzu, um Leerzeichen zu berücksichtigen.
Sleske
14
:set textwidth=30
Swaroop CH
quelle
Wie geht die Textbreite damit um, wenn keine Leerzeichen vorhanden sind, wie im Beispiel des Originalplakats? Ich hatte ein Spiel und es scheint nur basierend auf der Textbreite zu formatieren, wenn Leerzeichen vorhanden sind (oder vermutlich, wenn die breakat-Variable auf etwas anderes gesetzt ist).
Andy
3
@Andy textwidthbehandelt keine Situation ohne Leerzeichen. Sie können dazu Ihre eigene formatexprFunktion schreiben .
Swaroop CH
8

Wenn Sie Text ohne Leerzeichen haben, den Sie in einer bestimmten Länge unterbrechen möchten, müssen Sie weder extern verwenden foldnoch Ihren eigenen schreiben formatexpr.

:%s/\(.\{80\}\)/\1\r/g

bricht alle Zeilen bei 80 Zeichen.

kthy
quelle
2
Dies hat mir den Tag gerettet, als ich ein OpenSSL-Zertifikat wiederbelebt habe. Vielen Dank
Cengiz Can