Проверка орфографии с несколькими словарями

14

Как я могу использовать несколько словарей с проверкой орфографии Emacs? В частности, я хочу использовать британский английский словарь и медицинский английский словарь одновременно.

Divinenephron
источник
Вы используете flyspell?
PythonNut
Да, я использую flyspell.
Divinenephron
Решение может использовать, flyspellно не обязательно. Таким образом, ответы могут иметь отношение к большему количеству людей.
Divinenephron

Ответы:

16

Hunspell может проверять орфографию с несколькими словарями, и вы можете настроить это для работы с Emacs. Вот как я это делаю на OS X 10.11, с Emacs 25.0. Это не будет работать с более старым Emacsen.

Установите Hunspell

brew install hunspell

Загрузите словари Hunspell из LibreOffice и OpenMedSpel .

cd ~/Downloads/

curl http://extensions.libreoffice.org/extension-center/english-dictionaries/releases/2016.04.01/dict-en.oxt > dict-en.oxt
unzip dict-en.oxt en_GB.aff en_GB.dic

curl -L https://addons.mozilla.org/en-US/firefox/downloads/latest/6526/addon-6526-latest.xpi > openmedspel.xpi
unzip openmedspel.xpi dictionaries/OpenMedSpel.{aff,dic}
mv dictionaries/OpenMedSpel.dic en_US-med.dic
mv dictionaries/OpenMedSpel.aff en_US-med.aff

Вставьте словари ~/Library/Spelling/.

mv *.aff *.dic ~/Library/Spelling/

Добавьте это к ~/.emacs/init.el:

(with-eval-after-load "ispell"
  (setq ispell-program-name "hunspell")
  (setq ispell-dictionary "en_GB,en_US-med")
  ;; 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 "en_GB,en_US-med"))
Divinenephron
источник
Обратите внимание, что эта функция ispell-hunspell-add-multi-dicотсутствует в более старых версиях ispell.el, даже в Emacs 24.5. Мне пришлось скачать новейший файл с github.com/emacs-mirror/emacs/blob/master/lisp/textmodes/… и снова скомпилировать его, чтобы он заработал.
xji
Я использую Emacs 25.0. Я добавил примечание, что оно работает только на Emacs> = 25.0.
Divinenephron
Я установил Emacs 25. Однако, как ни странно, я встретил следующую ошибку: Symbol’s function definition is void: ispell-hunspell-add-multi-dicхотя я уверен /usr/share/emacs/25.1.50/lisp/textmodes/ispell.elc, что функция присутствует. Есть идеи, как это могло случиться? Благодарю.
xji
Я понял , что это был мой ispell.elв /usr/share/emacs/site-lisp/теневом новее ispell.elв Emacs25 ... Смотрите unix.stackexchange.com/questions/28483/... для тех, кто может быть встречая тот же вопрос.
xji
2

Предположим, вы уже загрузили en_US-med.dic и en_US-med.aff и установили hunspell

Шаг 1, запустите hunspell -Dв оболочке, которая сообщит каталогу, где hunspell ищет словари, скопируйте en_US-med.dic и en_US-med.aff в этот каталог.

Шаг 2, вставьте приведенный ниже код в ~ / .emacs,

(setq ispell-program-name "hunspell")
;; you could set `ispell-dictionary` instead but `ispell-local-dictionary' has higher priority
(setq ispell-local-dictionary "en_US")
(setq ispell-local-dictionary-alist '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_US,en_US-med") nil utf-8)))

Фактически мы передаем опцию "-d en_US, en_US-med" в CLI Hunspell, чтобы он мог использовать ДВА словаря "en_US" и "en_US-med" одновременно.

Параметры "-d" описаны в руководстве пользователя hunspell ( man hunspellв оболочке)

Вот цитата из руководства Hunspell:

-d en_US,en_geo,en_med,de_DE,de_med

       en_US  and  de_DE  are  base dictionaries, they consist of aff and dic
       file pairs: en_US.aff, en_US.dic and  de_DE.aff,  de_DE.dic.   En_geo,
       en_med,  de_med  are  special dictionaries: dictionaries without affix
       file. Special dictionaries are optional extension of the base  dictio‐
       naries  usually  with  special (medical, law etc.)  terms. There is no
       naming convention for special dictionaries, only the ".dic" extension:
       dictionaries  without affix file will be an extension of the preceding
       base dictionary (right order of the parameter list needs for good sug‐
       gestions). First item of -d parameter list must be a base dictionary.

Протестировано на Emacs 24.3, Debian 7 со словом «фиброхондрит».

Должен работать на Emacs 23+ на любой ОС .

Обратите внимание, что в Windows самый простой способ сообщить исполняемому файлу hunspell путь поиска в словаре - это установить переменную окружения DICTPATH(это описано в руководстве по hunspell). Вполне возможно, что исполняемый файл hunspell из Cygwin / MSYS2 распознает путь только в формате UNIX .

чен бен
источник
Этот метод не позволяет мне использовать несколько словарей.
Divinenephron
Код, который я дал, состоит из нескольких словарей.
Чен бин
Понятно, спасибо за указание на это - я не заметил такой -dвозможности.
Divinenephron
Ну, похоже, это не работает по какой-то причине. Когда я использую опцию -d в командной строке, она работает, но в Emacs, helm-flyspellкажется , как-то использует словарь только с системным языком.
xji
helm-flyspell может использовать aspell.
Чен бин