Ignorieren von diakritischen Zeichen / Akzenten bei der Suche


12

Gibt es eine Möglichkeit, Vim anzuweisen, dass ich bei der Suche diakritische Zeichen / Akzente ignorieren möchte? Zum Beispiel möchte ich suchen können

kočička

beim Eintreten

/kocicka

Die Optionen ignorecaseund smartcasesind sehr nützlich, scheinen aber nichts mit Diakritika / Akzenten zu tun zu haben.


3
Verwandte: :h [[=und :h patterns-composing.
muru

Antworten:


16

Wie @muru im Kommentar erwähnt hat , könnten Sie eine (in :help /[[) beschriebene Äquivalenzklasse verwenden , die ein Zeichenklassenausdruck zu sein scheint, der als eine Menge ähnlicher Zeichen ausgewertet wird (dh dieselben sind, wenn Sie Akzente / diakritische Zeichen entfernen).

Um beispielsweise nach kočičkaund kocickamit demselben Muster zu suchen , können Sie Folgendes verwenden:

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

wo [[=c=]]ist die Äquivalenzklasse für den cCharakter.


Um diese Zeichenklasse automatisch einzufügen, wenn Sie cwährend einer Suche auf drücken, können Sie die folgende Zuordnung verwenden:

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

was sich so aufschlüsseln lässt:

  • <expr> Geben Sie die Auswertung eines Ausdrucks ein
  • getcmdtype() =~ '[?/]' Testen Sie, ob Sie eine Rückwärts- oder eine Vorwärtssuche durchführen
  • '[[=c=]]'Gibt die Äquivalenzklasse für den cCharakter zurück, wenn der vorherige Test erfolgreich war
  • 'c'Liefert das cZeichen ansonsten zurück

Die vorherige Zuordnung weist zwei Nachteile auf:

  1. es deckt nur den cCharakter ab
  2. Dies kann das Lesen des Musters erschweren

Es könnte durch Remapping <CR>wie folgt verbessert werden :

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

Wenn Sie <CR>nach dem Schreiben eines Musters für eine Suche auf drücken, ersetzt die Zuordnung automatisch alle alphabetischen Zeichen durch das Gegenstück zur Äquivalenzklasse.


Das Mapping für <CR>ähnelt dem vorherigen Mapping für c, verwendet jedoch nicht das Argument, <expr>sondern das System-Mapping <C-\>e.
<expr>Ermöglicht das Einfügen der Auswertung eines Ausdrucks, während <C-\>eSie die gesamte Befehlszeile durch die Auswertung eines Ausdrucks ersetzen können.


1
Wenn Sie in umgekehrter Richtung vorgehen möchten, z. B. /kočičkaStreichhölzer kocicka, können Sie '[[:lower:][:upper:]]'statt verwenden '\a'. Die Alternativen '[:alpha:]'und '\I'scheinen nicht mit Multi-Byte-Zeichen zu funktionieren. jedoch '[^[:punct:]]'scheint zu funktionieren (obwohl ich weniger sicher bin), und ich würde vermuten , Ihre eigene Äquivalenzklasse Aufbau (zB '[А-яЁё]') als auch.
Kevinlawler

Ich wünschte, es gäbe eine Einstellung dafür. Während der Verwendung von [[= c =]] funktioniert, bedeutet ein Tippfehler, dass Sie sieben Mal auf die Rücktaste klicken müssen. Auch die Lesbarkeit leidet.
Daliusd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.