Smart Wrap in Vim

80

Ich habe mich gefragt, ob Vim in der Lage ist, Codezeilen intelligent zu verpacken, sodass der gleiche Einzug wie die eingerückte Zeile beibehalten wird. Ich habe es in einem anderen Texteditor wie dem E-Text-Editor bemerkt und festgestellt, dass es mir geholfen hat, leichter zu verstehen, was ich sehe.

Zum Beispiel eher als

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

es würde erscheinen als

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>
Sasha
quelle
Sie sollten die Antworten erneut überprüfen, wenn sich die Dinge geändert haben.
1
Verwenden Sie :set autoindentund:set smartindent
Shammel Lee

Antworten:

62

Diese Funktion wurde am 25. Juni 2014 als Patch 7.4.338 implementiert. Es folgten einige Patches, die die Funktion verfeinerten, der letzte war 7.4.354, das ist also die Version, die Sie wollen.

:help breakindent
:help breakindentopt

Auszüge aus der vim-Hilfe unten:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

Ebenfalls relevant für diese showbreakEinstellung ist die Einstellung, die Ihren Schichtbetrag mit den von Ihnen angegebenen Zeichen ergänzt.

Beispielkonfiguration

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

Hinweis zum Verhalten

Wenn Sie die sbrOption nicht angeben , werden showbreakalle Zeichen an den Einzug angehängt. Das Entfernen sbraus dem obigen Beispiel führt zu einem effektiven Einzug von 4 Zeichen. Wenn Sie mit dieser Einstellung nur showbreakohne zusätzlichen Einzug verwenden möchten , geben Sie an shift:0.

Sie können auch eine negative Verschiebung vornehmen, die dazu führt, dass showbreakZeichen und umbrochener Text zurück in einen verfügbaren Einrückungsbereich gezogen werden.

Wenn Sie einen minWert angeben , wird der verschobene Betrag gequetscht, wenn die Terminalbreite schmaler ist, die showbreakZeichen jedoch immer erhalten bleiben.

Dominykas Mostauskis
quelle
2
Kurz gesagt, durch Hinzufügen set breakindentzu Ihrer vim-Konfiguration wird der Zeilenumbruch unterbrochen und am Einzug umgebrochen - anstatt in der nächsten Zeile zu brechen und zu beginnen, als wäre es eine neue Zeile.
James2doyle
3
Durch Hinzufügen set breakindentopt=shift:4zu Ihrer vim-Konfiguration werden zusätzliche 4 Leerzeichen eingerückt.
Fritzo
Diese Antwort würde durch Hinzufügen weiterer Beispiele für unterstützt breakindentopt. Die Syntax ist aus dem Hilfedokument nicht ersichtlich. Danke @fritzo für das Beispiel in deinem Kommentar.
Mnebuerquo
33

Es gibt einen Patch dafür, aber er verweilt seit Jahren und als ich das letzte Mal nachgesehen habe, wurde er nicht sauber angewendet. Siehe den Eintrag "Umbrochene Zeilen korrekt einrücken" unter http://groups.google.com/group/vim_dev/web/vim-patches - ich wünschte wirklich, dies würde in die Hauptzeile aufgenommen.

Update: Dieser Link scheint bitrotted zu sein. Hier ist eine aktuellere Version des Patches .

Update 2: Es wurde fusionierte Upstream (Stand 7.4.345), so dass jetzt nur Sie müssen :set breakindent.

Ergosys
quelle
Ich würde das sehr mögen, ich werde HTML-Markup viel lesbarer machen
Jose Elera
Ich sehe keinen Patch auf dieser Seite. Kann jemand anderes bestätigen?
Puk
Anscheinend wurde die Seite kürzlich neu aufgebaut und diese Links sind defekt. Es gibt einen aktuellen Blogeintrag mit einem noch neueren Patch auf derselben Site.
Ergosys
1
Das fehlt wirklich. Ich verstehe nicht, warum dies nicht in der Hauptzeile steht, insb. da ist der patch sehr gut geschrieben.
Cseelus
2
Danke @Vitor Eiji für das Update. Das sind großartige Neuigkeiten.
Ergosys
17

Ich denke nicht, dass es möglich ist, genau die gleiche Einrückung zu haben, aber Sie können trotzdem eine bessere Ansicht erhalten, indem Sie die Option "Showbreak" aktivieren.

:set showbreak=>>>

Beispiel:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

Die reale Sache sieht besser aus als der obige Beispielcode, da Vim für '>>>' eine andere Farbe verwendet.

