Wie kann ich in VIM eine wirklich lange Zeile in mehrere Zeilen aufteilen?

169

Angenommen, ich habe eine super lange Zeile im VIM-Editor (z. B. mehr als 300 Zeichen). Wie würde ich das in mehrere Zeilen aufteilen, so dass die Wortgrenzen bei 80 Zeichen ungefähr brechen?

Beispiel:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

zu

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...
Jordan Parmer
quelle

Antworten:

254

Vim macht das sehr einfach (Linien an Wortgrenzen brechen).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Ich würde vorschlagen, dass Sie auschecken :help gqund :help gw.

Wenn twSie auch textwidth ( ) einstellen, wird der Zeilenumbruch automatisch überschritten, wenn er während der Eingabe überschritten wird. Es wird auch in verwendet gq, wenn deaktiviert gqPausen bei Fenstergröße oder 79, je nachdem, was zuerst kommt.

:set tw=80

Durch Einstellen der Formatoptionen auf die Textbreite wird vim bei der Einstellung tw automatisch unterbrochen.

:set fo+=t
he_the_great
quelle
5
Für Ihren Fall gqwäre der Befehl also <ESC>(Verlassen des Einfüge- / Ersetzungs- / etc-Modus) und danngq80l
MidnightLightning
6
Dies ist das Gegenteil von Strg + j (kombiniert mehrere Zeilen zu einer).
Yzmir Ramirez
9
Vim überrascht mich immer wieder. Das ist reines Gold.
Jondlm
10
Nur für die nächste Person, die dies findet, wird gq nur eine Zeile festen Textes teilen, es braucht Leerzeichen, um seine Sache zu tun
stringy05
2
[läuft gqq] aaaahhh, es ist wunderschön
underscore_d
85

Stellen Sie zuerst Ihr vim so ein, dass es versteht, dass Sie 80 Zeichen möchten:

:set tw=80

dann hilight die Linie:

V

und vim neu formatieren lassen:

gq

quelle
17

Dies hängt nicht wirklich mit VIM zusammen, aber Sie können das fmt- Programm wie in verwenden

$ fmt myfile
Wernsey
quelle
38
:%! fmt% "Kann es vim verwandt machen :)
Maxim Sloyko
2
Nützlich für vi, obwohl ich gqq auf vim vorziehen würde.
WhyNotHugo
13

Markieren Sie für durchgezogene Textlinien den Bereich mit v im normalen Modus und drücken Sie dann

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

Dadurch wird am Ende jedes 80. Zeichens eine neue Zeile hinzugefügt.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline
geraucht
quelle
Dies ist die einzige Lösung, die für eine lange Base64-Zeichenfolge funktioniert hat.
Jviotti
6

Wenn Sie auf * nix sind, haben Sie wahrscheinlich zur foldVerfügung.

Wählen Sie die Region aus, die Sie verwenden möchten v, und brechen Sie dann Leerzeichen in der Breite 80 mit folgenden Elementen auf:

!fold --spaces --width=80

Dies entspricht im Wesentlichen der Verwendung gq.

Wenn Sie jedoch nur bei Zeichen 80 brechen und nicht auf Leerzeichen beschränkt sein möchten, können Sie Folgendes verwenden:

!fold --width=80

Wenn Sie es mit einem Tastendruck wollen, legen Sie einfach eine Zuordnung fest - ich habe verwendet

vmap <f1> !fold --width=80<CR>

Michael Anderson
quelle
Dies ist die Antwort, die für lange Zeichenfolgen funktioniert, die nicht durch Leerzeichen getrennt sind. Unter macOS müssen Sie möglicherweise gfold anstelle von fold verwenden.
Aaron D
auf mac os musste ich tun! fold -w 80
user674669
5

Verwenden Sie Folgendes, um lange Zeilen im gesamten Dokument zu teilen, ohne bereits vorhandene Zeilenumbrüche zu entfernen:

:set formatoptions+=w
:set tw=80
gggqG
Olivier Faucheux
quelle
4

Ich musste eine ganze Datei anstatt einer Zeile neu formatieren. Wie Wernsey betont, hätte ich 'fmt' verwenden können, aber die folgende Sequenz in vim hat auch den Trick getan (aus den verschiedenen Antworten hier entlehnt):

<ESC>
:setl tw=80 fo=t
1GVGgq
John Rix
quelle
3

Versuchen Sie als schnelle und böse vielleicht die folgende Karte:

map q 080lwbels<CR><ESC>

was sagt:

  • eine 0. Position der Linie beginnen,
  • Gehe zum 80. Zeichen nach rechts.
  • gehe zum Anfang des nächsten Wortes,
  • gehe zurück zum vorherigen Wort,
  • gehe zum Ende des aktuellen Wortes,
  • Gehen Sie ein Zeichen nach rechts und
  • Ersetzen Sie dieses Zeichen durch eine CR.

Wenn Sie dann q und CR drücken, wird die Linie an der Wortgrenze in Blöcke aufgeteilt.

Rob Wells
quelle
0

Ich habe '\' (und dann CR / Tab zum Formatieren) manuell in jede LONGLINE nach dem letzten Leerzeichen, aber vor der Spalte 80 eingefügt. Das heißt:

1 this is a long, long, line

sieht jetzt so aus

1 this is a long, \
        long line

und kompiliert normal.

808
quelle