Рабочая настройка для hunspell в Emacs

У кого-нибудь есть рабочая настройка для hunspell и Emacs? Просто установка ispell-program-name на hunspell не работает, выход (при использовании flyspell, например) выглядит следующим образом:

-> UTF-8 encoding error. Missing continuation byte in 0. character position: - 9631: word not found

(мои файлы обычно кодируются в UTF-8)

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

Любой, у кого есть рабочее решение? Было бы неплохо иметь возможность переключаться между двумя словарями (по умолчанию должен быть шведский словарь и вторичный английский), но что-то работает еще лучше.

Ответ 1

Если вы получаете эту ошибку кодирования UTF-8, это означает, что процесс hunspell запускается с аргументом, определяющим некоторую другую кодировку. Когда я проверяю список процессов, например, я вижу этот дочерний процесс в Emacs после его запуска:

/usr/bin/hunspell -a  -B -i iso-8859-1

Функция ispell-get-coding-system - это то, что решает, какую кодировку использовать, что она делает, исследуя большую переменную ispell-dictionary-alist, которая, как представляется, перечисляет все языки, известные Emacs. Функция обычно захватывает последний символ из записи, которая соответствует языку, который вы хотите проверить. По какой-то причине я не удосужился выяснить, этот список имеет iso-8859-1 для английского языка, а не, вы знаете, обращая внимание на кодировку в вашем фактическом буфере. Я знаю, это кажется бессмысленным. Но мы продолжаем.

Вы могли бы подумать, что можете переопределить это, установив собственное значение для переменной ispell-dictionary-alist и используя utf-8 в качестве последнего из восьми параметров:

;; I could never get Emacs to pay attention to this
(setq ispell-dictionary-alist
  '((nil "[A-Za-z]" "[^A-Za-z]" "[']" t ("-d" "en_US") nil utf-8)))

Но я никогда не смог заставить этот параметр работать на самом деле, независимо от того, сделал ли я (load-library "ispell") первым в своем .emacs или сделал это внутри одного из них:

;; Did not work for me either.
(eval-after-load "ispell" '(progn ...))

В любом случае, если я запустил новый Emacs и ввел *scratch* и набрал ispell-dictionary-alist и нажал Control-J, тогда появится огромный оригинальный список, созданный ispell. Каждый раз.

Итак, я решил сделать окончательный вызов всей проблемы этого огромного списка и просто переписать функцию ispell-get-coding-system, чтобы всегда возвращать utf-8. Конечно, это укусит меня в следующий раз, когда я открою файл, который действительно находится в iso-8859-1, но я так никогда не делаю этого, правильно?

Чтобы реализовать это успешно в моем файле .emacs (ну, ~/.emacs.d/init.el, но который принимает так много типизации для ответа на переполнение стека), требуется следующий код:

;; It works!  It works!  After two hours of slogging, it works!
(if (file-exists-p "/usr/bin/hunspell")
    (progn
      (setq ispell-program-name "hunspell")
      (eval-after-load "ispell"
        '(progn (defun ispell-get-coding-system () 'utf-8)))))

Теперь у меня есть hunspell и работает как чемпион! К сожалению, вся причина, по которой я работал, заключалась в том, что его словарь был значительно больше, чем aspell, но я вижу, что он выделяет одни и те же слова. Хорошо, я попробую другой подход. В основном я хочу, чтобы проверка орфографии была загружена с помощью словаря /usr/share/dict/american-english-huge, доступного на Ubuntu, но aspell умер во многих отношениях, когда я пытался расширить свои горизонты. Может быть, мне повезет с hunspell - мы увидим.

Ответ 3

От https://passingcuriosity.com/2017/emacs-hunspell-and-dictionaries/

Добавить

;; Set $DICPATH to "$HOME/Library/Spelling" for hunspell.
(setenv
  "DICPATH"
  "/path/to/hunspell/dictionary")
;; Tell ispell-mode to use hunspell.
(setq
  ispell-program-name
  "hunspell")

в ~/.emacs.

Мои словарные файлы были в /usr/share/hunspell.