Игнорирование диакритических знаков / акцентов при поиске

12

Есть ли способ указать Vim, что я хочу игнорировать диакритические знаки / акценты при поиске? Например, я хотел бы иметь возможность искать

kočička

введя

/kocicka

ignorecaseИ smartcaseварианты очень полезны, но они , кажется, не имеют ничего общего с диакритическими / акцентами.

s3rvac
источник
3
Связанные: :h [[=и :h patterns-composing.
Муру

Ответы:

16

Как упомянуто в комментарии @muru , вы можете использовать класс эквивалентности (описанный в :help /[[), который, по-видимому, является выражением класса символов, оцениваемым как набор похожих символов (т. Е. Одинаковыми после удаления любого ударения / диакритики).

Например, чтобы искать kočičkaи использовать kocickaтот же шаблон, вы можете использовать это:

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

где [[=c=]]класс эквивалентности для cперсонажа.


Чтобы автоматически вставить этот класс символов всякий раз, когда вы нажимаете cво время поиска, вы можете использовать это отображение:

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

который может быть разбит так:

  • <expr> введите оценку выражения
  • getcmdtype() =~ '[?/]' проверить, пишете ли вы поиск вперед или назад
  • '[[=c=]]'вернуть класс эквивалентности для cсимвола, если предыдущий тест прошел успешно
  • 'c'вернуть cсимвол в противном случае

Предыдущее отображение имеет 2 недостатка:

  1. это охватывает только cхарактер
  2. это может сделать шаблон трудным для чтения

Это можно улучшить, переназначив <CR>так:

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

Когда вы нажимаете <CR>после написания шаблона для поиска, сопоставление автоматически заменяет все алфавитные символы их эквивалентами класса эквивалентности.


Отображение for <CR>аналогично предыдущему отображению для c, за исключением того, что оно использует не аргумент, <expr>а системное отображение <C-\>e.
<expr>позволяет вставить оценку выражения, а <C-\>eтакже заменить всю командную строку оценкой выражения.

user9433424
источник
1
Кроме того, если вы хотите пойти в обратном направлении, например, /kočičkaсовпадения kocicka, то вы можете использовать '[[:lower:][:upper:]]'вместо '\a'. Альтернативы '[:alpha:]'и '\I', похоже, не работают с многобайтовыми символами; однако, '[^[:punct:]]'кажется, работает (хотя я менее уверен), и я бы предположил, что вы также создадите свой собственный класс эквивалентности (например, '[А-яЁё]').
Кевинлаулер
Я хотел бы, чтобы была установка для этого. При использовании [[= c =]] работает, но опечатка означает, что вам нужно нажать Backspace 7 раз. Так же страдает читаемость.
Далиус