zu viel php
quelle
5
Sie können auch verwenden :set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ (die Kombination aus Backslash-Leerzeichen macht den Unterbrechungszeichenraum. Sie können also genügend Leerzeichen hinzufügen, um tiefer als der größte Teil Ihres umschlossenen Codes zu sein (z. B. wären 10 Leerzeichen tiefer als 2 Registerkarten mit vier Leerzeichen und 14 tiefer als 3 vier Leerzeichen-Registerkarten); ein schönes Merkmal des Leerzeichens ist, dass es weniger visuell ablenkt (wenn Sie dies möchten)
Jeromy Anglim
7
@ Jeromy Anglim Eine kleine Korrektur: set showbreak=\ \ \ \ \ \ \ \ \ \ \ \ \ \ ist dann viel weniger lesbarlet &showbreak=repeat(' ', 14)
ZyX
8

UPDATE: Im Juni 2014 wurde ein Patch zur Unterstützung einer breakindentOption in Vim zusammengeführt (Version 7.4.346 oder höher für beste Unterstützung).


Sie können auch versuchen :set nowrap, mit vim lange Zeilen anzuzeigen, indem Sie nach rechts scrollen. Dies kann nützlich sein, um die Gesamtstruktur eines Dokuments zu untersuchen, kann jedoch für die eigentliche Bearbeitung weniger bequem sein.

Andere Optionen in der Nähe von dem, was Sie suchen, sind linebreakund showbreak. Mit showbreakkönnen Sie ändern, was am linken Rand der Zeilen angezeigt wird, die umbrochen werden. Leider ist je nach aktuellem Kontext kein variabler Einzug zulässig.

Greg Hewgill
quelle
5

Ich weiß nur, dass Sie dies tun können, indem Sie ein Rückgabezeichen (wie von Cfreak erwähnt) verwenden und die textwidthOption mit den verschiedenen Einrückungsoptionen kombinieren . Wenn Ihr Einzug korrekt konfiguriert ist (wie ich glaube, standardmäßig mit der HTML-Syntax, aber ansonsten die Optionen autoindentund smartindent), können Sie:

:set formatoptions = tcqw
:set textwidth = 50
gggqG

Wenn Sie die formatoptionsEinstellung anpassen müssen , ist es möglicherweise besser, einfach Folgendes zu tun:

:set fo += w
:set tw = 50
gggqG

Was dies tut:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

Beachten Sie, dass dies nicht mit einem Soft-Wrap identisch ist: Es werden die Zeilen sowohl in der Quelldatei als auch auf dem Bildschirm umbrochen (es sei denn, Sie speichern sie natürlich nicht!). Es gibt andere Einstellungen, die hinzugefügt werden können und formatoptionsdie während der Eingabe automatisch formatiert werden: Details in :help fo-table.

Weitere Informationen finden Sie unter:

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'
DrAl
quelle
3
:set smartindent
:set autoindent

Ich denke, Sie müssen trotzdem eine Rückgabe verwenden

Cfreak
quelle
2

Wenn Ihr HTML- Code ausreichend gut geformt ist, kann es hilfreich sein , ihn über xmllint auszuführen :

:%!xmllint --html --format
Arkady
quelle
2

Eine Makrolösung:


Bearbeiten:

Die gq{motion}automatischen Betriebsformate werden unabhängig von der eingestellten Variablen "Textbreite" ausgeführt. Dies ist einfacher / besser als die Verwendung des 80lBi^MMakros.


Wenn Sie Autoindent aktiviert haben

:set autoindent

Wenn Sie dann am Ende einer Zeile eine Rückgabe eingeben, wird die nächste Zeile um denselben Betrag eingerückt. Sie können dies verwenden, um Zeilenumbrüche hart einzugeben, wenn Sie möchten. Das folgende Makro nutzt dies, um Ihren Text automatisch einzurücken:

setze Register z auf:

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

und setze Register x auf:

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

Dann mach

@x   

um die Makros zu aktivieren. Nach einigen Sekunden wird Ihr Text in richtig eingerückten Zeilen mit maximal 80 Zeichen angezeigt.

Erläuterung:

Hier ist eine Aufteilung der Makros:

Teil 1 (Makro z):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

Teil 2 (Makro x):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one WORD (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

Vorsichtsmaßnahmen:

  • Dieses Makro wird unterbrochen, wenn ein WORT mit 80 Zeichen oder mehr vorhanden ist.

  • Dieses Makro kann keine intelligenten Dinge wie das Einrücken von Zeilen hinter Tags ausführen.

  • Verwenden Sie die Lazyredraw-Einstellung (: Lazyredraw einstellen), um dies zu beschleunigen

Michael Asnes
quelle