Faire en sorte que Vim affiche une ligne au bord de la largeur de texte définie

26

La plupart des éditeurs de texte et des IDE que j'utilise de nos jours ont une fonctionnalité où ils peuvent afficher une ligne à une certaine longueur de caractère dans le tampon de texte. C'est utile lorsque vous souhaitez conserver des lignes dans un fichier sous une certaine longueur.

Existe-t-il un moyen pour que Vim le fasse, de préférence en utilisant la textwidthvaleur déjà définie ? Les lignes seront automatiquement bouclées à ce stade, mais j'aimerais vraiment pouvoir voir où elles se trouvent également.

Au cas où cela importerait, j'utilise principalement gVim sur Windows, mais j'adorerais que la solution fonctionne sur toutes les versions de Vim.

Herms
la source

Réponses:

41

pour (g) vim, utilisez ce qui suit:

set colorcolumn=80

ou quelle que soit la largeur que vous souhaitez. Fonctionne à la fois dans vim et gvim. J'ai le mien dans un SI, il est donc conditionnel en fonction du type de fichiers que je modifie.

Vous pouvez également utiliser un + x / -x pour baser la position de la colonne +/- à partir de & textwidth.

set textwidth=80
set colorcolumn=-2

serait effectivement dessiner la barre de couleur à la position 78. Bien sûr, vous pouvez ou non définir la largeur du texte vous-même, il peut donc être 0 (par défaut). J'utilise le formulaire de position absolue.

Vous pouvez également changer la couleur utilisée si vous le souhaitez:

highlight ColorColumn ctermbg=green guibg=orange

(Je ne recommande cependant pas ces couleurs)

Cette option a été ajoutée dans (g) vim 7.3.

lornix
la source
Dans quelle version de Vim est-ce pris en charge? Cela ne fonctionne pas pour moi dans gvim 7.2.
Herms
Je lance 7.3. Je viens de tirer le code source et j'ai regardé, cette commande a été introduite en 7.3.
lornix
Fonctionne pour moi sur Ubuntu 12.04 avec vim 7.3. gvim 7.3 pour windows est disponible depuis au moins octobre 2010. @Herms pouvez-vous en faire la réponse?
poindexter
Ce serait bien si cela fonctionnait lors de l'utilisation de plusieurs fenêtres côte à côte. Mon moniteur est suffisamment large pour afficher plusieurs fenêtres d'affilée, chacune> 80 caractères mais colorColumn ne fonctionne que sur la première fenêtre (la plus à gauche).
Eno
3

Il existe un extrait de code Google que vous pouvez essayer:

augroup vimrc_autocmds
au!
    autocmd BufRead * highlight OverLength ctermbg=red ctermfg=white guibg=#592929 
    autocmd BufRead * match OverLength /\%81v.*/
augroup END
mcandre
la source
Hmm, ce fil suggère que le gvim de Windows le supporte déjà, mais je ne sais pas comment l'activer.
Herms
Il y a du code à ajouter à votre fichier gvimrc plus loin dans le fil.
EBGreen
semble que cela change juste l'arrière-plan des personnages qui vont au-delà de cette ligne. Je préfère avoir un guide toujours visible comme les autres éditeurs.
Herms
En raison de la nature de l'interface graphique, je ne suis pas certain que ce soit actuellement possible.
EBGreen
Cela ne s'adapte pas à la largeur du texte comme demandé dans la question.
Steven Roose
2

Selon une réponse StackOverflow :

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.*/

Ajustez à votre goût.

jtimberman
la source
Hm, pas tout à fait ce que je recherche (ne s'affiche que lorsque les personnages dépassent la ligne), mais c'est mieux que rien.
Herms
Cela ne s'adapte pas à la largeur du texte comme demandé dans la question.
Steven Roose
1

J'aime beaucoup la réponse de lornix mais je ne veux pas mettre la colonne en surbrillance tout le temps , seulement quand au moins une ligne dépasse la limite de longueur:

affichage de la colonne lorsque les lignes sont trop longues

Voici comment je le fais pour mes fichiers Haskell:

augroup HaskellCommands
autocmd!
  " When a Haskell file is read or the text changes in normal or insert mode,
  " draw a column marking the maximum line length if a line exceeds this length
  autocmd BufRead,TextChanged,TextChangedI *.hs call ShowColumnIfLineTooLong(80)
augroup END

" Color the column marking the lengthLimit when the longest line in the file
" exceeds the lengthLimit
function! ShowColumnIfLineTooLong(lengthLimit)
  " See /programming/2075276/longest-line-in-vim#2982789
  let maxLineLength = max(map(getline(1,'$'), 'len(v:val)'))

  if maxLineLength > a:lengthLimit
    highlight ColorColumn ctermbg=red guibg=red
    " Draw the vertical line at the first letter that exceeds the limit
    execute "set colorcolumn=" . (a:lengthLimit + 1)
  else
    set colorcolumn=""
  endif
endfunction
Matthias Braun
la source
0

Cela a souvent été discuté sur #vim et dans certains forums. Pour l'instant, ce n'est pas possible. La solution mentionnée est donc votre seule option, afaik.

Le truc, c'est que vim peut faire n'importe quoi avec des endroits où il y a des caractères (qu'ils soient des lettres, des chiffres ou tout simplement des espaces blancs). Mais il ne peut pas peindre un arrière-plan d'une couleur différente (comme vous le souhaitez), s'il n'y a rien là-bas. Et avant de taper quelque chose, il n'y a rien, il ne peut donc pas tracer de ligne / marge.

Tour
la source