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.

s3rvac
fuente
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.

usuario9433424
fuente
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