Ignorando los signos diacríticos / acentos al buscar


12

¿Hay alguna forma de indicarle a Vim que quiero ignorar los signos diacríticos / acentos al buscar? Por ejemplo, me gustaría poder buscar

kočička

por entrar

/kocicka

Las opciones ignorecasey smartcaseson muy útiles, pero no parecen tener nada que ver con diacríticos / acentos.


3
Relacionado: :h [[=y :h patterns-composing.
muru

Respuestas:


16

Como @muru mencionó en el comentario , podría usar una clase de equivalencia (descrita en :help /[[) que parece ser una expresión de clase de caracteres evaluada como un conjunto de caracteres similares (es decir, son los mismos una vez que elimina cualquier acento / signo diacrítico).

Por ejemplo, para buscar kočičkay kocickacon el mismo patrón, puede usar esto:

ko[[=c=]]i[[=c=]]ka

donde [[=c=]]es la clase de equivalencia para el cpersonaje.


Para insertar automáticamente esta clase de caracteres cada vez que presiona cmientras realiza una búsqueda, puede usar esta asignación:

cnoremap <expr> c getcmdtype() =~ '[?/]' ? '[[=c=]]' : 'c'

que puede desglosarse así:

  • <expr> escriba la evaluación de una expresión
  • getcmdtype() =~ '[?/]' prueba si estás escribiendo una búsqueda hacia atrás o hacia adelante
  • '[[=c=]]'devolver la clase de equivalencia para el cpersonaje si la prueba anterior tuvo éxito
  • 'c'devolver el cpersonaje de lo contrario

El mapeo anterior tiene 2 inconvenientes:

  1. solo cubre el cpersonaje
  2. puede hacer que el patrón sea difícil de leer

Podría mejorarse reasignando <CR>así:

cnoremap <CR> <C-\>e getcmdtype() =~ '[?/]' ? substitute(getcmdline(), '\a', '[[=\0=]]', 'g'): getcmdline()<CR><CR>

Cuando presiona <CR>después de escribir un patrón para una búsqueda, la asignación reemplazará automáticamente todos los caracteres alfabéticos por su contraparte de clase de equivalencia.


La asignación para <CR>es similar a la asignación anterior para c, excepto que no usa el argumento <expr>sino la asignación del sistema <C-\>e.
<expr>le permite insertar la evaluación de una expresión, mientras <C-\>eque le permite reemplazar toda la línea de comando con la evaluación de una expresión.


1
Además, si desea ir en la dirección inversa, por ejemplo, /kočičkacoincidencias kocicka, puede usar en '[[:lower:][:upper:]]'lugar de '\a'. Las alternativas '[:alpha:]'y '\I'no parecen funcionar con caracteres de varios bytes; sin embargo, '[^[:punct:]]'parece funcionar (aunque estoy menos seguro), y supongo que también construirá su propia clase de equivalencia (por ejemplo, '[А-яЁё]').
kevinlawler

Desearía que hubiera un escenario para eso. Si bien el uso de [[= c =]] funciona, el tipo incorrecto significa que debe hacer clic en retroceder 7 veces. También la legibilidad sufre.
daliusd
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.