Ignorowanie znaków diakrytycznych / akcentów podczas wyszukiwania


12

Czy istnieje sposób, aby poinstruować Vima, że ​​chcę ignorować znaki diakrytyczne / akcenty podczas wyszukiwania? Na przykład chciałbym móc wyszukać

kočička

Przez wprowadzenie

/kocicka

ignorecaseI smartcaseopcje są bardzo przydatne, ale nie wydają się mieć nic wspólnego ze znakami diakrytycznymi / akcentami.


3

Odpowiedzi:


16

Jak wspomniano w komentarzu @muru , możesz użyć klasy równoważności (opisanej w :help /[[), która wydaje się być wyrażeniem klasy znaków ocenionym jako zestaw podobnych znaków (tj. Są takie same po usunięciu jakiegokolwiek akcentu / znaku diakrytycznego).

Na przykład, aby szukać kočičkaiz kocickatym samym wzorem, możesz użyć tego:

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

gdzie [[=c=]]jest klasą równoważności cznaku.


Aby automatycznie wstawić tę klasę postaci za każdym razem, gdy trafisz cpodczas wyszukiwania, możesz użyć tego mapowania:

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

które można podzielić w następujący sposób:

  • <expr> wpisz ocenę wyrażenia
  • getcmdtype() =~ '[?/]' sprawdź, czy piszesz wyszukiwanie do tyłu lub do przodu
  • '[[=c=]]'zwraca klasę równoważności cznaku, jeśli poprzedni test się powiódł
  • 'c'w cprzeciwnym razie zwróć znak

Poprzednie mapowanie ma 2 wady:

  1. obejmuje tylko cpostać
  2. może utrudniać odczytanie wzoru

Można to poprawić, mapując w <CR>następujący sposób:

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

Kiedy naciskasz <CR>po napisaniu wzorca wyszukiwania, mapowanie automatycznie zastąpi wszystkie znaki alfabetyczne ich odpowiednikiem klasy równoważności.


Mapowanie dla <CR>jest podobne do poprzedniego dla c, z tym wyjątkiem, że nie używa argumentu, <expr>ale mapowanie systemowe <C-\>e.
<expr>pozwala wstawić ocenę wyrażenia, a jednocześnie <C-\>ezastąpić całą linię poleceń oceną wyrażenia.


1
Ponadto, jeśli chcesz iść w odwrotnym kierunku, np. /kočičkaMecze kocicka, możesz użyć '[[:lower:][:upper:]]'zamiast '\a'. Alternatywy '[:alpha:]'i '\I'wydaje się, że nie działają ze znakami wielobajtowymi; '[^[:punct:]]'Wydaje się jednak, że działa (choć nie jestem tego pewien) i zgaduję, że zbuduję również własną klasę równoważności (np. '[А-яЁё]').
kevinlawler

Chciałbym, żeby było na to miejsce. Podczas korzystania z [[= c =]] działa, ale pomyłka oznacza, że ​​musisz kliknąć backspace 7 razy. Cierpi również czytelność.
daliusd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.