Befehl vim zum Umstrukturieren / Erzwingen von Text in 80 Spalten

240

Ich weiß, dass es Möglichkeiten gibt, die Breite von Text in vim mithilfe von Vim 80-Spaltenlayout automatisch festzulegen set textwidth(z. B. Bedenken hinsichtlich des Spaltenlayouts von Vim 80 ). Was ich suche, ist etwas Ähnliches wie =(der Befehl zum Einrücken der Zeile), aber zum Umbrechen auf 80. Der Anwendungsfall ist manchmal, dass Sie Text mit Textbreite bearbeiten und nach dem Verbinden von Zeilen oder dem Löschen / Hinzufügen von Text schlecht umbrochen wird.

Im Idealfall würde dieser Befehl die von mir ausgewählten Zeilen vollständig neu organisieren und lange Zeilen abschneiden, während kurze hinzugefügt werden. Ein Beispiel:

long line is long!  
short

Nach dem Ausführen des Befehls (unter der Annahme, dass der Wrap 13 Spalten betrug):

long line is  
long! short

Wenn dies mit einem echten vim-Befehl nicht möglich ist, gibt es möglicherweise ein Befehlszeilenprogramm, mit dem ich die Eingabe weiterleiten kann.

Nach der Suche habe ich diese Referenz gefunden, die einige weitere Optionen bietet: http://www.cs.swarthmore.edu/help/vim/reformatting.html

böses Mädchen
quelle
9
Vielleicht interessiert Sie auch, dass Vim die Textformatierung an ein externes Programm delegieren kann, z. B. par . Ich habe einen Screencast gemacht, der zeigt, wie man Text mit Par formatiert .
Nelstrom
@nelstrom danke, bis ungefähr par. Es ist fantastisch!
Steven Lu
2
Wenn Sie möchten, dass der Text schlank und schlank aussieht (gut geschnitten?), Denken Sie immer an gq- Gentleman's Quarterly . (Entschuldigung für die Anthropomorphisierung des Mannes, aber die Mnemonik funktioniert.)
Ruffin

Antworten:

372

Stellen Sie textwidth80 ( :set textwidth=80) ein, gehen Sie zum Anfang der Datei (kann mit Ctrl- Homeoder ausgeführt werden gg) und geben Sie ein gqG.

gqGFormatiert den Text von der aktuellen Position bis zum Ende der Datei. Es werden automatisch aufeinanderfolgende Zeilen verbunden, wenn dies möglich ist. Sie können eine Leerzeile zwischen zwei Zeilen einfügen, wenn Sie nicht möchten, dass diese beiden zusammengefügt werden.

Michael Madsen
quelle
14
Und es funktioniert auch mit visueller Auswahl. Dh so etwas wie : V}gq. Auf diese Weise sehen Sie, was Sie formatieren möchten, bevor Sie es tatsächlich formatieren.
Plouff
6
Was genau macht es übrigens qvon selbst?
Richard-Degenne
1
Gibt es eine Möglichkeit, dies mit Zeilen zu tun, die nur eine lange Zeichenfolge ohne Leerzeichen sind? EDIT: Ich habe das Dienstprogramm "fold" entdeckt. Ich frage mich immer noch, ob ich das in vi machen soll.
Donald Smith
7
Verwenden Sie set tw=80statt set textwidth=80Zeit zu sparen
Yibo Yang
4
@dmranck Nachdem set textwidth=76Ihre Zeilen während der Eingabe automatisch umbrochen werden. Meine Beschwerde ist, dass es nichts mit vorhandenen Zeilen zu tun hat, die bearbeitet werden. Aber V}gqist äußerst nützlich in dieser Hinsicht. VAktiviert den visuellen Auswahlmodus, }wählt bis zum nächsten Absatzumbruch aus und gqführt den aktuellen Formatierer darauf aus (oder verwendet ihn gw, um den vi-Formatierer explizit aufzurufen). Auch {wird nach oben wählen. Sie können das gesamte Dokument auswählen und formatieren, ggVGgqobwohl es möglicherweise einen einfacheren Weg gibt. Speichern Sie das als Makro @, um es einfacher zu machen. Verwenden Sie vipgqdiese Option, um den aktuellen Absatz zu erstellen.
Ktbiz
94

Michaels Lösung ist der Schlüssel, aber ich finde am häufigsten, dass ich den Rest des aktuellen Absatzes neu formatieren möchte; Verwenden Sie für dieses Verhalten gq}.

