Comment amener Vim à mettre en évidence les caractères non-ascii?

153

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

chutsu
la source

Réponses:

291

En utilisant la plage dans une []classe de caractères dans votre recherche, vous devriez pouvoir exclure la plage de caractères hexadécimaux ASCII, mettant ainsi en évidence (en supposant que vous avez hlsearchactivé) tous les autres caractères situés en dehors de la plage ASCII:

/[^\x00-\x7F]

Cela fera une correspondance négative (via [^]) pour les caractères entre ASCII 0x00et ASCII 0x7F(0-127), et semble fonctionner dans mon test simple. Pour l'ASCII étendu, bien sûr, étendez la plage jusqu'à au \xFFlieu de l' \x7Futiliser /[^\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 des caractères non imprimables, vous devrez ajouter ces plages dans la classe de caractères [].

Michael Berkowski
la source
14
En décimal:/[^\d0-\d127]
Bohr
@Bohr C'est une belle addition. Je vais le modifier ci-dessus.
Michael Berkowski
génial! sauvé la journée! l'un des caractères d'indentation a été collé dans mon code python et l'erreur unicode a commencé à me tuer. était difficile à détecter parmi le même caractère utilisé par le plugin vim!
kollery
36

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

:help highlight
:help syn-match

syn-matchdéfinit une chaîne qui correspond à tomber dans un groupe. highlightdéfinit la couleur utilisée par le groupe. Pensez simplement à 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
Steven Ding
la source
vous n'avez pas besoin de placer le :devant les commandes dans votre vimrc.
FDinoff
termbgne semble pas être une commande légale dans VIM 7.3 tel qu'installé sur Ubuntu Server 12.10.
dotancohen
4
Cela termbgne semble pas être un paramètre légal dans VIM 7.3 tel qu'installé sur Ubuntu Server 12.10.
dotancohen
En effet, le terminal normal termne peut pas avoir de couleur d'arrière-plan, alors que le terminal couleur le ctermpeut.
Dima Tisnek
supprimé termbg mais vous pouvez ajouter ctermfg, guifg, etc. pour contrôler également le premier plan.
fatal_error
16

Pour les autres (à partir de maintenant moins malchanceux) qui se retrouvent ici via un moteur de recherche et ne peuvent pas mettre en évidence des caractères non ASCII, essayez ceci (mettez ceci dans votre .vimrc):

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

Ceci a l'avantage supplémentaire de ne pas entrer en conflit avec les définitions de syntaxe régulières (basées sur le type de fichier [extension de fichier]).

PAStheLoD
la source
Je reçois E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser
3
Bien que l'objectif soit déclaré de ne pas entrer en conflit avec les définitions de syntaxe déjà définies, si vous le souhaitez , vous pouvez l'ajouter containedin=ALLà la fin de la dernière ligne, ce qui en fait au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Je trouve que la distraction en vaut la peine (lorsque l'unicode est autorisé), la réponse originale ici n'attrape pas des choses telles que le code non-ascii à l'intérieur d'une ifdéclaration ...
svenevs
1
Il est toujours plus sûr d'enfermer votre autocmd BufRead ....dans un autogroupe dans vim, sauf si vous avez une très bonne raison de ne pas ...
Cbhihe
6

Cette regex fonctionne également. C'était le premier hit google pour "vim remove non-ascii characters" de briceolion.com et :set hlsearchmettra en évidence:

/[^[:alnum:][:punct:][:space:]]/
Grant Bowman
la source
1
La question est de mettre en évidence les caractères non-ascii, pas de les supprimer .
chutsu
1
Merci d'avoir signalé cela, j'ai modifié ma réponse. Ce n'était pas vraiment exagéré de voir que cette expression régulière répond également à la question d'une manière différente des autres réponses. Ma réponse initiale était de savoir :%s/[^[:alnum:][:punct:][:space:]]//gcqui met en évidence en premier, puis remplace.
Grant Bowman
4

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
Reman
la source
Votre fonction ne fonctionne pas ici, elle ne met pas en évidence et elle perturbe également l'encodage. Pourquoi changez-vous le codage local?
Werner
Essayez de changer encen fenc. J'ai changé l'encodage car mon encodage par défaut est (était en 2013) latin1. La fonction ne met pas en évidence les caractères non imprimables si le jeu de caractères est latin1. Pour voir la mise en évidence, vous devez avoir la clé ERRORdans votre fichier de syntaxe de couleur. C'est à moi:hi Error guifg=Black guibg=Orange
Reman le
2

Sur la base des autres réponses sur ce sujet et de la réponse que j'ai ici, j'ai ajouté ceci à mon .vimrc, afin que je puisse contrôler la mise en évidence 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 éditez un fichier zsh, vous devrez ajouter zshCommentà la ligne

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

sinon, il n'affichera pas le caractère non-ascii (vous pouvez également définir containsin = ALL si vous voulez être sûr d'afficher les 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 :sysur vim, puis recherchez les éléments de syntaxe pour le 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>
Werner
la source
1

Aucune des réponses ci-dessus n'a fonctionné pour moi.

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

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

user2250246
la source
1
Cela supprime les caractères, là où l'op a demandé la mise en évidence .
Bernhard Wagner
tu ne veux pas dire [^ 0-9a-zA-Z, \ -_ \.], c'est-à-dire \ -?
ben26941
0

Quelqu'un a déjà répondu à la question. Cependant, pour d'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 autre 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 des pièces de mélange d'autres solutions. Vous pouvez supprimer contained, mais, de la documentation, il peut y avoir un problème potentiel de récurrence (si je comprends bien). Pour afficher d'autres modèles définis, la syn-containssection le contiendrait.

:help syn-containedin
:help syn-contains 

Problème répliqué depuis: définir l'élément sur une priorité de surbrillance plus élevée sur vim

nate
la source