¿Cómo conseguir que Vim destaque personajes no ascii?

Intento que Vim resalte los caracteres que no son ASCII. ¿Hay una configuración disponible, un patrón de búsqueda de expresiones regulares o un complemento para hacerlo?

Al usar el rango en una clase de caracteres [] en su búsqueda, debe poder excluir el rango de caracteres hexadecimales ASCII, por lo tanto, resaltar (suponiendo que tenga hlsearch habilitado) todos los demás caracteres que se encuentren fuera del rango ASCII:

 /[^\x00-\x7F] 

Esto hará una coincidencia negativa (a través de [^] ) para caracteres entre ASCII 0x00 y ASCII 0x7F (0-127), y parece funcionar en mi prueba simple. Para ASCII extendido, por supuesto, amplíe el rango a \xFF lugar de \x7F usando /[^\x00-\xFF] .

También puede expresslo en decimal a través de \d :

 /[^\d0-\d127] 

Si necesita algo más específico, como la exclusión de caracteres no imprimibles, deberá agregar esos rangos a la clase de caracteres [] .

Sí, hay una función nativa para resaltar para cualquier cadena coincidente. Dentro de Vim, haz:

 :help highlight :help syn-match 

syn-match define una cadena que coincide con caer en un grupo. highlight define el color utilizado por el grupo. Solo piense en resaltar la syntax para sus archivos vimrc.

Entonces puedes usar los comandos a continuación en tu archivo .vimrc:

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

Para otras personas (de ahora en adelante, menos desafortunadas) que terminan aquí a través de un motor de búsqueda y no pueden lograr resaltar caracteres que no sean ASCII, intente esto (ponga esto en su .vimrc):

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

Esto tiene el beneficio adicional de no colisionar con las definiciones de syntax regulares (tipo de archivo [extensión de archivo]).

Si también está interesado en los caracteres no imprimibles , use este: /[^\x00-\xff]/

Lo uso en una función:

  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 

Esta expresión regular también funciona. Fue el primer hit de google para “vim eliminar personajes no ascii” de briceolion.com y con :set hlsearch resaltará:

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

En base a las otras respuestas sobre este tema y la respuesta que obtuve aquí , agregué esto a mi .vimrc , para poder controlar el resaltado no ascii escribiendo 1 . También muestra comentarios internos, aunque deberá agregar el grupo de comentarios para cada syntax de archivo que usará. Es decir, si va a editar un archivo zsh, tendrá que agregar zshComment a la línea

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

de lo contrario, no mostrará el carácter no ascii. Para verificar cómo se llama el comentario en un tipo de archivo diferente, abra un archivo del tipo deseado e ingrese :sy en vim, luego busque los elementos de syntax para el comentario.

 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 1 :call ToggleHighlightNonascii() 

De alguna manera, ninguna de las respuestas anteriores funcionó para mí.

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

Mantiene la mayoría de los personajes que me interesan.

Alguien ya ha respondido la pregunta. Sin embargo, para otros que aún tienen problemas, aquí hay otra solución para resaltar los caracteres que no son ascii en los comentarios (o cualquier grupo de syntax en el asunto). No es lo mejor, pero es una solución temporal.

Uno puede intentar:

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

Esto ha mezclado partes de otras soluciones. Puede eliminar contained , pero, a partir de la documentación, puede haber un problema potencial de recurrencia (según entiendo). Para ver otros patrones definidos, la sección syn-contains lo contendría.

 :help syn-containedin :help syn-contains 

Problema replicado de: establecer el elemento a mayor prioridad de resaltado en vim