web-dev-qa-db-fra.com

Faire en sorte que Vim affiche TOUS les espaces blancs en tant que personnage

Je ne trouve pas le moyen de faire en sorte que Vim affiche tous les espaces blancs en tant que personnage. Tout ce que j'ai trouvé concernait des tabulations, des espaces de fuite, etc.

724
Matt

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

:set list

qui, en combinaison avec

:set listchars=...

afficher des caractères invisibles.
Maintenant, il n’existe pas d’option explicite que vous pouvez utiliser pour afficher des espaces , mais vous pouvez définir un caractère dans listchars. montrer 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 montré comme quelque chose d'autre est alors, en réalité, un vieil espace blanc.

Comme d’habitude, utilisez l’aide pour comprendre le fonctionnement de listchars. Il fournit d'excellentes informations sur les caractères qui peuvent être affichés (comme l'espace de fin, par exemple) et comment le faire:

:help listchars

Il peut être utile d’ajouter une bascule pour que vous puissiez voir facilement les modifications en cours d’édition (source: VIM: définir la liste! En tant que bascule dans .vimrc ):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>
648
Rook

:set list pour l'activer.

:set nolist à désactiver.

243
Marcin

À partir du patch 7.4.71 vous pouvez maintenant définir un caractère à afficher à la place de l'espace à l'aide de listchars!

:set listchars+=space:␣

Ainsi, pour afficher TOUS caractères d'espaces 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

240
Brett Y

Je pense que les autres réponses ici sont plus complètes, mais je pensais partager une astuce que j'utilise habituellement pour différencier visuellement les tabulations et les espaces:

:syntax on
:set syntax=whitespace

Ce sont des règles de mise en évidence de la syntaxe pour les onglets langage de programmation Whitespace - apparaissent en vert et les espaces en rouge. :)

Peut être combiné avec :set list comme mentionné par de nombreuses autres réponses, bien que les onglets apparaîtront alors comme ^ I sans voyant vert, mais les espaces apparaîtront en rouge.

176
Eliot

:set list affichera tous les espaces comme un caractère. Tout mais un espace sera différent de son état normal, ce qui signifie que si vous voyez toujours un ancien espace vide, il s'agit vraiment d'un ancien espace vide. :)

88
Ether

Si vous définissez:

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

puis effectuez une recherche d’espace, chaque caractère de l’espace apparaît en tant que caractère souligné.

Vous pouvez utiliser cette commande dans une fonction pratique qui bascule le "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 sur une touche de raccourci avec:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

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

73
mrucci

En fonction de vos règles de syntaxe pour le tampon actuel, ceci pourrait fonctionner:

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

Cela nécessite un vim 7.3 avec + caché

Mise à jour du 10/24/2014 Pour en dire un peu plus. Il est bien sûr possible de définir une surbrillance pour les personnages encollés.

  • Vous pouvez configurer l'apparence des caractères cachés. Pour mettre en surbrillance, vous devez au moins une fois configurer le groupe de surbrillance 'Dissimulation' (voir l'aide à la section :h hl-Conceal). Cette opération peut être effectuée dans votre schéma de couleurs et vous n'avez pas besoin de la reconfigurer à nouveau. caractères (par exemple, si votre script de syntaxe cache quelques éléments supplémentaires, ils seront affichés sous forme de caractères d'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 les espaces en évidence si le script de syntaxe utilise le mot-clé skipwhite. Il n'y aura pas d'autre solution (peut-être que cela sera corrigé, j'ai posté un patch )

  • Il semble y avoir un patch flottant qui permettra de personnaliser l'apparence des espaces en mode list. Le dernier en date semble être celui-ci . (Cela signifie que vous devez créer votre propre Vim pour l'utiliser).
  • Les conceallevel et concealcursor sont des options locales de la fenêtre. Cela signifie qu'ils peuvent être différents dans différentes fenêtres (et seront éventuellement définis par des plugins de type fichier ou d'autres scripts de plugin).
  • 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 une BufWinEnterou éventuellement 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, on peut vouloir configurer la surbrillance en utilisant une auto-commande ColorScheme (pour que les caractères masqués aient toujours le même aspect, indépendamment de ce que le jeu de couleurs définit réellement). Pour une solution complète, examinez la réponse romainl, cela devrait vous donner un bon départ. 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 du 26/10/2014 J'ai créé un plugin à partir de cette question.

Mise à jour du 22/04/2015 Un correctif intégré à Vim rend cela possible grâce à l'option list. Il suffit de définir set list listchars+=space:␣ Ceci fonctionne à partir de Vim 7.4.711

45

Je l'utilise

/\s
:set hlsearch

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

30
Benedikt Köppel

Si par blanc vous entendez le caractère '', ma suggestion serait simplement une recherche/remplacement. Comme les autres l'ont laissé entendre, set list change non imprimant caractères en un caractère visible configuré dans listchars.

Pour montrer explicitement les espaces comme un autre personnage, un truc similaire à celui ci-dessous 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-KFB/g)

22
Randy Morris

Pour mettre en évidence des espaces, il suffit de le rechercher:

