Найти тему
25,4K подписчиков

Рубрика "Секреты Вим". Тонкости проверки орфографии

Привет, коллеги. О проверке орфографии в Вим уже был материал, чисто пользовательский. А сегодня рассмотрим более тонкие моменты. Попутно повторим основы для тех, кому лень перейти по ссылке.

Итак, проверка орфографии (spell check) включается через опции spell и spelllang. Первая опция логическая, флаг, просто включающая режим проверки орфографии на лету. Вторая задает словарь или несколько словарей через запятую. Например, ru, en, it, he для русского, английского, итальянского и иврита.

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

Подозрительные слова отмечаются цветом, причем разными цветами: слова нет в словаре (вероятна опечатка), слово не озаглавлено (частая опечатка), слово редкое (порой, братие, сие вельми понеже) или слово относится к местному диалекту (нам это редко надо, хотя и в русском бывают диалектные словечки, а вот в некоторых языках диалектов много и это серьёзно). Цветовые схемы раскраски можно менять.

Красным выделены слова, которых нет в словаре, а синим - неверно озаглавленные.
Красным выделены слова, которых нет в словаре, а синим - неверно озаглавленные.

Команды ]s и [s перемещаются к ближайшему подозрительному слову вперед или назад. Если s заменить на S, то пропускаются редкие и диалектные слова, внимание на возможных опечатках.

Можно собирать свой словарь. Он хранится в файле, указанном в опции spellfile. Имя должно кончаться на .en.add (вместо en имя языка и, возможно, кодировки). Надо указывать путь, иначе файл будет в текущем каталоге (что тоже может быть полезно иногда). Можно указать через запятую два и более имен файлов, чтобы вести несколько словарей: личный и рабочий, например.

Можно эту опцию и не задавать, Вим создаст файл за вас самостоятельно. Эта опция для тех, кто знает, чего хочет.

Команда zg вносит слово под курсором в ваш словарь как правильное. Число-повторитель позволяет указать номер файла-словаря. Если команда применена к выделению, то всё выделенное заносится в словарь как одно слово. Возможны странности, если слово указано в действующем словаре как ошибочное.

Команда zw заносит слово как ошибочное. Если оно в словаре уже есть (как хорошее), то эта запись окажется закомментирована.

Иногда вам не надо заносить слово в словарь на вечные времена, потому что оно только в данном файле пишется так. На этот случай есть команды zG и zW, которые заносят слово во временный список хороших/плохих слов, который применен ко всем буферам, но пропадает при выходе из Вим.

Можно отменить эти четыре команды без редактирования файла вручную: командами zug, zuw, zuG, zuW.

Есть и команды с тем же смыслом в командной строке:

:spellgood, spellwrong, spellundo.

С восклицательным знаком относятся к временному списку, а повторитель позволяет указать номер словаря. Принимают параметр-слово, которое надо внести.

Команда z= открывает список предложений, ориентируясь на слово под курсором или ближайшее слово, помеченное как проблемное. С повторителем выбирает указанную альтернативу "не глядя". Чаще всего подходит первая, так что можно нажать 1z= и чаще всего угадаешь. Если не угадал, отмени (u) и попробуй без повторителя.

Команда :spellrepall делает замену последней z= на всех вхождениях слова в тексте.

Однажды я редактировал статью одного коллеги, который систематически писал therefor. Я мог исправить все вхождения средствами замены, :%s/therefor\>\zs/e/, но режим проверки орфографии был включен, и команда :spellrepall сделала работу.

Можно в режиме вставки посмотреть варианты, нажав <C-X>s. Это вариант автодополнения.

Есть опция spellsuggest с волшебными возможностями. Она определяет, как предлагать слова на замену. Через запятую перечислены варианты, среди которых могут быть best, double, fast, число, file:имя, expr:выражение. Из первых трех может быть только одна.

Вариант fast ищет слова с минимумом отличий, считая за таковые пропуск символа, вставку лишнего, перестановку двух соседних. Хорошо работает для простых опечаток. По моему мнению, хорош для русского, но best ему равнозначен.

Вариант best работает так же, но учитывает немного фонетику, меняя порядок слов. Ориентирован на английский язык и работает для него лучше всего. Для русского должен быть равнозначен предыдущему.

double применяет два метода: fast и фонетический. Работает только для языков, в которых звучание слов известно Виму. Этот метод хорош, если вы плохо знаете язык вроде английского, в котором пишется не как слышится.

Пример. Я пишу слово inaf: ну вот допустим, что я не знаю, как оно пишется. Метод по умолчанию best: правильного варианта вообще нет. А откуда ему взяться, если совпадает только одна буква из шести?
Но включим метод double, учитывающий фонетику, и попробуем снова. Теперь под номером 20 правильный вариант есть. Вим учел произношение и нашел вариант, хоть он и не первый по приоритету.

Число перед командой позволяет ограничить число вариантов.

Можно указать файл, в котором в каждой строке указано плохое слово и через / исправление. Предлагаемое исправление должно входить в словарь как правильное, то есть вы можете только поднять исправление в списке предложений.

Можно указать выражение (по сути, функцию), которое должно вернуть список списков (пар), содержащих исправление и его числовой ранг. Подозрительное слово доступно как v:val. Этот способ позволяет вытворять разные хакерские трюки.

Опция spellcapcheck задает регулярное выражение для поиска конца предложения: это нужно, чтобы отлавливать неозаглавленные предложения.

После задания опции spelllang, Вим поищет и запустит скрипт spell/LANG.vim, где LANG - выставленный язык. Каталог spell ищется по допустимым путям (см. runtimepath). Этот скрипт позволяет настроить проверку под конкретный язык, например, выставить spellcapcheck.

У меня в поставке идут скрипты для идиша и иврита (при том, что идиша я не знаю вообще, то есть это у всех так) и они отключают проверку конца предложения вообще: в этих языках нет заглавных букв.

Для одного языка может идти несколько словарей с диалектами, например помимо en (английский) есть en_us (США), en_gb (Британия) и другие. Слово, входящее в один такой словарь, но не входящее в другой, отмечается как диалектное. При добавлении слова командой zg, оно добавляется во все словари.

Для русского есть три словаря: помимо общего ru, есть ru_ru и ru_yo: в первом не учитывается буква ё, во втором - учитывается. Это "псевдодиалекты".

Файлы словарей имеют тенденцию к росту, так как команда zw просто закомментирует слово, если оно в словаре есть. Не удалит. Можно удалить все комментарии (что начинаются с одной решетки, но не с двух) во всех файлах словарей командой

:runtime spell/cleanadd.vim

По умолчанию, не чистятся словари, которые обновлены секунду назад. Можно задать это время в переменной:

let g:spell_clean_limit = 86400

Помимо слов, могут распознаваться словосочетания, такие как the the (распространенная опечатка) или et al (устойчивое латинское выражение). Вим попытается найти такое сочетание, даже если его части на разных строках, и при этом игнорирует некоторые символы в начале строки, вроде >, решетки и т.п.: они часто играют роль комментариев.

Есть доступ к проверке орфографии из скриптов: функции spellbasword(), spellsuggest(), soundfold(). Об этом в другой раз.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022