Corrector ortográfico con múltiples diccionarios

14

¿Cómo puedo usar varios diccionarios con el corrector ortográfico de Emacs? Específicamente, quiero usar un diccionario de inglés británico y un diccionario de inglés médico al mismo tiempo.

Divinenephron
fuente
Estas usando flyspell?
PythonNut
Sí, lo estoy usando flyspell.
Divinenephron
La solución puede usar flyspellpero no tiene que hacerlo. De esa manera, las respuestas pueden ser relevantes para más personas.
Divinenephron

Respuestas:

16

Hunspell puede revisar la ortografía con varios diccionarios, y puede configurarlo para que funcione con Emacs. Así es como lo hago en OS X 10.11, con Emacs 25.0. No funcionará con Emacsen anteriores.

Instalar Hunspell

brew install hunspell

Descargue los diccionarios Hunspell de LibreOffice y 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

Pon los diccionarios en ~/Library/Spelling/.

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

Agregue esto a ~/.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
fuente
Tenga en cuenta que la función ispell-hunspell-add-multi-dicparece no estar presente en versiones anteriores de ispell.el, incluso la de Emacs 24.5. Tuve que descargar el archivo más nuevo en github.com/emacs-mirror/emacs/blob/master/lisp/textmodes/… y compilarlo en bytes nuevamente para que funcione.
xji
Estoy usando Emacs 25.0. Agregué una nota sobre que funciona solo en Emacs> = 25.0.
Divinenephron
Instalé Emacs 25. Sin embargo, extrañamente me encontré con el siguiente error: Symbol’s function definition is void: ispell-hunspell-add-multi-dicaunque estoy seguro /usr/share/emacs/25.1.50/lisp/textmodes/ispell.elc, la función está presente. ¿Alguna idea de cómo pudo haber sucedido? Gracias.
xji
Me di cuenta de que era mi ispell.elen /usr/share/emacs/site-lisp/la sombra de su más reciente ispell.elen Emacs25 ... Ver unix.stackexchange.com/questions/28483/... para cualquiera que pudiera encontrarse con el mismo problema.
xji
2

Supongamos que ya ha descargado en_US-med.dic y en_US-med.aff y ha instalado hunspell

Paso 1, ejecute hunspell -Den shell, que le dirá al directorio donde hunspell busca diccionarios, copie en_US-med.dic y en_US-med.aff a ese directorio.

Paso 2, inserte el siguiente código en ~ / .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)))

De hecho, pasamos la opción "-d en_US, en_US-med" a la CLI de hunspell para que pueda usar DOS diccionarios "en_US" y "en_US-med" al mismo tiempo.

Las opciones "-d" están documentadas en el manual hunspell ( man hunspellen shell)

Aquí está el texto citado del manual 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.

Probado en Emacs 24.3, Debian 7 con la palabra "fibrocondritis".

Debería funcionar en Emacs 23+ en cualquier sistema operativo .

Tenga en cuenta que en Windows la forma más fácil de decirle al ejecutable hunspell que la ruta de búsqueda del diccionario es configurar la variable de entorno DICTPATH(está documentado en el manual hunspell). Es muy posible que el ejecutable hunspell de Cygwin / MSYS2 solo reconozca la ruta en formato UNIX .

Chen Bin
fuente
Ese método no me permite usar múltiples diccionarios.
Divinenephron
El código que le di es multi-diccionario.
Chen bin
Ya veo, gracias por señalarlo, no noté la -dopción.
Divinenephron
Bueno, esto no parece estar funcionando por alguna razón. Cuando uso la opción -d en la línea de comando funciona, pero en Emacs, helm-flyspellde alguna manera parece que solo usa el diccionario con el idioma del sistema.
xji
helm-flyspell podría usar aspell.
chen bin