Неделю назад добавил в 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 проверяет только отдельные слова, но не словосочетания или предложения. Поэтому остаются ошибки, когда у слова не то окончание или время. Или когда из-за копи-пасты образовалась бессмыслица. Даже после проверки текст нужно вычитывать.

Мой полный конфиг Емакса лежит на Гитхабе.

А как дела с русским языком в вашем редакторе?