Kann ich Text in Vim ausrichten?


38

Der einzige Grund, warum ich jemals eine Textdatei in Pico oder Nano und nicht in Vim bearbeitet habe, war der Befehl "Justify" ^J. Es würde einen Textabschnitt neu formatieren und Zeilenumbrüche an Wortumbrüchen erzeugen, so dass der Text auf dem Bildschirm mit fester Breite gut schwebt. Formatieren Sie den Text so, dass er in vordefinierte 80 Spalten passt und nur Zeilenumbrüche zwischen Wörtern erzeugt. Da die Funktion eingeschränkt war, war es sehr nützlich, lange Kommentarblöcke oder Dokumentationsdateien zu formatieren oder einfach eine endlose Reihe von Parametern durch etwas besser lesbares zu ersetzen.

Kann ich so etwas in Vim machen?

Antworten:


37

Sie können die Operatoren gqoder in gwKombination mit einem Bewegungsbefehl verwenden. Standardmäßig wird das fmtProgramm (unter Linux) verwendet, um den angegebenen Text zu formatieren. Nach meinem besten Wissen rechtfertigt es jedoch nicht die Linien, so dass Sie zackige rechte Ränder bekommen.

Ich benutze es, um gwip(normaler Modus) mit dem Cursor auf einen Absatz zu fahren. Dadurch wird der aktuelle Absatz formatiert, wobei sich der Cursor an derselben Position befindet. Ich benutze es auf diese Weise, um sicherzustellen, dass nur der aktuelle Absatz formatiert ist. Wenn Sie eine Textdatei bearbeiten, gwGwird der gesamte Text formatiert, wenn Sie am Anfang der Datei den Modus "Normal" eingeben. Stellen Sie sicher, dass zwischen den Absätzen mindestens eine Leerzeile steht.

Es gibt eine Menge Konfigurationsmöglichkeiten. Um damit zu beginnen, hier sind einige relevante Hilfe: :h gq, :h gw, :h fo(Format - Optionen), :h fp(Format - Programm), :h fo-table(eine Erklärung der möglichen Optionen).


1
GQ / GW ist definitiv der richtige Weg. Um dieser Nachricht etwas hinzuzufügen, können Sie das Formatierungsprogramm in par ändern, um mehr Optionen zu haben. Checkout vimcasts.org/episodes/formatting-text-with-par
Bambu

3
Standardmäßig verwendet Vim kein externes Programm. Sie können jedoch eines auswählen, indem Sie die 'formatprg'Option aktivieren .
Jamessan

15

Zu diesem Thema gibt es einen großartigen VimCast.

http://vimcasts.org/episodes/formatting-text-with-par/

Grundsätzlich müssen Sie Folgendes installieren par:

$ brew install par
# or
$ sudo apt-get install par

Und dann, da Sie möchten, dass Spalten in 80 Spalten eingeschlossen werden:

:set formatprg=par\ -w80

Jetzt können Sie den gqOperator verwenden, wie in anderen Antworten (z. B. gqip), und er verwendet Par anstelle von Vims integriertem Formatierer.

Par ist ziemlich fortgeschritten und formatiert Kommentare wie diese:

/* This is a long */
/* multiline comment */

11

Von :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Alles was Sie tun müssen, ist zu rennen

:ru macros/justify.vim

und dann eingeben

_j

um den Text in der gesamten Datei auszurichten.

(Natürlich können Sie auch ru macros/justify.vimIhre .vimrc-Datei hinzufügen , damit Sie sie nicht jedes Mal eingeben müssen.)

Hinweis : Dadurch werden keine Zeilenumbrüche hinzugefügt. Sie müssen diese manuell mit hinzufügen gq. Dazu müssen Sie auch den textwidthWert (Standard ist 0) über auf Ihren gewünschten Wert einstellen

set textwidth=80

und - wenn Sie möchten - automatisches Umbrechen von Text durch Setzen des tFlags über

set formatoptions+=t

