Найти тему
Блокнот математика

Рубрика "Секреты Вим". Нечеткий поиск

Привет, читатели. Заметки стали редко выходить, всё про Вим я уже рассказал. Ну, почти всё: есть ещё довольно обширная область графического Вим, которую мы совершенно не затрагивали пока, и некоторые глубокие вопросы настройки и программирования.

Но иногда всплывают новые возможности, о которых я узнаю случайно, ибо за новыми версиями не особенно слежу.

Вот например нечёткий поиск.

https://a.d-cd.net/8887682s-960.jpg
https://a.d-cd.net/8887682s-960.jpg

Вим умеет искать текст в нечётком стиле, то есть считая за совпадение то, что строгим совпадением не является. Например, найдет строку "сос" в слове "соосный".

Это текстовый поиск, а не регулярное выражение!

Условие совпадения - все символы искомой строки должны (в любом регистре) присутствовать, причём в том же порядке. Между ними могут быть какие угодно символы.

Если в искомой строке больше одного слова, то каждое ищется отдельно, поэтому порядок слов может быть любой. То есть строка "я тебя люблю" будет найдена в тексте, содержащем "Я тебя Люблю!". Или - "не люблю".

Обратите внимание, что опечатки не "исправляются": пропущенная бува, неправильная буува или переставленные бувкы не будут найдены. Зато лишняя буквва не помешает .

Каждому совпадению присваивается ранг с учётом следующих величин:

  1. Число совпавших подряд символов;
  2. Число символов между двумя совпавшими символами;
  3. Совпадения в начале слов;
  4. Совпадения символов верхнего регистра в середине слов (CamelCase, часто применяется в программировании, и понятно, что эти символы аналогичны началу слов);
  5. Совпадения после разделителей или дефиса;
  6. Число несовпавших символов.

Первым возвращается совпадение с наивысшим рангом.

Пример из документации:

Поиск строки "get pat" найдёт строки "GetPattern", "PatternGet", "getPattern", "patGetter", "getSomePattern", "MatchpatternGet" и т.д.

Флаг "f" включает такой поиск для функции :vimgrep. И это чрезвычайно полезно, когда вы ищете что-то сложное во многих файлах!

Функции matchfuzzy() and matchfuzzypos() осуществляют нечёткий поиск строки в списке строк.

Функция matchfuzzy() принимает список и строку, третий необязательный параметр - словарь. Если список - список строк, то каждая сравнивается с шаблоном (второй аргумент) и возвращается список совпавших. Список может быть списком словарей, можно довольно изощрённо искать в словарях.

Про поиск в словарях сейчас не будем. Если первый аргумент - список строк, то третий - словарь - может содержать ключ matchseq, и тогда все слова должны идти в том же порядке, что в шаблоне.

Функция matchfuzzypos() даёт больше: помимо списка совпадений, ещё список позиций, где совпадения нашлись, и ранги совпадений.