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.

s3rvac
la source
3
Connexes: :h [[=et :h patterns-composing.
muru

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.

user9433424
la source
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