92 votes

Word Wrap dans Vim (préservation de l'indentation)

J'étais juste en train de regarder ce poste qui décrit comment envelopper des mots entiers dans vim. La solution acceptée était la suivante :

:set formatoptions=l
:set lbr

qui prend ce texte (les onglets sont affichés en tant que \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 permet d'obtenir un comportement comme celui-ci (les onglets sont affichés en tant que \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 souhaiterais toutefois redéfinir cette fonction. Je voudrais que la ligne enveloppée ait le même nombre de tabulations devant elle que la ligne précédente, 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 ?

35 votes

+1 pour l'effort consenti pour rendre la question aussi claire que possible.

0 votes

Voulez-vous que le texte s'enroule en douceur sur le bord de la fenêtre ou qu'il s'enroule en force lorsque la ligne atteint une certaine longueur ? Je pense que vous voulez un enveloppement dur (où une nouvelle ligne est insérée dans votre texte après le mot "will"), mais c'est difficile à dire à partir de vos exemples.

0 votes

@Bill, je suis surtout intéressé par le softwrapping mais une solution hardwrapping serait également acceptable.

31voto

JoshuaD Points 191

Cela ne fonctionnait pas lorsque la question a été initialement posée, mais depuis le 25 juin 2014, cela fonctionne. (En supposant que vous mettez à jour votre vim à une version plus récente que cette date).

Ajoutez à 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 y compris) partagent un seul .vimrc sur plusieurs ordinateurs. Dans ce cas, il est important que cette ligne soit robuste (pour éviter les messages d'erreur ennuyeux). Ceci 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 ne recevrez pas de message d'erreur.

18voto

Exit42 Points 113

El patch breakindent a ce que vous cherchez. Je l'ai appliqué avec succès en utilisant les instructions trouvées dans ce fil :

Patch Vim avec le patch breakindent sur OS X avec Homebrew

Plus précisément, la formule Homebrew d'echristopherson.

Je sais que ce fil de discussion est vieux mais il est populaire sur Google et je suis tombé dessus plusieurs fois en essayant de trouver une solution.

EDIT : Ce patch est maintenant inclus dans vim en tant que patch 7.4.338. Voir : https://retracile.net/blog/2014/07/18/18.00

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

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

0 votes

Le patch ne semble pas fonctionner avec la dernière version de macvim sur homebrew ? @Exit42 comment avez-vous réussi à le faire fonctionner ?

0 votes

Nvm. J'ai compilé macvim avec homebrew bleeding edge brew install macvim --with-features=huge --override-system-vim --HEAD

1 votes

Voir ma réponse ci-dessous : stackoverflow.com/questions/2828174/ Il n'est pas nécessaire d'appliquer un correctif dans les nouvelles versions de vim.

8voto

too much php Points 27983

Le mieux que vous puissiez obtenir est le showbreak qui mettra une chaîne fixe devant chaque ligne enveloppée (j'utilise set showbreak=... ).

0 votes

@AlexanderBird Selon :help 'showbreak' Non, tu ne peux pas. showbreak est seulement une chaîne de caractères.

4voto

Herbert Sitz Points 10657

Je suis d'accord avec la réponse qui dit que "showbreak" est la meilleure option. En général, Showbreak ne vous permet pas d'insérer des caractères non imprimables (par exemple, des espaces ou des tabulations) dans la chaîne showbreak, de sorte que, tel qu'il est utilisé, il ne vous donnera qu'un indicateur le long de la marge gauche, c'est-à-dire sans véritable indentation. Ce n'est pas génial, puisque le but principal de l'OP, je pense, est de donner un indentation aux lignes enveloppées pour éviter qu'elles n'encombrent la zone de la marge gauche et ne ressemblent à des lignes à part entière.

Ainsi, une façon d'ajouter une indentation (moche) en utilisant showbreak est d'utiliser beaucoup de caractères, par exemple ":set showbreak=>--------------->". Cela donne 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 pourrait être d'utiliser des caractères d'espacement insécables (en supposant que votre instance de Vim soit compatible avec l'unicode), chacun d'entre eux pouvant être saisi dans la chaîne de caractères d'insertion en utilisant la séquence de touches ctrl-v,160. De cette façon, vous pouvez entrer une chaîne de caractères de rupture qui est vide sur le côté gauche et qui semble être une véritable indentation. Par exemple, ":set showbreak=. . . . . . . . . . >>" où chaque '.' de la commande est en fait un caractère d'espace insécable saisi en appuyant sur ctrl-V,160. De cette façon, vous obtenez un wrapping joliment indenté, 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 pas la possibilité de faire varier le niveau d'indentation en fonction de l'indentation de la ligne précédente, mais au moins vous obtenez une indentation propre des lignes enveloppées sans beaucoup d'encombrement visuel le long de la marge gauche de la fenêtre. Il peut toujours y avoir une confusion si l'indentation d'une ligne enveloppée est inférieure à celle du début d'une ligne réelle, mais cela pourrait peut-être être évité en faisant en sorte que l'"indentation" du saut d'écran soit assez grande (c'est-à-dire supérieure à toute indentation que l'on trouve habituellement dans votre code), mais suffisamment petite pour laisser suffisamment d'espace pour l'enveloppement lisible du texte. Pour de nombreuses utilisations, je pense qu'un indentation du saut d'écran de 40 ou 50 espaces ferait très bien l'affaire.

7 votes

Vous pouvez mettre des espaces dans le showbreak en les échappant : :set showbreak=\ \ \ \ . Cependant, cela ne fonctionne toujours pas pour les onglets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X