web-dev-qa-db-fra.com

Word Wrap in Vim (Préservation d'indentation)

Je cherchais juste ce post qui décrit comment envelopper des mots entiers dans Vim. La solution acceptée était ceci:

:set formatoptions=l
:set lbr

Qui prend ce texte (les onglets sont affichés comme\t):

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

Cela accomplit un comportement comme celui-ci (les onglets sont indiqués comme\t):

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

Je voudrais cependant redéfinir cette fonction. Je voudrais que la ligne enveloppée ait le même nombre d'onglets devant celui-ci que la ligne ci-dessus a plus une. C'est à dire:

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

Des idées?

88
sixtyfootersdude

Le patch Breakindent a ce que vous recherchez. Je l'ai appliqué avec succès à l'aide des instructions trouvées dans ce fil:

Patch Vim avec le patch Breakindent sur OS X avec homebrew

Plus précisément, la formule homebrew de ecristopherson.

Je sais que ce fil est vieux mais il est populaire sur Google et je l'ai rencontré plusieurs fois lorsque vous essayez de trouver une solution.

Edit: Ce patch est maintenant inclus avec Vim comme patch 7.4.338. Voir: https://retracile.net/blog/2014/07/18/18.

Sur Yosemite (Mac OS X), j'ai utilisé la commande de Snowbound avec Homebrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 
18
Exit42

Cela n'a pas fonctionné lorsque la question était initialement posée, mais au 25 juin 2014, cela fonctionnera. (En supposant que vous mettez à jour votre VIM à une version plus récente que cette date)

Ajouter à votre .vimrc:

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

Et c'est tout!

-

Certaines personnes (moi-même incluses) partagent un seul .vimrc sur plusieurs ordinateurs. Dans ce cas, il est important que cette ligne soit robuste (pour éviter des messages d'erreur gênants). C'est un peu mieux:

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

De cette façon, si vous êtes sur une version antérieure de Vim, vous n'obtenez pas de message d'erreur.

24
JoshuaD

Je suis d'accord avec la réponse qui dit "Showbed" est la meilleure option. Showbed ne vous permet pas généralement de mettre des caractères non indignés (par exemple, des espaces ou des onglets) dans la chaîne de Showbreak, de sorte que l'on utilise généralement, cela vous donnera simplement un indicateur à gauche de la marge gauche, c'est-à-dire aucun véritable tiret. Ce n'est pas génial, puisque l'objectif principal de l'OP, je pense, est de donner aux lignes enveloppées d'un tiret les empêcher d'encombrer la zone de marge gauche et de ressembler à des lignes.

Donc, une façon d'ajouter un indent (laid) à l'aide de Showbed est de simplement utiliser beaucoup de caractères, .e.g, ": Set showbed => --------------->". Cela se traduit par quelque chose qui ressemble à ceci:

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

Une meilleure alternative peut être d'utiliser des espaces non repoussants (en supposant que votre instance de Vim est activé unicode), chacune desquelles peut être entré dans la chaîne de Showbreak à l'aide de la séquence clé de Ctrl-V, 160. De cette façon, vous pouvez entrer une chaîne de Showbreak qui est vide à gauche et semble être un véritable indent. E.G., ": Set Showbreak = ........... >>" Où chacun "." Dans la commande, c'est en fait un caractère d'espace non graphique saisi en appuyant sur Ctrl-V, 160. De cette façon, vous vous retrouvez avec une enveloppe qui est joliment en retrait, comme ceci:

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

Vous n'avez toujours aucune possibilité de varier le niveau de retrait selon le tiret de la ligne précédente, mais au moins vous obtenez un retrait propre de lignes enveloppées sans beaucoup d'encombrement visuel le long de la marge de fenêtre gauche. Il pourrait toujours y avoir une confusion si le tiret d'une ligne enveloppée est inférieur à celui du début d'une ligne réelle, mais cela pourrait peut-être être évité en faisant le "tiret" showbreak assez volumineux (c'est-à-dire plus grand que tout indentement communément trouvé dans votre code ) mais suffisamment petit qu'il fournit suffisamment d'espace pour emballage lisible du texte. Pour de nombreuses utilisations, je pense qu'une tige de démonstration de 40 ou 50 espaces ferait ce bien.

4
Herbert Sitz