Afficher les espaces de fin dans vim

10

Je voudrais avoir un affichage agréable et doux de l'espace blanc arrière dans mon terminal vim. Cela me permettrait de les supprimer avant de fermer le fichier.

Je suis conscient que cette question est assez populaire et j'ai déjà trouvé des dizaines de réponses sur SO. Malheureusement je n'en ai pas encore trouvé de satisfaisant ...

Je vais donc essayer de résumer les informations recueillies et les solutions que j'ai trouvées.

Solution 1: surlignez manuellement les espaces de fin

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Mettez en surbrillance les espaces vides de fin

Avantages:

  • Facile à utiliser
  • Vite
  • Compatible avec cursorline

Les inconvénients:

  • La couleur choisie n'est pas compatible avec d'autres schémas de couleurs car la couleur est définie manuellement sur red
  • Les gros blocs de fond rouges ne sont pas très esthétiques

Solution 2: utilisation de la fonction de liste

set list
set listchars+=trail:◦

entrez la description de l'image ici entrez la description de l'image ici

Avantages:

  • Facile à utiliser
  • Vite

Les inconvénients:

  • Problème si :set cursorlineactivé
  • La couleur dédiée à list/trailn'est pas configurable. Doit être le même que les autres listchars

Solution 3: utilisation de la fonction de masquage

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

entrez la description de l'image ici entrez la description de l'image ici

Avantages:

  • Plus jolie que la première solution

Les inconvénients:

  • L'arrière-plan n'est pas le même que l'arrière-plan du curseur
  • Peut interférer avec d'autres règles de dissimulation
  • Couleur choisie pas toujours compatible avec la palette de couleurs
  • Non compatible avec l'ancienne version de Vim

Ma question

Laquelle des solutions énumérées est la plus appropriée en termes de performances et de compatibilité et comment puis-je obtenir tous les avantages et aucun des inconvénients?

En d'autres termes, je voudrais trouver une solution où:

  • La couleur de fin de surbrillance correspond à la couleur choisie
  • Cette couleur est clairement visible mais pas trop agressive pour les yeux
  • Compatible avec cursorline(arrière-plan et premier plan) `
  • Compatible avec d'autres plugins qui peuvent utiliser dissimuler
  • Le caractère de fin peut être défini sur n'importe quel caractère Unicode
nowox
la source
Si vous n'aimez pas le rouge, choisissez une couleur différente. Si vous souhaitez que la couleur soit compatible avec différents schémas de couleurs, créez un lien vers un nom de groupe de couleurs au lieu d'utiliser une couleur particulière, par exemple :hi link ExtraWhitespace CursorLine. Tu vois :help hi-link.
garyjohn

Réponses:

4

En termes de performances, rien de tout cela ne devrait faire la différence. Vim est principalement embourbé par des modèles de syntaxe complexes; le modèle ici est assez simple.

Pour que la couleur de surbrillance corresponde au schéma de couleurs choisi, utilisez :hi linkun groupe existant; généralement, ce serait Error. Bien sûr, tout cela n'a d'importance que si vous changez souvent de couleurs (assez différentes); sinon, utiliser des couleurs appropriées directement (comme dans votre solution 1) serait bien aussi.

Solution 1: surlignez manuellement les espaces de fin

J'irais pour cela, mais en utilisant matchadd()au lieu de :match; cela laisse ce dernier pour un surlignage personnalisé. Aussi, clearmatches()c'est trop grossier; il supprime toutes les correspondances et peut donc affecter les plugins. Vous pouvez utiliser / jeter un œil à mon plugin ShowTrailingWhitespace pour une implémentation propre et puissante (qui inclut également des exceptions pour certains types de fichiers). Oui, c'est une solution beaucoup plus importante, mais je n'ai pas encore remarqué d'impact.

Solution 2: utilisation de la fonction de liste

C'est une fonctionnalité utile en soi, et le garder en permanence a des effets sur le positionnement du curseur sur les caractères Tab, donc je ne le recommanderais pas.

Solution 3: utilisation de la fonction de masquage

Cela va sûrement interférer avec certaines syntaxes et plugins utilisant la fonctionnalité. Mauvaise idée.

Ingo Karkat
la source
Donc, d'après votre réponse, je comprends qu'il existe une telle solution qui permet d'utiliser un caractère Unicode personnalisé pour marquer des espaces supplémentaires. Cette question est en effet plus délicate que je pensais au départ.
nowox
À droite, les caractères personnalisés ne fonctionnent qu'avec 'listchars'. Pour moi, la mise en évidence est plus que suffisante (surtout avec des couleurs agressives).
Ingo Karkat