Problèmes de disposition des colonnes Vim 80

417

La façon dont je fais indication 80 colonnes dans vim semble incorrecte: set columns=80. Parfois aussi set textwidth, mais je veux pouvoir voir et anticiper le débordement de ligne avec l' set columnsalternative.

Cela a des effets secondaires malheureux :

  1. Je ne peux pas set numbercraindre de diviser des fichiers qui ont des ordres de numéros de ligne différents; c'est-à-dire que les fichiers <100 lignes et> = les fichiers 100 lignes nécessiteront deux set columnsvaleurs différentes en raison de la colonne supplémentaire utilisée pour l'affichage des chiffres supplémentaires.
  2. Je démarre également de nouvelles sessions (g) Vim au lieu de diviser les fenêtres verticalement. En effet vsplit, cela m'oblige à set columnschaque fois que j'ouvre ou ferme un volet, donc le démarrage d'une nouvelle session est moins compliqué.

Comment gérez-vous l'indication de 80 caractères lorsque vous voulez set numbers, diviser verticalement, etc.?

cdleary
la source
60
Il est considéré comme un bon style de code dans de nombreux cercles; par exemple, le Guide de style de Python (PEP8) recommande 79 lignes de caractères: python.org/dev/peps/pep-0008
cdleary
4
Ce n'est pas un absolu "vous devez avoir 80 lignes de caractères", mais cela rend la lecture plus agréable sur certains systèmes, comme par exemple toute application basée sur une console qui ne s'exécute pas dans une fenêtre de console graphique pouvant être redimensionnée.
Matthew Scharley
47
@davr: Tout d'abord, c'est plus facile à lire. Certaines études suggèrent qu'une longueur de ligne courte (76 caractères par ligne) est la plus agréable et la plus rapide à lire en ligne. Savez-vous ceci: soudain, vos yeux sont sur la mauvaise ligne lors de la lecture? Cela arrive rarement avec 80 caractères. Deuxièmement, j'édite ou diffère souvent visuellement avec deux fichiers côte à côte sur mon moniteur de 1600 pixels de large. Cela ne fonctionne bien que si le fichier ne comporte pas de lignes de plus de 80 caractères. Je reformate donc souvent de longues lignes avant de pouvoir travailler efficacement.
nalply
25
@davr c'est incroyablement utile pour éditer plusieurs fichiers côte à côte.
aehlke
2
Je fais beaucoup moins de bugs dans le code C / C ++ et JS depuis que j'ai adopté une largeur de ligne de 80 caractères (à partir du style de codage du noyau). Je le déborde parfois par un couple, mais rarement ...
Mark K Cowan

Réponses:

586

J'ai ceci installé dans mon .vimrc:

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

Cela met en évidence l'arrière-plan dans un rouge subtil pour le texte qui dépasse la limite de 80 colonnes (subtile en mode GUI, de toute façon - en mode terminal, c'est moins le cas).

Simon Howard
la source
3
Bonne idée! Je l'ai changé en "ctermbg = darkred" et "guibg = # FFD9D9" pour mieux répondre à mes besoins (fond clair en gvim et sombre en mode cterm).
HS.
10
Je pense qu'une correction subtile est /\%81v.\+/ - pour une raison quelconque, le. * Met en évidence les endroits où les personnages n'existent pas.
cdleary
14
Je pense que cette ligne est légèrement meilleure pour le regex de correspondance: match OverLength /\%>80v.\+/ Cela ne met pas en évidence le caractère de `` fin de ligne '' et est également plus intuitif car vous venez de définir le nombre à ce que vous voulez la longueur de ligne à être, pas +1.
David Terei
8
Pour une raison quelconque, cela ne fonctionne que dans le premier tampon ouvert pour moi (première fenêtre du premier onglet) dans mon vim ...
lajarre
3
Consultez stackoverflow.com/a/10993757/9822 si cette solution ne fonctionne que dans votre premier tampon.
Jesse Vogt
769

Depuis vim 7.3, vous pouvez utiliser set colorcolumn=80( set cc=80pour faire court).

Étant donné que les versions antérieures ne prennent pas en charge cela, mes .vimrcutilisations à la place:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Voir également la documentation en ligne sur l' colorcolumnoption .

Jeremy W. Sherman
la source
26
Vous pouvez même automatiquement baser la valeur de 'colorcolumn' sur 'textwidth' avec quelque chose comme: set cc = + 1
graywh
1
has ("colorcolumn") n'a pas fonctionné pour moi. Je devais utiliser à la place exist ("& colorcolumn").
SpoonMeiser
5
Très bien, sauf que vim <7.1.40 ne supporte pas matchadd.
Greg Jandl
19
vous pouvez également changer la couleur de la colonne avechighlight ColorColumn ctermbg=7
null_radix
2
La documentation de cette option se trouve sur vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade
54

Manière plus courte:

match ErrorMsg '\%>80v.\+'
Maksim Vi.
la source
8
J'aime vraiment ça car ça ne pollue pas mon tampon avec une longue ligne verticale! (Y)
Ionică Bizău
ErrorMsgest un highlight-group. Il existe de nombreux groupes de surbrillance par défaut dans Vim que vous pouvez utiliser en fonction du codage de couleur souhaité pour ce cas.
crisron
49

Je préfère:

highlight ColorColumn ctermbg=gray
set colorcolumn=80
wieczorek1990
la source
J'aime celui la. J'ai utilisé du noir au lieu du gris et c'était plus subtil car mon fond est presque noir mais pas tout à fait.
Oscillation isopycnale
30

