Ответ 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
- мы увидим.