/ <espace>

Remarques:

  • <space> signifie simplement taper le caractère espace.
    • Activez la surbrillance des résultats de recherche avec: set hlsearch

      Pour mettre en évidence des espaces et des onglets:

      /[<espace> <tab>]

      Un moyen rapide de supprimer les points forts est de rechercher autre chose:/asdf

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

  • 16
    vimmer

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

    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 démarrez une nouvelle session Vim pour voir la magie toujours imparfaite se produire.

    N'hésitez pas à éditer les couleurs par défaut et à masquer les caractères.


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

    14
    romainl

    Toutes les autres réponses à cette question m'ont frustré, car aucune d'elles ne met en valeur le caractère d'espace de manière utile. L'affichage d'espaces en tant que caractères serait particulièrement utile pour les langages au format espace blanc, où le mélange d'onglets et d'espaces est préjudiciable.

    Ma solution consiste à afficher des onglets et à souligner plusieurs espaces. Il emprunte à réponse de mrucci et ce tutoriel . Parce qu'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 /  \+/
    

    Grâce à cela, les onglets sont affichés sous la forme | et les espaces sous la forme _, ce qui permet de distinguer très facilement les styles de code.

    Le seul inconvénient que j'ai constaté est que cet extrait ne modifie pas la couleur d'arrière-plan en fonction du contexte (comme dans un commentaire).

    11
    Wylie

    toutes les réponses ci-dessus tentent de rendre les espaces visibles depuis vim. Si vous insistez vraiment pour avoir des espaces visibles sous forme de points, il existe une autre approche ...

    Si cela ne peut pas être fait dans vim, changez entièrement votre police. J'ai copié la police Ubuntu One Mono et l'ai modifiée à l'aide de FontForge. N'oubliez pas de changer le nom complet de la police, la famille, la famille préférée, la compatibilité complète (dans FontFoge, c'est sous Noms TTF dans les informations sur la police), afin de l'avoir comme police distincte. Modifiez simplement le caractère espace pour qu'il ait un point au milieu et enregistrez la police dans ~/.fonts. Vous pouvez maintenant l’utiliser pour votre gvim ou l’ensemble du terminal ... J'ai copié le "!" caractère, enlevé la ligne et déplacé le point au milieu. Cela a pris un peu plus de 5 minutes ...

    Remarque: changer le caractère d'espace (0x20) entraîne l'inconvénient d'avoir des points sur tout l'écran de vim ... (mais cela séparera les espaces des onglets ...)

    8
    chef

    Je n'ai pas trouvé exactement ce que je voulais parmi les réponses existantes. Le code ci-dessous mettra en surbrillance tous les espaces de fin rouge vif. Ajoutez simplement ce qui suit à votre .vimrc

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

    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 ordinale (U + 0020) ressemble à un espace ("")
    • l'onglet (U + 0009) ressemble à "│ " (deux caractères: un long tuyau puis un espace ordinal; ils sont gris dans colorscheme murphy)
    • l'espace insécable normal (U + 00A0) ressemble à "·" (un caractère; il est gris en colorscheme murphy)
    • tout autre caractère blanc ressemble à un rouge ""
    5
    Kirill Bulygin
    :match CursorLine /\s\+/
    

    évite le bit "vous devez rechercher des espaces pour les faire apparaître" mais un afaict ne peut pas être configuré pour faire des choses non-hilighting aux espaces. CursorLine peut être n'importe quel groupe hiérarchique et, dans le thème par défaut, il est simplement souligné.

    5
    ldrg

    J'aime utiliser des caractères spéciaux pour afficher 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/[email protected]

    Merci à project vim-scripts et vundle vous pouvez revenir à la vie ce plugin

    vim-scripts/cream-showinvisibles @ github

    Mieux encore, mon avantage est d’ajouter un raccourci configurable (au lieu de prédéfini). F4)

    alors ajoutez ceci à ~/.vimrc

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

    installer le plugin sur vim

    :PluginInstall
    

    et voilà

    5
    albfan

    Vous pourriez utiliser

    :set list
    

    pour vraiment voir la structure d'une ligne. Vous verrez explicitement les onglets et les nouvelles lignes. Lorsque vous voyez un blanc, c'est vraiment un blanc.

    4
    tangens

    mettre en évidence la recherche

    :set hlsearch 
    

    dans .vimrc c'est-à-dire

    et rechercher des tabulations d'espace et des retours chariot

    / \|\t\|\r
    

    ou recherchez tous les caractères d'espaces

    /\s
    

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

    /\S
    

    pour afficher tous les espaces finaux - à la fin de la ligne

    /\s$
    
    3
    MichaelMoser

    Conservez ces hacks dans le fichier .vimrc sous forme de commentaires, donc dans le shell, simplement:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    
    3
    Yordan Georgiev

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

    :%s/ /█/g
    

    (avant d'écrire, annulez-le)

    1
    Federico Bucchi
    :se list
    :se nolist
    

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

    1
    sjas

    Ajouter ceci à mon fichier .vimrc fonctionne pour moi. Assurez-vous juste 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
    
    1
    jroot