La réponse de Simon Howard est excellente. Mais /\%81v.\+/ne met pas en évidence les onglets qui dépassent la colonne 81. J'ai donc fait un petit ajustement, basé sur les trucs que j'ai trouvés sur le wiki VIM et le choix de couleurs de HS ci-dessus:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

Et maintenant, VIM mettra en évidence tout ce qui dépasse la colonne 80.

Z.Zen
la source
2
Pourrait vouloir ajouter guifg=whitesur la fin là-bas.
Dan Bechard
17

entrez la description de l'image ici

Approche minimaliste, pas exagérée. Seul le 79e caractère des lignes trop longues est mis en évidence. Il surmonte quelques problèmes courants: fonctionne sur de nouvelles fenêtres, les mots débordants sont mis en évidence correctement.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Remarque: notez que FileType scala,javaceci limite cela aux fichiers source Scala et Java. Vous voudrez probablement personnaliser cela. Si vous deviez l'omettre, cela fonctionnerait sur tous les types de fichiers.

Dominykas Mostauskis
la source
Pourquoi avez-vous ajouté un FileType scala,java? (ne travaille pas pour moi)
Dorian
1
@ Dorian, cela limite les types de fichiers Scala et Java, car ce sont les types de fichiers sur lesquels je travaillais à l'époque. J'ai oublié de le mentionner. Mise à jour de la réponse.
Dominykas Mostauskis
Quelle police utilisez-vous dans la capture d'écran? Je trouve ça très agréable à l'oeil.
Tour
@Idigas: D'accord, et j'ai l'impression que peut-être Comic Sans était peut-être un mauvais choix lorsque j'ai initialement créé PuTTY :)
Mark K Cowan
Je n'ai pas pu obtenir l'extrait de cette réponse pour travailler dans Vim 7.4. (J'ai également supprimé le filtre FileType.)
Mnebuerquo
13

Vous pouvez également tracer une ligne pour voir la limite de 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Résultat:

entrez la description de l'image ici

0x8BADF00D
la source
13

Une belle façon de marquer uniquement le premier caractère sortant des limites spécifiées:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

D'après le discours de Damian Conway .

Shanded
la source
7

Les versions plus récentes de vim autorisent une :set numberwidth=xvaleur, qui définit la largeur de l'affichage du numéro de ligne. Je n'utilise pas vraiment le pliage, etc., donc je n'en sais rien. Cependant, dessiner une fine ligne verticale dépasse les capacités d'une application console. GVim peut autoriser cela (je ne l'utilise pas, je ne peux donc pas y commenter).

Matthew Scharley
la source
5

Je crains que vous n'ayez imposé des contraintes à l'ensemble de solutions qui, eh bien, vous laissent avec l'ensemble nul.

L'utilisation :set textwidth=80résoudra tous les problèmes que vous avez mentionnés, sauf que vous ne pouvez pas facilement voir la limite de ligne à venir. Si vous le faites :set ruler, vous activez l'affichage de la position x, y sur la barre d'état, que vous pouvez utiliser pour voir dans quelle colonne vous vous trouvez.

Hormis cela, je ne sais pas quoi vous dire. C'est dommage de perdre la colonne numérique, la colonne de pliage et les divisions juste parce que vous le devez :set columns=80.

Lucas Oman
la source
Oui, j'avais peur de ça ... J'espérais qu'il y aurait un moyen caché de dessiner une fine ligne verticale comme dans les éditeurs plus orientés graphiquement.
cdleary
5

Vous pouvez essayer ceci:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Cela mettra en place deux faits saillants dans chaque tampon, un pour les caractères dans les 8 colonnes avant ce que vous avez &textwidthdéfini et un pour les caractères au-delà de cette colonne. De cette façon, vous avez une certaine anticipation. Bien sûr, vous pouvez le modifier pour utiliser une largeur différente si vous voulez plus ou moins d'anticipation (que vous payez sous la forme d'une perte de coloration syntaxique dans ces colonnes).

Aristote Pagaltzis
la source
3

Eh bien, en regardant les colonnes: help, ce n'est pas vraiment fait pour jouer avec.

Dans la console, il est généralement déterminé par les paramètres de la console (c'est-à-dire qu'il est détecté automatiquement); dans l'interface graphique, il détermine (et est déterminé par) la largeur des fenêtres gvim.

Donc, normalement, vous laissez les consoles et les gestionnaires de fenêtres faire leur travail en commentant le set columns

Je ne sais pas trop ce que vous entendez par «voir et anticiper le débordement de ligne». Si vous souhaitez que EOL soit inséré à peu près dans la colonne 80, utilisez soit set textwidthou set wrapmargin; si vous voulez juste un habillage doux (c'est-à-dire que la ligne est enveloppée, mais pas de fin de vie réelle), alors jouez avec set linebreaket set showbreak.

Ding-Yi Chen
la source
2

celui-ci est hors du champ gauche mais c'est une jolie petite carte pour redimensionner votre division actuelle à 80 caractères si vous avez les numéros de ligne:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 
ErichBSchulz
la source
1

Vous pouvez essayer cela pour définir la taille de la fenêtre afin d'autoriser 80 caractères de texte réel. Cela ne fonctionne toujours pas avec les divisions verticales.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Cela nécessite vim 7+, 7.3 pour relativenumber.

Mike L
la source