2010-05-13 10 views
82

Ich habe gerade this post betrachtet, die beschreibt, wie man ganze Wörter in vim einpackt. Die akzeptierte Lösung war:Word Wrap in Vim (Einrückung beibehalten)

:set formatoptions=l 
:set lbr 

Welche diesen Text nimmt (Tabs werden als \ t dargestellt):

*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 erreicht ein Verhalten wie diese (Tabs werden als \ t dargestellt):

*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 jedoch diese Funktion neu definieren. Ich möchte, dass die umhüllte Zeile die gleiche Anzahl von Tabs davor hat, dass die Zeile darüber plus eins hat. Ie:

*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?

+27

+1 für den Aufwand, um die Frage so klar wie möglich zu machen. –

+0

Möchten Sie, dass der Text am Rand des Fensters weich gepackt wird oder wenn die Linie eine bestimmte Länge erreicht? Ich denke, Sie wollen Hard-Wrapping (wo ein Newline in Ihren Text nach dem Wort "Wille" eingefügt wird), aber es ist schwierig, von Ihren Beispielen zu erzählen. –

+0

@Bill, ich interessiere mich hauptsächlich für die Weichverpackung, aber eine hardwrapping Lösung wäre auch akzeptabel. – sixtyfootersdude

Antwort

16

Die breakindent patch hat was Sie suchen. I erfolgreich angewendet Anweisungen in diesem Thread gefunden werden:

Patch Vim with the breakindent patch on OS X with Homebrew

Insbesondere echristopherson der Homebrew Formel.

Ich weiß, dass dieser Thread alt ist, aber es ist beliebt bei Google und ich stieß mehrmals darauf, wenn Sie versuchen, eine Lösung zu finden.

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

über Yosemite (Mac OS X), I mit Hombrew schneiten Befehl verwendet:

brew install macvim --with-features=huge --override-system-vim --HEAD 
+0

der Patch scheint nicht mit dem neuesten Macvim auf Homebrew zu arbeiten? @ Exit42 wie hast du es zur Arbeit gebracht? – snowbound

+0

nvm. Ich kompilierte Macvim mit Homebrew blutende Kante 'brauen Installation macvim --with-features = riesige --override-system-vim --HEAD' – snowbound

+1

Siehe meine Antwort unten: http://stackoverflow.com/questions/2828174/word-wrap -in-vim-conserving-indentation/26578161 # 26578161 Keine Notwendigkeit für einen Patch in neueren Versionen von vim. – JoshuaD

7

Das Beste, was Sie bekommen werden, ist die showbreak Option, die eine feste Zeichenfolge vor jeder umhüllten Linie setzen wird (ich verwende set showbreak=...).

+0

Kann Showbreak eine Funktion sein? –

+0

@AlexanderBird Laut [': help 'showbreak''] (http://vimdoc.sourceforge.net/htmldoc/options.html#%27showbreak%27), nein, du kannst nicht -' showbreak' ist nur ein Zeichenfolge. –

4

Ich stimme der Antwort zu, dass "Showbreak" die beste Option ist. Bei Showbreak können Sie in der Regel nicht druckbare Zeichen (z. B. Leerzeichen oder Tabulatoren) in den Showbreak-String einfügen, so dass Sie normalerweise nur einen Indikator am linken Rand erhalten, d. H. Keinen echten Einzug. Das ist nicht gut, denn das Hauptziel von OP besteht meiner Meinung nach darin, gewickelten Linien einen Einzug zu geben, damit sie nicht vom linken Randbereich überflutet werden und wie eigene Linien aussehen.

Eine Möglichkeit, einen (hässlichen) Einzug mithilfe von showbreak hinzuzufügen, besteht darin, einfach viele Zeichen zu verwenden, z. B. ": set showbreak => ---------------> ". Dies führt zu etwas, das wie folgt 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 die Verwendung von nonbreaking Leerzeichen (vorausgesetzt, die Instanz von Vim ist Unicode-fähig), von denen jede eingegeben werden kann in die showbreak Zeichenfolge zu machen sein mit die Tastenfolge von ctrl-v, 160. Auf diese Weise können Sie eine Showbreak-Zeichenfolge eingeben, die auf der linken Seite leer ist und als echter Einzug erscheint. Z. B. ": set showbreak =............ >>" wo jeder '.' In dem Befehl ist tatsächlich ein nichtbrechendes Leerzeichen, das durch Drücken von Strg-V, 160 eingegeben wird. So können Sie mit einem Wrap am Ende, die gut gegliederte ist, wie folgt aus:

*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 noch keine Möglichkeit, die Einrückungslevel zu je nach ihrer Gedankenstrich der vorherigen Zeile, aber zumindest Sie sauber bekommen Eindruck eingewickelter Linien ohne viel visuellen Durcheinander am linken Fensterrand. Es kann immer noch Verwirrung stiften, wenn der Einzug einer eingewickelten Zeile kleiner ist als der Anfang einer tatsächlichen Zeile, aber dies könnte vielleicht dadurch vermieden werden, dass der "Einzug" für den Showbreak ziemlich groß ist (dh größer als jeder in Ihrem Code übliche Einzug)) aber immer noch klein genug, dass es genug Platz für lesbares Umhüllen des Textes bietet. Für viele Anwendungen würde ich einen Einbruch von 40 oder 50 Feldern gut machen.

+7

Sie können Leerzeichen in den Showbreak einfügen, indem Sie sie entfernen: ': set showbreak = \ \ \ \'. Funktioniert immer noch nicht für Tabs. –

19

Dies funktionierte nicht, wenn die Frage war ursprünglich gefragt, aber ab dem 25. Juni 2014, dieser Wille Arbeit. (Vorausgesetzt, dass Sie Ihre vim auf eine Version aktualisieren, die neuen als zu diesem Zeitpunkt)

in Ihre .vimrc:

set breakindent 

Und das ist es!

-

Einige Leute (mich eingeschlossen) eine einzige .vimrc auf mehreren Computern teilen. In diesem Fall ist es wichtig, dass diese Zeile robust ist (um störende Fehlermeldungen zu vermeiden). Dies ist ein wenig besser:

if has("patch-7.4.354") 
    set breakindent 
endif 

Auf diese Weise, wenn Sie sich auf einer früheren Version von vim sind, werden Sie keine Fehlermeldung erhalten.

+0

Interessanterweise funktioniert das auf meinem 7.4 vim von Cygwin, aber nicht in meinem 7.4 vim von unbuntu. Ich nehme an, dass es etwas weiter verbreitet werden muss, aber bald universelle Akzeptanz finden wird. – JoshuaD

+1

Funktioniert in Vim 7.4 @ ArchLinux. –

+1

Sie können stattdessen diesen Test verwenden: 'if has (" patch-7.4.354 ")' –