2013-06-07 5 views

Répondre

207

Utilisation de gamme dans un tous les autres caractères se trouvant dehors classe de caractères [] dans votre recherche, vous devriez être en mesure de ne comprennent pas la plage de caractères ASCII hexadécimal, soulignant donc (en supposant que vous avez hlsearch activé) la plage ASCII:

/[^\x00-\x7F] 

Cela va faire un match négatif (via [^]) pour les caractères ASCII entre 0x00 et ASCII 0x7F (0-127), et semble travailler dans mon simp le test. Pour l'ASCII étendu, bien sûr, étendre la plage jusqu'à \xFF au lieu de \x7F en utilisant /[^\x00-\xFF].

Vous pouvez également exprimer en décimal par \d:

/[^\d0-\d127] 

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

+10

en décimal: '/ [^ \ d0- \ D127]' – Bohr

+0

@Bohr C'est une belle addition. Je vais l'éditer ci-dessus. –

+0

génial! sauvé le jour! 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 personnage utilisé par vim plugin! – kollery

30

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

:help highlight 
:help syn-match 

syn-match définit une chaîne qui correspond à l'automne dans un groupe. highlight définit la couleur utilisée par le groupe. Pensez à la coloration syntaxique pour vos fichiers vimrc.

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

syntax match nonascii "[^\x00-\x7F]" 
highlight nonascii guibg=Red ctermbg=2 
+0

vous n'avez pas besoin de mettre ':' devant les commandes de votre vimrc. – FDinoff

+0

ah, oui! Tu as raison! Je vous remercie! –

+0

'termbg' ne semble pas être une commande légale dans VIM 7.3 comme installé sur Ubuntu Server 12.10. – dotancohen

4

Si vous êtes intéressé aussi dans lesnon imprimables caractères utiliser 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 
+0

Votre fonction ne fonctionne pas ici, il ne met pas en évidence et il gâchera également l'encodage. Pourquoi changez-vous l'encodage local? – Werner

+0

Essayez de changer 'enc' en' fenc'. J'ai changé l'encodage car mon encodage par défaut est (était en 2013) latin1. La fonction ne met pas en surbrillance les caractères non imprimables si le jeu de caractères est latin1. Trop voir la mise en évidence, vous devez avoir la clé 'ERROR' dans votre fichier de syntaxe de couleur. Ceci est à moi: 'Salut Erreur guifg = Noir guibg = Orange' – Reman

14

Pour d'autres (désormais moins malchanceux) les gens finissant ici via un moteur de recherche et ne peuvent pas être accomplis h mise en évidence des caractères non-ASCII, essayez ceci (mettre ceci dans votre .vimrc):

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

Cela a l'avantage de ne pas entrer en collision avec régulière (filetype [extension de fichier] base) définitions de syntaxe.

+0

A fonctionné parfaitement. – cokedude

+0

Je reçois 'E319: Désolé, la commande n'est pas disponible dans cette version: au BufReadPost * syntaxe match nonascii" [^ \ u0000- \ u007F] " Appuyez sur ENTRÉE ou tapez commande pour continuer Linux Linux 17.3 – Nasser

+2

Bien que le but est déclaré de ** pas ** en conflit avec les définitions de syntaxe déjà définies, si vous le désirez ** vous pouvez ajouter 'containedin = ALL' à la fin de la dernière ligne, ce qui rend' la syntaxe de BufReadPost * correspondre nonascii "[^\ u0000- \ u007F] "containedin = ALL'.Je trouve que la distraction en vaut la peine (quand unicode est autorisé), la réponse originale ici ** n'attrape pas des choses comme un code non-ascii à l'intérieur d'une déclaration 'if' ... – sjm324

1

D'après les autres réponses à ce sujet et la réponse que j'ai reçue here J'ai ajouté ceci à mon .vimrc, afin que je puisse contrôler la 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 modifiez un fichier zsh, vous devrez ajouter zshComment à la ligne

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

sinon il ne sera pas montrer le caractère non-ascii.Pour vérifier comment le commentaire est appelé sur un type de fichier différent, ouvrez un fichier du type désiré et entrez :sy sur vim, puis recherchez les éléments de syntaxe pour le commentaire.

function HighlightNonAsciiOff() 
    echom "Setting non-ascii highlight off" 
    highlight nonascii none 
    let g:is_non_ascii_on=0 
endfunction 

function HighlightNonAsciiOn() 
    au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment 
    echom "Setting non-ascii highlight on" 
    highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline 
    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>               
3

Cette regex fonctionne également. Il a été le premier coup de google pour « vim supprimer les caractères non-ascii » de briceolion.com et :set hlsearch mettra en évidence:

:/[^[:alnum:][:punct:][:space:]]/g 
+0

La question demande de ** souligner ** caractères non-ascii, ** ne les supprimant pas **. – chutsu

+0

Merci d'avoir signalé cela, j'ai édité ma réponse. Il n'était pas très difficile de voir que cette expression répond également à la question d'une manière différente des autres réponses. Ma réponse originale était ':% s/[^ [: alnum:] [: punct:] [: espace:]] // gc' qui met en évidence en premier, puis remplace. –

1

D'une certaine façon aucune des réponses ci-dessus a fonctionné pour moi.

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

Il conserve la plupart des personnages que je suis intéressé.

0

Quelqu'un a déjà répondu à la question. Cependant, pour les autres qui ont encore des problèmes, voici une autre solution pour mettre en évidence les caractères non-ascii dans les commentaires (ou n'importe quel 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 parties de mélange d'autres solutions. Vous pouvez supprimer contained, mais, à partir de la documentation, il peut y avoir un problème potentiel de récursivité lui-même (si je comprends bien). Pour afficher d'autres modèles définis, la section syn-contains le contient.

:help syn-containedin 
:help syn-contains 

répliquée question de: Set item to higher highlight priority on vim

Questions connexes