Zeilenumbruch in Vim (Einrückung beibehalten)

92

Ich habe mir gerade diesen Beitrag angesehen, in dem beschrieben wird, wie ganze Wörter in vim eingeschlossen werden. Die akzeptierte Lösung war folgende:

:set formatoptions=l
:set lbr

Welches nimmt diesen Text (Registerkarten werden als \ t angezeigt):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Dies führt zu einem Verhalten wie diesem (Registerkarten werden als \ t angezeigt):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Ich möchte diese Funktion jedoch neu definieren. Ich möchte, dass die umbrochene Zeile die gleiche Anzahl von Registerkarten enthält, die die obige Zeile plus eins enthält. Dh:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Irgendwelche Ideen?

sechzig Fuß
quelle
34
+1 für die Anstrengungen, die unternommen wurden, um die Frage so klar wie möglich zu machen.
Jeffrey Jose
Möchten Sie, dass der Text am Rand des Fensters weich oder hart umbrochen wird, wenn die Linie eine bestimmte Länge erreicht? Ich denke, Sie möchten einen Hard-Wrapping (bei dem nach dem Wort "Wille" eine neue Zeile in Ihren Text eingefügt wird), aber anhand Ihrer Beispiele ist dies schwer zu erkennen.
Bill Odom
@ Bill, ich interessiere mich hauptsächlich für Softwrapping, aber eine Hardwrapping-Lösung wäre auch akzeptabel.
Sixtyfootersdude
1
Die gewünschte Funktionalität ist derzeit nicht in Vim integriert. Es gibt jedoch einen Patch, der nahe kommt: groups.google.com/group/vim_dev/web/vim-patches (es ist # 15, " Umbrochene Zeilen korrekt einrücken ").
Bill Odom
Verwandte: VimCasts hatte eine schöne Episode über die Verwendung von externen Unix-Dienstprogrammen, um dieses Problem zu lösen: vimcasts.org/e/18
Damien Wilson

Antworten:

18

Der Breakindent-Patch hat das, wonach Sie suchen. Ich habe es erfolgreich mithilfe der Anweisungen in diesem Thread angewendet:

Patch Vim mit dem Breakindent-Patch unter OS X mit Homebrew

Insbesondere die Homebrew-Formel von Echristopherson.

Ich weiß, dass dieser Thread alt ist, aber er ist bei Google beliebt und ich bin mehrmals darauf gestoßen, als ich versucht habe, eine Lösung zu finden.

BEARBEITEN: Dieser Patch ist jetzt in vim als Patch 7.4.338 enthalten. Siehe: https://retracile.net/blog/2014/07/18/18.00

Unter Yosemite (Mac OS X) habe ich den Befehl snowbound mit hombrew verwendet:

brew install macvim --with-features=huge --override-system-vim --HEAD 
Ausfahrt42
quelle
Der Patch scheint nicht mit dem neuesten Macvim auf Homebrew zu funktionieren. @ Exit42 Wie hast du es zum Laufen gebracht?
schneebedeckt
nvm. Ich habe Macvim mit Homebrew-Blutungskante zusammengestelltbrew install macvim --with-features=huge --override-system-vim --HEAD
schneebedeckt
1
Siehe meine Antwort unten: stackoverflow.com/questions/2828174/… In neueren Versionen von vim ist kein Patch erforderlich.
JoshuaD
26

Dies hat nicht funktioniert, als die Frage ursprünglich gestellt wurde, aber ab dem 25. Juni 2014 wird dies funktionieren. (Angenommen, Sie aktualisieren Ihr vim auf eine neuere Version als dieses Datum.)

Fügen Sie Ihrer .vimrc hinzu:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

Und das ist es!

- -

Einige Leute (ich eingeschlossen) teilen eine einzelne .vimrc auf mehreren Computern. In diesem Fall ist es wichtig, dass diese Leitung robust ist (um störende Fehlermeldungen zu vermeiden). Das ist etwas besser:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Auf diese Weise erhalten Sie keine Fehlermeldung, wenn Sie eine frühere Version von vim verwenden.

JoshuaD
quelle
Interessanterweise funktioniert dies auf dem 7.4-Vim meines Cygwin, aber nicht auf dem 7.4-Vim meines Unbuntu. Ich vermute, es muss etwas weiter verbreitet werden, wird aber bald allgemein angenommen.
JoshuaD
1
Funktioniert in Vim 7.4 @ ArchLinux.
Andy Mikhaylenko
1
Sie können diesen Test stattdessen verwenden:if has("patch-7.4.354")
Lawrence Kesteloot
Dies beantwortet nicht die Frage bezüglich der Bemerkung von OP: die gleiche Anzahl von Registerkarten (...) plus eins . Übrigens ist es meiner Meinung nach auch sehr wichtig, dass Sie häufig zusätzliche Einrückungen beibehalten und umwickelte Segmente optisch nach rechts verschieben möchten (eng angeordnete Auflistungen, Notizen usw.).
blutiger
8

Das Beste, was Sie bekommen werden, ist die showbreakOption, die eine feste Zeichenfolge vor jede umbrochene Zeile setzt (ich verwende set showbreak=...).

zu viel php
quelle
@AlexanderBird Laut :help 'showbreak', nein, du kannst nicht - showbreakist nur eine Zeichenfolge.
Rory O'Kane
4

Ich stimme der Antwort zu, dass "Showbreak" die beste Option ist. Mit Showbreak können Sie normalerweise keine nicht druckbaren Zeichen (z. B. Leerzeichen oder Tabulatoren) in die Showbreak-Zeichenfolge einfügen. Wie normalerweise verwendet, erhalten Sie nur einen Indikator am linken Rand, dh keinen echten Einzug. Dies ist nicht großartig, da das Hauptziel von OP meiner Meinung nach darin besteht, umschlossenen Linien einen Einzug zu geben, damit sie nicht den linken Randbereich überladen und wie eigene Linien aussehen.

Eine Möglichkeit, einen (hässlichen) Einzug mit showbreak hinzuzufügen, besteht darin, einfach viele Zeichen zu verwenden, z. B. ": set showbreak => --------------->". Dies führt zu etwas, das so aussieht:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Eine bessere Alternative könnte darin bestehen, nicht unterbrechende Leerzeichen zu verwenden (vorausgesetzt, Ihre Instanz von Vim ist Unicode-fähig), von denen jedes mit der Schlüsselfolge von Strg-V, 160 in die Showbreak-Zeichenfolge eingegeben werden kann. Auf diese Weise können Sie eine Showbreak-Zeichenfolge eingeben, die auf der linken Seite leer ist und als echter Einzug erscheint. ZB ": setze showbreak = ..... >>" wobei jedes '.' im Befehl befindet sich tatsächlich ein nicht unterbrechendes Leerzeichen, das durch Drücken von Strg-V, 160 eingegeben wird. Auf diese Weise erhalten Sie eine Umhüllung, die wie folgt gut eingerückt ist:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Sie haben immer noch keine Möglichkeit, die Einrückungsstufe entsprechend dem Einzug der vorherigen Zeile zu variieren, aber zumindest erhalten Sie einen sauberen Einzug der umbrochenen Zeilen ohne viel visuelle Unordnung am linken Fensterrand. Es kann immer noch zu Verwirrung kommen, wenn der Einzug einer umbrochenen Zeile kleiner ist als der des Beginns einer tatsächlichen Zeile. Dies kann jedoch vermieden werden, indem der Showbreak "Einzug" ziemlich groß gemacht wird (dh größer als jeder Einzug, der üblicherweise in Ihrem Code vorkommt ), aber immer noch klein genug, um genügend Platz für lesbares Umbrechen des Textes zu bieten. Für viele Zwecke würde ein Showbreak-Einzug von 40 oder 50 Leerzeichen dies ziemlich gut tun.

Herbert Sitz
quelle
7
Sie können Leerzeichen in den Showbreak einfügen, indem Sie sie maskieren : :set showbreak=\ \ \ \ . Funktioniert jedoch immer noch nicht für Registerkarten.
Bill Odom