Ігнорування діакритики / акцентів під час пошуку


12

Чи є спосіб доручити Vim, що я хочу ігнорувати діакритику / акценти під час пошуку? Наприклад, я хотів би мати можливість шукати

kočička

ввівши

/kocicka

Параметри ignorecaseта smartcaseваріанти дуже корисні, але, схоже, не мають нічого спільного з діакритикою / акцентами.


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>після написання шаблону для пошуку, відображення автоматично замінить усі алфавітні символи їх аналогом класу еквівалентності.


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


1
Далі, якщо ви хочете йти у зворотному напрямку, наприклад, /kočičkaсірники kocicka, тоді ви можете використовувати '[[:lower:][:upper:]]'замість '\a'. Альтернативи '[:alpha:]'і '\I', здається, не працюють з багатобайтовими символами; однак, '[^[:punct:]]'здається, працює (хоча я менш впевнений), і я б припустив, що створити власний клас еквівалентності (наприклад, '[А-яЁё]').
kevinlawler

Я б хотів, щоб там було налаштування. Під час використання [[= c =]] працює, але введення помилки означає, що вам потрібно натиснути зворотну простір 7 разів. Так само страждає читабельність.
daliusd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.