Ignorer les signes diacritiques / accents lors de la recherche


12

Existe-t-il un moyen d'indiquer à Vim que je veux ignorer les signes diacritiques / les accents lors de la recherche? Par exemple, je voudrais pouvoir rechercher

kočička

en entrant

/kocicka

Les options ignorecaseet smartcasesont très utiles, mais elles ne semblent avoir rien à voir avec les signes diacritiques / les accents.


Réponses:


16

Comme @muru l'a mentionné dans le commentaire , vous pouvez utiliser une classe d'équivalence (décrite dans :help /[[) qui semble être une expression de classe de caractères évaluée comme un ensemble de caractères similaires (c'est-à-dire qui sont les mêmes une fois que vous supprimez tout accent / diacritique).

Par exemple, pour rechercher kočičkaet kocickaavec le même modèle, vous pouvez utiliser ceci:

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

[[=c=]]est la classe d'équivalence du cpersonnage.


Pour insérer automatiquement cette classe de caractères à chaque fois que vous frappez clors d'une recherche, vous pouvez utiliser ce mappage:

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

qui peut être décomposé comme ceci:

  • <expr> taper l'évaluation d'une expression
  • getcmdtype() =~ '[?/]' tester si vous écrivez une recherche en arrière ou en avant
  • '[[=c=]]'renvoie la classe d'équivalence du ccaractère si le test précédent a réussi
  • 'c'retourner le ccaractère sinon

La cartographie précédente présente 2 inconvénients:

  1. il ne couvre que le cpersonnage
  2. cela peut rendre le motif difficile à lire

Il pourrait être amélioré en remappant <CR>comme ceci:

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

Lorsque vous appuyez <CR>après avoir écrit un modèle pour une recherche, le mappage remplacera automatiquement tous les caractères alphabétiques par leur homologue de classe d'équivalence.


Le mappage pour <CR>est similaire au mappage précédent pour c, sauf qu'il n'utilise pas l'argument <expr>mais le mappage système <C-\>e.
<expr>vous permet d'insérer l'évaluation d'une expression, tout en <C-\>evous permettant de remplacer la ligne de commande entière par l'évaluation d'une expression.


1
De plus, si vous souhaitez aller dans le sens inverse, par exemple, les /kočičkacorrespondances kocicka, vous pouvez utiliser à la '[[:lower:][:upper:]]'place de '\a'. Les alternatives '[:alpha:]'et '\I'ne semblent pas fonctionner avec des caractères multi-octets; cependant, '[^[:punct:]]'semble fonctionner (bien que je sois moins sûr), et je suppose que vous construisez également votre propre classe d'équivalence (par exemple, '[А-яЁё]').
kevinlawler

Je souhaite qu'il y ait un cadre pour cela. Lorsque vous utilisez [[= c =]], mais le type d'erreur signifie que vous devez cliquer 7 fois en arrière. La lisibilité en souffre également.
daliusd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.