¿Cómo hacer que Vim resalte personajes no ascii?


153

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

Respuestas:


291

Al usar el rango en una []clase de caracteres en su búsqueda, debería poder excluir el rango de caracteres hexadecimales ASCII, por lo tanto, resaltar (suponiendo que haya hlsearchhabilitado) todos los demás caracteres que se encuentran fuera del rango ASCII:

/[^\x00-\x7F]

Esto hará una coincidencia negativa (vía [^]) para los caracteres entre ASCII 0x00y ASCII 0x7F(0-127), y parece funcionar en mi prueba simple. Para ASCII extendido, por supuesto, extienda el rango hasta en \xFFlugar de \x7Fusar /[^\x00-\xFF].

También puede expresarlo 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 [].


14
En decimal:/[^\d0-\d127]
Bohr

@Bohr Esa es una buena adición. Lo editaré arriba.
Michael Berkowski

¡Excelente! ¡salvó el día! Uno de los caracteres de sangría se pegó en mi código de Python y el error Unicode comenzó a matarme. ¡fue difícil de detectar entre el mismo personaje utilizado por vim plugin!
kollery

36

Sí, hay una función nativa para resaltar las cadenas coincidentes. Dentro de Vim, haz:

:help highlight
:help syn-match

syn-matchdefine una cadena que coincide con caer en un grupo. highlightdefine el color utilizado por el grupo. Solo piense en el resaltado de sintaxis para sus archivos vimrc.

Entonces puede usar los siguientes comandos en su archivo .vimrc:

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

no es necesario poner los :comandos delante de tu vimrc.
FDinoff

termbgno parece ser un comando legal en VIM 7.3 como está instalado en Ubuntu Server 12.10.
dotancohen

44
Entonces termbgno parece ser un parámetro legal en VIM 7.3 como está instalado en Ubuntu Server 12.10.
dotancohen

De hecho, el terminal regular termno puede tener color de fondo, mientras que el terminal de color ctermsí.
Dima Tisnek

eliminó termbg pero podría agregar ctermfg, guifg, etc. para controlar también el primer plano.
fatal_error

16

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 el resaltado de caracteres no 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 definiciones de sintaxis regulares (basadas en tipo de archivo [extensión de archivo]).


Me sale 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
Aunque se establece que el objetivo de no entrar en conflicto con las definiciones de sintaxis ya definidas, si lo desea , puede agregarlo containedin=ALLal final de la última línea, haciéndolo au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Encuentro la distracción pena (Unicode cuando se permite), la respuesta original aquí no no coger cosas como el código no ASCII en el interior de una ifdeclaración ...
svenevs

1
Siempre es más seguro autocmd BufRead ....incluirlo en un grupo automático en vim, a menos que tenga una muy buena razón para no ...
Cbhihe

6

Esta expresión regular también funciona. Fue el primer hit de Google para "vim remove caracteres no ascii" de briceolion.com y con :set hlsearchdestacará:

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

1
La pregunta es resaltar los caracteres que no son ascii, no eliminarlos .
chutsu

1
Gracias por señalar eso, he editado mi respuesta. No fue muy difícil ver que esta expresión regular también responde a la pregunta de una manera que es diferente de otras respuestas. Mi respuesta original fue :%s/[^[:alnum:][:punct:][:space:]]//gccuál resalta primero, luego reemplaza.
Grant Bowman

4

Si está interesado también 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

Su función no funciona aquí, no resalta y también ensucia la codificación. ¿Por qué estás cambiando la codificación local?
Werner

Intenta cambiar enca fenc. Cambié la codificación porque mi codificación predeterminada es (era en 2013) latin1. La función no resalta los caracteres no imprimibles si el conjunto de caracteres es latin1. Para ver el resaltado, debe tener la clave ERRORen su archivo de sintaxis de color. Esto es mío:hi Error guifg=Black guibg=Orange
Reman

2

En base a las otras respuestas sobre este tema y la respuesta que obtuve aquí , la agregué a mi .vimrc, para poder controlar el resaltado no ASCII escribiendo <C-w>1. También muestra comentarios internos, aunque necesitará agregar el grupo de comentarios para cada sintaxis de archivo que usará. Es decir, si va a editar un archivo zsh, deberá agregarlo zshCommenta la línea

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

de lo contrario, no mostrará el carácter no ascii (también puede establecer contenido en = TODOS si desea asegurarse de mostrar caracteres no ascii en todos los grupos). Para verificar cómo se llama al comentario en un tipo de archivo diferente, abra un archivo del tipo deseado e ingrese :syen vim, luego busque el comentario en los elementos de sintaxis.

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

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

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

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


1
Esto elimina los caracteres, donde el operador solicitó resaltar .
Bernhard Wagner

¿No te refieres a [^ 0-9a-zA-Z, \ -_ \.], es decir, \ -?
ben26941

0

Alguien ya ha respondido la pregunta. Sin embargo, para otros que todavía tienen problemas, aquí hay otra solución para resaltar caracteres no ascii en los comentarios (o cualquier grupo de sintaxis en la materia). No es el 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 tiene partes de mezcla de otras soluciones. Puede eliminar contained, pero, de la documentación, puede haber un problema potencial de recurrirse (según tengo entendido). Para ver otros patrones definidos, la syn-containssección lo contendría.

:help syn-containedin
:help syn-contains 

Problema replicado de: Establezca el elemento con mayor prioridad de resaltado en vim

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.