Faire Vim montrer TOUS les espaces blancs en tant que caractère

Je ne trouve pas de moyen pour que Vim montre tous les espaces blancs en tant que personnage. Tout ce que j’ai trouvé concernait les tabs, les espaces de fin, etc.

Comme d’autres l’ont dit, vous pouvez utiliser

 :set list 

qui, en combinaison avec

 :set listchars=... 

afficher des caractères invisibles.
Maintenant, il n’y a pas d’option explicite que vous pouvez utiliser pour afficher les espaces, mais dans listchars, vous pouvez définir un caractère à afficher pour tout, MAIS les espaces. Par exemple, le mien ressemble à ceci

 :set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<  

alors, maintenant, après avoir utilisé

 :set list 

tout ce qui n'est pas explicitement présenté comme quelque chose d'autre est alors un véritable espace blanc.

Comme d'habitude, pour comprendre comment fonctionne listchars , utilisez l'aide. Il fournit d'excellentes informations sur les caractères pouvant être affichés (comme les espaces de fin, par exemple) et sur la marche à suivre:

 :help listchars 

Il pourrait être utile d'y append une bascule pour que vous puissiez voir les modifications en cours d'édition (source: VIM: set list! Comme bascule dans .vimrc ):

 noremap  :set list! inoremap  :set list! cnoremap  :set list! 

:set list pour activer.

:set nolist à désactiver.

A partir du patch 7.4.710, vous pouvez maintenant définir un caractère à afficher à la place de l’espace en utilisant listchars!

 :set listchars+=space:␣ 

Ainsi, pour afficher TOUS les caractères d’espace blanc en tant que caractère, vous pouvez effectuer les opérations suivantes:

 :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:< ,space:␣ :set list 

Discussion sur la liste de diffusion: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q

Je pense que d’autres réponses ici sont plus complètes, mais j’ai pensé partager un truc que j’utilise habituellement pour différencier visuellement les tabs et les espaces:

 :syntax on :set syntax=whitespace 

Ce sont des règles de mise en évidence de la syntaxe pour le langage de programmation Whitespace – les tabs apparaissent en vert et les espaces en rouge. 🙂

Peut être combiné avec :set list comme mentionné par beaucoup d’autres réponses, bien que les tabs apparaîtront alors comme ^ I sans feu vert, mais les espaces apparaîtront en rouge.

:set list affichera tous les espaces blancs en tant que caractère. Tout sauf un espace sera différent de son état normal, ce qui signifie que si vous voyez toujours un vieil espace, c’est vraiment un vieil espace. 🙂

Si vous définissez:

 :highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none 

et ensuite effectuer une recherche d’un espace, chaque caractère d’espace sera affiché comme un caractère de soulignement.

Vous pouvez utiliser cette commande dans une fonction pratique qui bascule “soulignement” des espaces.

 set hls let g:HLSpace = 1 let g:HLColorScheme = g:colors_name function ToggleSpaceUnderscoring() if g:HLSpace highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none let @/ = " " else highlight clear silent colorscheme "".g:HLColorScheme let @/ = "" endif let g:HLSpace = !g:HLSpace endfunction 

Mappez la fonction à une touche de raccourci avec:

 nmap   :call ToggleSpaceUnderscoring() 

NB: Définissez la fonction dans vimrc après avoir défini le schéma de couleurs.

Selon vos règles de syntaxe pour le tampon en cours, quelque chose comme ceci pourrait fonctionner:

 :syn match WhiteSpace / / containedin=ALL conceal cchar=Æ :setl conceallevel=2 concealcursor=nv 

Cela nécessite un vim 7.3 avec une fonctionnalité de masquage +

