Проверка русской орфографии в Emacs
Неделю назад добавил в Emacs проверку русской орфографии. Теперь проверяю заметки прямо в редакторе. Расскажу, как подружить Emacs с русским текстом и заодно об орфографии в принципе.
Emacs умеет проверять текст без установки сторонних модулей. Для этого служат
команды с префиксом ispell-
. Например, ispell-buffer
проверит весь буфер,
ispell-region
– выделенный фрагмент.
Для проверки Emacs вызывает системную утилиту. Он передает ей слово, контекст и дополнительные параметры. Программа ищет слово по внутреннему словарю. Если оно найдено, то переходит к следующему слову. Если точного совпадения нет, программа предлагает похожие варианты для замены.
По умолчанию Emacs использует одноименную программу ispell
. Это старая
консольная утилита, заменившая spell
– еще более древнюю программу. Префикс
i
означает international
, то есть проверку на любом языке при наличии
словаря.
Установить русский пакет в ispell
долгое время не получалось. Его нет в
репозиториях brew
, поддерживается только Линукс. Сборка под Мак валилась
ошибками в кодировках.
Emacs работает не только с ispell
, но и другими spell
-совместимыми
программами. К ним относится, например, aspell
, утилита из проекта GNU. Она
реализует тот же протокол обмена данными, что и ispell
, но более мощная и
современная.
Поставим ее из brew
:
brew install aspell --with-lang-ru
Обратите внимание на флаг в конце. Он указывает, что при установке нужно подтянуть русский пакет. Без флага пакета не будет, и программа не поймет русский текст.
Полный список флагов можно посмотреть в формуле на Гитхабе.
Чтобы Emacs понял, что теперь у нас aspell
вместо ispell
, скажем ему об этом
командой:
(setq ispell-program-name "aspell")
Добавьте это выражение в свой .emacs
файл. Необязательно перезагружать
редактор. Чтобы изменения вступили в силу мгновенно, скопируйте этот же код в
буфер *scratch*
, поставьте курсор за последней скобкой и нажмите C-j
.
Начнем проверку на английском. Откройте любой файл с латиницей. Из списка
команд, вызванного по M-x
, выберите ispell-buffer
. Редактор переключится в
режим проверки:
Когда spell
-программа находит незнакомое слово, проверка останавливается в
ожидании пользователя. Цифры от 0 до 9 служат для выбора подходящего
слова. Клавиша i
означает принять слово как исключение. Пробел означает
пропустить слово.
По окончанию проверки Emacs предложит сохранить правила в локальный
словарь. Например, у вас было слово Postgres, о котором aspell
не знал. Если в
процессе проверки вы нажали i
и сохранили локальные правила, то в следующий
раз Emacs воспримет его как словарное слово.
Чтобы проверить русский текст, переключите словарь командой
ispell-change-dictionary
. Выберите из списка пункт ru
. Откройте файл на
русском и запустите ispell-region
.
Проверка русского текста ничем не отличается от английского. Работают те же клавиши и команды. Вот как выглядит проверка этой заметки на этапе написания:
Иногда мы пишем текст, в котором есть и русские, и английские слова. Например,
описание программы и ее код. Emacs не умеет проверять текст сразу на нескольких
языках. Если запустить прогон всего буфера, то русскому словарю будут незнакомы
все английские слова и наоборот. Чтобы не добавлять в каждый словарь иностранные
исключения, проверяйте текст частями. Выделяйте нужные абзацы и вызывайте
ispell-region
.
Вся информация в Емаксе представлена текстом, поэтому проверка работает в любой части интерфейса. Она не зависит от языка или платформы, под которую вы пишете код. Я частенько прогоняю файлы Кложи, чтобы найти опечатки в переменных. Проверяю описание комита в буфере magit. Ищу ошибки в заметках этого блога.
Важно помнить, что ispell
проверяет только отдельные слова, но не
словосочетания или предложения. Поэтому остаются ошибки, когда у слова не то
окончание или время. Или когда из-за копи-пасты образовалась бессмыслица. Даже
после проверки текст нужно вычитывать.
Мой полный конфиг Емакса лежит на Гитхабе.
А как дела с русским языком в вашем редакторе?
Нашли ошибку? Выделите мышкой и нажмите Ctrl/⌘+Enter
Artem, 7th Aug 2018, link
VS code: полет нормальный
https://uploads.disquscdn.c...
dukeBarman, 16th Apr 2019, link
`brew install aspell --with-lang-ru` - теперь не надо выбирать какие дополнительные словари использовать . Разработчики brew решили устанавливать aspell пакет сразу со всеми словарями, поэтому достаточно `brew install aspell`.
Сергей Будников, 11th Oct 2020, link
ispell отлично проверяет сразу с несколькими словарями, достаточно указать их через запятую:
(setq ispell-dictionary "ru_RU_yo,en_GB")
;; ispell-set-spellchecker-params has to be called before ispell-hunspell-add-multi-dic will work
(ispell-set-spellchecker-params)
(ispell-hunspell-add-multi-dic "ru_RU_yo,en_GB")
Ivan Grishaev, 12th Oct 2020, link , parent
не знал, спасибо!