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
ignorecase
I smartcase
opcje są bardzo przydatne, ale nie wydają się mieć nic wspólnego ze znakami diakrytycznymi / akcentami.
:h [[=
i:h patterns-composing
.Odpowiedzi:
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čka
izkocicka
tym samym wzorem, możesz użyć tego:gdzie
[[=c=]]
jest klasą równoważnościc
znaku.Aby automatycznie wstawić tę klasę postaci za każdym razem, gdy trafisz
c
podczas wyszukiwania, możesz użyć tego mapowania:które można podzielić w następujący sposób:
<expr>
wpisz ocenę wyrażeniagetcmdtype() =~ '[?/]'
sprawdź, czy piszesz wyszukiwanie do tyłu lub do przodu'[[=c=]]'
zwraca klasę równoważnościc
znaku, jeśli poprzedni test się powiódł'c'
wc
przeciwnym razie zwróć znakPoprzednie mapowanie ma 2 wady:
c
postaćMożna to poprawić, mapując w
<CR>
następujący sposób: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 dlac
, 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-\>e
zastąpić całą linię poleceń oceną wyrażenia.źródło
/kočička
Meczekocicka
, 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.'[А-яЁё]'
).