Mise à jour 24/10/2014 Pour développer un peu à ce sujet. Il est bien sûr possible de définir des surlignages pour les caractères encapsulés.

  • Vous pouvez configurer la façon dont les caractères cachés se présentent. Pour mettre en évidence, vous devez configurer au moins une fois le groupe de mise en évidence ‘Conceal’ (Voir l’aide à :h hl-Conceal Cela peut être fait dans votre schéma de couleurs et vous n’avez pas besoin de le reconfigurer à nouveau. chars (par exemple, si votre script de syntaxe cache d’autres éléments, ils seront affichés comme des espaces blancs). Cela pourrait ressembler à ceci:

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • Il semble y avoir une particularité que Vim ne mettra pas en évidence les espaces, si le script de syntaxe utilise le mot-clé skipwhite . Il n’y aura aucun moyen de contourner (peut-être que cela sera corrigé, j’ai posté un patch )

  • Il semble y avoir un patch qui circule, qui permettra de personnaliser l’apparence des espaces en mode list . Le dernier au moment de la rédaction semble être celui-ci . (Cela signifie que vous devez construire votre propre Vim pour l’utiliser).
  • Le conceallevel et le concealcursor sont des options locales de fenêtre. Cela signifie qu’ils peuvent être différents dans différentes fenêtres (et peuvent également être définis par des plug-ins de type fichier ou d’autres scripts de plug-in).
  • Les groupes de mise en évidence de la syntaxe doivent être exécutés chaque fois qu’un fichier de définition de syntaxe est rechargé. Cela pourrait être fait en utilisant un BufWinEnter ou peut-être aussi une autocommande Syntax ou même FileType . (Je n’ai pas testé lequel fonctionne réellement).

Les deux derniers éléments signifient que vous devez configurer des autocommandes qui réinitialisent les règles de syntaxe et les options correspondantes. Pour le premier, il peut être ColorScheme de configurer la mise en évidence à l’aide d’une autocommande ColorScheme (de sorte que les caractères masqués se présentent toujours de la même manière, indépendamment de la configuration des couleurs). Pour une solution complète, consultez la réponse de romainl, qui devrait vous donner un début. Si vous configurez une fonction, vous pouvez facilement configurer une commande à bascule pour activer ou désactiver l’affichage de la surbrillance spéciale.

Mise à jour 26/10/2014 J’ai créé un plugin à partir de cette question.

Mise à jour 22/04/2015 Un correctif a été inclus dans Vim, ce qui rend cela possible en utilisant l’option list . set list listchars+=space:␣ simplement set list listchars+=space:␣ Cela fonctionne à partir de Vim 7.4.711

Je l’utilise

 /\s :set hlsearch 

pour mettre en évidence les espaces blancs. Il recherche tous les espaces blancs, puis active la surbrillance pour les faire apparaître. Cependant, il n’imprime pas un caractère spécial.

Si vous entendez par “blancs” le caractère “”, ma suggestion serait simplement de rechercher / remplacer. Comme les autres ont fait allusion, set list modifie les caractères non imprimables en un caractère visible configuré dans listchars .

Pour montrer explicitement les espaces comme un autre personnage, quelque chose de similaire au suivant devrait faire l’affaire:

:%s/ /█/g

Ensuite, annulez simplement le changement pour revenir en arrière.

(pour obtenir le █ j’ai appuyé sur cette séquence de touches exacte :: % s / / CTRL-K F B / g )

Pour mettre en évidence des espaces, recherchez-le simplement:

/

Remarques:

  • signifie simplement taper le caractère d’espace.
  • Activer la mise en évidence des résultats de la recherche avec: set hlsearch
  • Pour mettre en évidence des espaces et des tabulations:

    / [ ]

    Un moyen rapide de supprimer les points saillants consiste à rechercher autre chose: / asdf

    (tapez simplement une courte liste de caractères aléatoires)

    Le code ci-dessous est basé sur la réponse de Christian Brabandt et semble faire ce que le PO veut:

     function! Whitespace() if !exists('b:ws') highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE highlight link Whitespace Conceal let b:ws = 1 endif syntax clear Whitespace syntax match Whitespace / / containedin=ALL conceal cchar=· setlocal conceallevel=2 concealcursor=c endfunction augroup Whitespace autocmd! autocmd BufEnter,WinEnter * call Whitespace() augroup END 

    Ajoutez ces lignes à votre ~/.vimrc et lancez une nouvelle session Vim pour voir la magie encore imparfaite se produire.

    N’hésitez pas à éditer les couleurs par défaut et à dissimuler le caractère.


    Attention: quelque chose dans le groupe de syntaxe *FuncBody dans plusieurs langues empêche l’affichage du point central. Je ne sais pas (encore?) Comment rendre cette solution plus fiable.

    J’ai été frustré par toutes les autres réponses à cette question, car aucune d’entre elles ne met en évidence de manière utile le caractère spatial. L’affichage d’espaces en tant que caractères serait particulièrement utile pour les langages formatés en blanc, où le mélange d’tabs et d’espaces est dangereux.

    Ma solution consiste à afficher des tabs et à souligner plusieurs espaces. Il emprunte à la réponse de mrucci et à ce tutoriel . Comme il utilise la coloration syntaxique, il est persistant:

     set list listchars=tab:\|\ highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow match Whitespace / \+/ 

    En utilisant cela, les tabs sont affichés comme | et des espaces comme _ , ce qui rend très facile à dire quand je mélange des styles de code.

    Le seul inconvénient que j’ai trouvé est que cet extrait ne règle pas la couleur d’arrière-plan pour correspondre au contexte (comme dans un commentaire).

    Toutes les réponses ci-dessus tentent de rendre les espaces visibles depuis l’intérieur de vim. Si vous insistez vraiment pour avoir des espaces visibles comme points, il y a une autre approche …

    Si cela ne peut pas être fait dans vim, changez complètement votre police. J’ai copié la police Ubuntu One Mono et l’ai modifiée avec FontForge. N’oubliez pas de changer le nom complet de la police, sa famille, sa famille préférée, le nom complet compatible (dans FontFoge, il se trouve sous les noms TTF dans les informations sur la police), afin de le définir comme une police distincte. Editez simplement le caractère d’espace pour avoir un point au milieu et enregistrez la police dans ~ / .fonts Maintenant, vous pouvez l’utiliser pour votre gvim ou le terminal entier … J’ai copié le “!” personnage, enlevé la ligne et déplacé le point au milieu. Il a fallu un peu plus de 5 minutes …

    Remarque: la modification du caractère d’espace (0x20) entraîne l’inconvénient d’avoir des points sur la totalité de l’écran vim … (mais cela séparera les espaces des tabs …)

     :match CursorLine /\s\+/ 

    évite le “vous devez chercher des espaces pour les amener à apparaître” peu mais afaict ne peut pas être configuré pour faire des choses sans hilighting dans les espaces. CursorLine peut être n’importe quel groupe de hilighting et dans le thème par défaut, c’est un simple soulignement.

    J’aime utiliser des caractères spéciaux pour montrer les espaces, c’est plus clair. Même une carte à basculer est une fonctionnalité clé, pour une vérification rapide.

    Vous pouvez trouver ces fonctionnalités dans un ancien script vim non mis à jour depuis 2004:

    vim-scripts/cream-showinvisibles@vim.org

    Grâce au projet vim-scripts et vundle, vous pouvez revenir à la vie de ce plugin

    vim-scripts / cream-showinvisibles @ github

    Mieux encore, mes deux cents sur ce point consistent à append un raccourci configurable (au lieu de F4 prédéfini)

    alors ajoutez ceci à ~ / .vimrc

     Plugin 'albfan/cream-invisibles' let g:creamInvisibleShortCut = "" "for my F4 goto next error 

    installer le plugin sur vim

     :PluginInstall 

    et voilà

    J’ai trouvé que l’ajout de ces derniers à mon fichier .vimrc fonctionnait le plus efficacement

     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() 

    Vous pourriez utiliser

     :set list 

    vraiment voir la structure d’une ligne. Vous verrez explicitement les tabs et les nouvelles lignes. Quand vous voyez un blanc, c’est vraiment un blanc.

    mettre en évidence la recherche

     :set hlsearch 

    dans .vimrc c’est

    et rechercher des tabulations d’espace et des retours chariot

     / \|\t\|\r 

    ou rechercher tous les caractères d’espacement

     /\s 

    de recherche de tous les espaces non blancs (les caractères d’espacement ne sont pas affichés, vous voyez donc les caractères d’espacement entre les mots, mais pas les caractères de fin)

     /\S 

    pour afficher tous les caractères blancs en fin de ligne – à la fin de la ligne

     /\s$ 

    Pour couvrir les caractères d’espacement Unicode:

     set list set listchars=tab:│\ ,nbsp:· highlight StrangeWhitespace guibg=Red ctermbg=Red " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed): call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]') 

    Le résultat:

    • seul l’espace ordinal (U + 0020) ressemble à un espace (” “)
    • l’onglet (U + 0009) ressemble à ” ” (deux caractères: un long tuyau et ensuite un espace ordinal; ils sont gris dans colorscheme murphy )
    • l’espace insécable normal (U + 00A0) ressemble à ” · ” (un caractère; il est gris dans colorscheme murphy )
    • tout autre caractère blanc ressemble à du rouge ”
     :se list :se nolist 

    :se suffit, :set n’est pas nécessaire.

    vous pouvez également mettre en évidence les espaces (en remplaçant les espaces par un bloc):

     :%s/ /█/g 

    (avant d’écrire annuler)

    L’ajout de ceci à mon fichier .vimrc fonctionne pour moi. Assurez-vous simplement que vous n’avez rien d’autre en conflit.

     autocmd VimEnter * :syn match space /\s/ autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black