Alex Hirzel
quelle
17
Erweitern Sie dies - Sie können gq <motion> verwenden, um zu formatieren, was Sie möchten.
Dan Schnau
1
Außerdem die Option 'nojoinspaces', die verhindert, dass nach Punkten, in denen Zeilen an einer Satzgrenze verbunden werden, zwei Leerzeichen angezeigt werden. Gut, wenn Ihr typografischer Stil aus einzelnen Leerzeichen zwischen englischen Sätzen besteht.
Alex Hirzel
36

Sie können gqmit jedem Bewegungsoperator verwenden. Wenn Sie beispielsweise nur bis zum Ende der aktuellen Zeile neu formatieren möchten (dh um die Zeile zu umbrechen, auf der sich Ihr Cursor befindet), können Sie verwendengq$

Sie können auch neu formatieren, indem Sie Text im visuellen Modus auswählen (mit `v und verschieben) und dann gq eingeben.

Es gibt auch andere Optionen, um das Umbrechen von Zeilen zu erzwingen.

Wenn Sie möchten, dass vim Ihre Zeilen umschließt, während Sie Text in sie einfügen, anstatt bis zum Ende warten zu müssen, um den Text neu zu strukturieren, finden Sie diese Optionen nützlich:

:set textwidth=80
:set wrapmargin=2

(Lassen Sie sich nicht von wrapund verfolgen linebreak, die nur den auf dem Bildschirm angezeigten Text neu formatieren, und ändern Sie den Text im Puffer nicht.)

JohnGH
quelle
9
Von der wrapmarginHilfe: Wenn 'Textbreite' nicht Null ist, wird diese Option nicht verwendet.
mmoya
21

Dank eines Kommentars von DonaldSmith fand ich dies, da die textwidthOption meine lange Textzeile nicht neu formatierte (ich konvertierte das Spielen mit Hex-zu-Byte-Konvertierungen):

:%!fold -w 60

Dadurch wurde die gesamte Datei (die für mich eine Zeile war) in Zeilen mit einer Länge von 60 umformuliert.

shearn89
quelle
1
Das ist sehr nett. Alle Antworten konzentrieren sich auf die Begrenzung der Breite einer Linie, wenn eine Linie Leerzeichen in Wörter unterteilt. Diese Lösung funktioniert für sehr lange Wörter (DNA-Sequenzen).
Pedrosaurio
1
Für lange URLs ist dies das einzige, was ich gefunden habe, das funktioniert. Ich bin bereits neu in Bezug auf Textbreite, aber es wird keine ungebrochenen Zeichenfolgen brechen (was normalerweise eine gute Sache ist)
SkyLeach
13

Wenn Sie nach einem Nicht-Vim- Weg suchen , gibt es immer die UNIX-Befehle fmt und par .

Anmerkungen:

  • Ich kann Unicode nicht kommentieren, es kann sich anders verhalten oder auch nicht.
  • @nelstrom hat bereits parin seinem Webcast die Verwendung erwähnt .

So würden wir beide für Ihr Beispiel verwenden.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

So verwenden Sie Vim:

:%! fmt -w 13
:%! par 13gr

Sie können auch :formatprgpar oder fmt einstellen und überschreiben gq. Weitere Informationen erhalten Sie :help formatprgin Vim.

Ehtesh Choudhury
quelle
9

Fast immer benutze ich gqim visuellen Modus. Ich sage meinen Schülern, es steht für "Gentlemens 'Quarterly", eine Zeitschrift für anspruchsvolle Leute.

ncmathsadist
quelle