web-dev-qa-db-fra.com

Comment amener Vim à mettre en évidence des caractères non-ASCII?

J'essaie de faire en sorte que Vim mette en surbrillance les caractères non-ASCII. Existe-t-il un paramètre, un modèle de recherche regex ou un plugin disponible pour le faire?

122
chutsu

En utilisant une plage dans une classe de caractères [] dans votre recherche, vous devriez pouvoir exclure la plage de caractères hexadécimaux ASCII, et donc mettre en surbrillance (en supposant que vous avez activé hlsearch) tous les autres caractères situés en en dehors de la plage ASCII:

/[^\x00-\x7F]

Ceci fera une correspondance négative (via [^]) pour les caractères compris entre ASCII 0x00 et ASCII 0x7F (0-127) et semble fonctionner dans mon test simple. Pour l'ASCII étendu, bien sûr, étendez la plage jusqu'à \xFF au lieu de \x7F à l'aide de /[^\x00-\xFF].

Vous pouvez également l'exprimer en décimal via \d:

/[^\d0-\d127]

Si vous avez besoin de quelque chose de plus spécifique, comme l'exclusion de caractères non imprimables, vous devrez ajouter ces plages dans la classe de caractères [].

232

Oui, il existe une fonctionnalité native à mettre en surbrillance pour toutes les chaînes correspondantes. Dans Vim, faites:

:help highlight
:help syn-match

syn-match définit une chaîne qui correspond à un groupe. highlight définit la couleur utilisée par le groupe. Il suffit de penser à la coloration syntaxique de vos fichiers vimrc. 

Vous pouvez donc utiliser les commandes ci-dessous dans votre fichier .vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
31
Steven Ding

Pour les autres personnes (désormais moins malchanceuses) qui se retrouvent ici via un moteur de recherche et ne peuvent pas mettre en évidence les caractères non-ASCII, essayez ceci (mettez ceci dans votre fichier .vimrc):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

Cela présente l’avantage supplémentaire de ne pas entrer en conflit avec les définitions de syntaxe habituelles (basées sur le type de fichier [extension de fichier]).

14
PAStheLoD

Si vous êtes également intéressé par les caractères non imprimables , utilisez celui-ci: /[^\x00-\xff]/

Je l'utilise dans une fonction:

 function! NonPrintable()
   setlocal enc=utf8
   if search('[^\x00-\xff]') != 0
     call matchadd('Error', '[^\x00-\xff]')
     echo 'Non printable characters in text'
   else
     setlocal enc=latin1
     echo 'All characters are printable'
   endif
 endfunction
4
Reman

Cette regex fonctionne aussi bien. C'était le premier hit Google pour "vim remove non-caractères ASCII" de briceolion.com et avec :set hlsearch va mettre en évidence:

:/[^[:alnum:][:punct:][:space:]]/g
3
Grant Bowman

Sur la base des autres réponses à ce sujet et de la réponse que j'ai obtenue ici , j'ai ajouté ceci à mon .vimrc, afin de pouvoir contrôler la mise en surbrillance non ascii en tapant <C-w>1. Il affiche également les commentaires internes, bien que vous deviez ajouter le groupe de commentaires pour chaque syntaxe de fichier que vous utiliserez. Autrement dit, si vous voulez éditer un fichier zsh, vous devrez ajouter zshComment à la ligne.

au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment

sinon, le caractère non-ascii ne sera pas affiché (vous pouvez également définir conteneur contient dans = TOUT si vous voulez être sûr d'afficher des caractères non-ASCII dans tous les groupes). Pour vérifier comment le commentaire est appelé sur un type de fichier différent, ouvrez un fichier du type souhaité et entrez :sy dans vim, puis recherchez les éléments de syntaxe correspondant au commentaire.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom "Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  let g:is_non_ascii_on=1
endfunction

function ToggleHighlightNonascii()
  if g:is_non_ascii_on == 1
    call HighlightNonAsciiOff()
  else
    call HighlightNonAsciiOn()
  endif
endfunction

silent! call HighlightNonAsciiOn()
nnoremap <C-w>1 :call ToggleHighlightNonascii()<CR>
1
Werner

D'une manière ou d'une autre, aucune des réponses ci-dessus n'a fonctionné pour moi.

J'ai donc utilisé :1,$ s/[^0-9a-zA-Z,-_\.]//g

Il garde la plupart des personnages qui m'intéressent.

0
user2250246

Quelqu'un a déjà répondu à la question. Toutefois, pour les autres qui rencontrent encore des problèmes, voici une autre solution pour mettre en évidence les caractères non ascii dans les commentaires (ou tout groupe de syntaxe en la matière). Ce n'est pas le meilleur, mais c'est une solution temporaire.

On peut essayer:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

Cela a mélanger des pièces d'autres solutions. Vous pouvez supprimer contained, mais dans la documentation, il peut y avoir un problème de récurrence (si je comprends bien). Pour afficher d'autres modèles définis, la section syn-contains le contiendrait.

:help syn-containedin
:help syn-contains 

Problème dupliqué à partir de: Définir l’élément comme prioritaire mettre en évidence la priorité sur vim

0
nate