Verificação ortográfica com vários dicionários

14

Como posso usar vários dicionários com o corretor ortográfico do Emacs? Especificamente, quero usar um dicionário de inglês britânico e um dicionário de inglês médico ao mesmo tempo.

Divinenephron
fonte
Você está usando flyspell?
precisa saber é o seguinte
Sim, eu estou usando flyspell.
Divinenephron
A solução pode usar, flyspellmas não precisa. Dessa forma, as respostas podem ser relevantes para mais pessoas.
Divinenephron 02/04

Respostas:

16

O Hunspell pode verificar a ortografia com vários dicionários, e você pode configurá-lo para funcionar com o Emacs. É assim que eu faço no OS X 10.11, com o Emacs 25.0. Não funcionará com o Emacsen mais antigo.

Instalar Hunspell

brew install hunspell

Faça o download dos dicionários Hunspell do LibreOffice e 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

Coloque os dicionários ~/Library/Spelling/.

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

Adicione isto 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
fonte
Observe que a função ispell-hunspell-add-multi-dicparece não estar presente nas versões mais antigas ispell.el, mesmo na versão Emacs 24.5. Eu tive que baixar o arquivo mais recente em github.com/emacs-mirror/emacs/blob/master/lisp/textmodes/… e compilá-lo por bytes novamente para fazê-lo funcionar.
xji
Estou usando o Emacs 25.0. Eu adicionei uma observação sobre isso, trabalhando apenas no Emacs> = 25.0.
Divinenephron
Instalei o Emacs 25. No entanto, estranhamente, encontrei o seguinte erro: Symbol’s function definition is void: ispell-hunspell-add-multi-dicembora tenha certeza /usr/share/emacs/25.1.50/lisp/textmodes/ispell.elc, a função está presente. Alguma idéia de como isso pode ter acontecido? Obrigado.
Xj6
Eu percebi que era a minha ispell.elna /usr/share/emacs/site-lisp/sombra o mais recente ispell.elem Emacs25 ... Ver unix.stackexchange.com/questions/28483/... para quem pode estar encontrando o mesmo problema.
Xj6
2

Suponha que você já baixou en_US-med.dic e en_US-med.aff e instalou o hunspell

Etapa 1, execute o hunspell -Dshell, que informará o diretório em que o hunspell procura por dicionários, copie en_US-med.dic e en_US-med.aff para esse diretório.

Etapa 2, insira o código abaixo em ~ / .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)))

Na verdade, passamos a opção "-d en_US, en_US-med" para a CLI do hunspell, para que possa usar DOIS dicionário "en_US" e "en_US-med" ao mesmo tempo.

As opções "-d" estão documentadas no manual hunspell ( man hunspellno shell)

Aqui está o texto citado do 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.

Testado no Emacs 24.3, Debian 7 com a palavra "fibrocondrite".

Deve funcionar no Emacs 23+ em qualquer sistema operacional .

Observe no Windows que a maneira mais fácil de dizer ao executável hunspell que o caminho de pesquisa no dicionário é configurar a variável de ambiente DICTPATH(está documentada no manual hunspell). É muito possível que o executável hunspell do Cygwin / MSYS2 reconheça o caminho apenas no formato UNIX .

Chen Bin
fonte
Esse método não me permite usar vários dicionários.
Divinenephron 14/05
O código que eu dei IS é multi-dicionário.
Chen bin
Entendo, obrigado por apontar isso - eu não percebi a -dopção.
Divinenephron
Bem, isso não parece estar funcionando por algum motivo. Quando eu uso a opção -d na linha de comando, ela funciona, mas no Emacs, helm-flyspellde alguma forma , parece usar apenas o dicionário com o idioma do sistema.
Xji
helm-flyspell pode usar aspell.
chen bin