Если вы получаете эту ошибку кодировки 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
- посмотрим.