Wenn Sie möchten, können Sie in Ihrer .vimrc-Datei eine Zuordnung festlegen, die das Ganze für Sie erledigt:

nnoremap <C-j> gggqG_j

Dies bewegt sich an den Anfang der Datei ( gg), umschließt alle Zeilen ( gqbis G) und _jjustiert dann den Text.


Weitere
Informationen

Ich habe gerade die sehr nützliche :set fo+=aOption für die automatische Neuformatierung des gesamten Absatzes gefunden. Schauen Sie sich :help fo-tableandere Optionen an. Es gibt auch ein schönes Video - Tutorial hier .
Suuuehgi

+1 für eine vollständig integrierte Lösung. Die _jvom Makro hinzugefügte Zuordnung scheint für mich die gesamte Datei zu rechtfertigen, oder sie kann durch eine linienweise visuelle Auswahl eingeschränkt werden.
Ches

5

Während die Hilfe von nano den ^JBefehl "Justify" aufruft, rechtfertigt sie den Text nicht, sondern formatiert den Text neu, indem die Zeilen vor dem rechten Rand des Bildschirms gebrochen werden (oder an einer konfigurierbaren Spalte, denke ich).

Sie können die gleiche Sache in VIM tun , indem Sie die Variable Einstellung textwidthvon :help 'textwidth':

Maximale Textbreite, die eingefügt wird. Nach dem Leerzeichen wird eine längere Linie unterbrochen, um diese Breite zu erhalten. Ein Nullwert deaktiviert dies.

Das heißt: Wenn eine Zeile länger als textwidthZeichen ist, umschließt VIM während der Eingabe die Zeile mit dem ersten Leerzeichen, damit die Zeilenlänge kleiner oder gleich bleibt textwidth.

Damit dies funktioniert, formatoptionsmuss die Option den Buchstaben enthalten t. Siehe :help 'formatoptions'und :help fo-tablefür die verfügbaren Optionen, zum Beispiel könnten Sie an der cOption interessiert sein , dass die Formatierung mit Kommentaren funktioniert.

Bearbeiten : Sie können die gleiche Operation durchführen, ohne die Notwendigkeit zu setzen tin formatoptions, mit dem Befehl gw{motion}, es formatiert den Text zwischen der aktuellen Cursorposition und der Position des Cursors nach {motion}. Der gwBefehl ist auch im visuellen Modus verfügbar und formatiert den ausgewählten Text.


1
Das ist gut zum Tippen. Kann ich das auf bereits vorhandenen Text anwenden?
SF.

3

Hier sind zwei einfache Optionen:

  1. Geben Sie bei ausgewähltem Textblock Folgendes ein !fmt
  2. Geben Sie mit dem Cursor am Anfang eines Blocks Folgendes ein !}fmt

Beide senden einen Textblock an Unix fmt, siehe man fmtOptionen. Sie können Optionsargumente von vim übergeben. Um beispielsweise einen Block mit einer Breite von 50 Zeichen zu formatieren, geben Sie Folgendes ein !}fmt -w 50.


Entschuldigung, jetzt behoben
Kaan

Sie können Ihre gesamte Datei auch formatieren, indem Sie :%!fmteine einzelne Datei eingeben und rückgängig machen, uwenn Ihnen das Ergebnis nicht gefällt.
Wildcard

-1

Markieren Sie den Text mit dem visuellen Befehl und verwenden Sie dann:

:!par 40j 

wobei 40 die Spaltenbreite ist und jMittelwerte rechtfertigen.


2
Willkommen auf unserer Webseite! Ihre Frage ist derzeit von geringer Qualität, da es an Erklärungen zu dem von Ihnen verwendeten Tool ( par) und der Funktionsweise Ihrer Lösung mangelt . Möglicherweise möchten Sie weitere Details hinzufügen, um die Qualität Ihrer Antwort zu verbessern und sie für zukünftige Leser nützlicher zu machen.
statox
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.