LINUX.ORG.RU

Emacs, Aspell и одновременное использование словарей


0

0

Ранее уже обсуждался этот вопрос

http://www.linux.org.ru/view-message.jsp?msgid=2446507

однако, я так и не смог понять как настроить одновременную работу словарей.

Версии ПО:

  • GNU Emacs 23.1.50.1 (i386-mingw-nt5.1.2600)
  • International Ispell Version 3.1.20 (but really Aspell 0.50.3)

Фрагмент .emacs:

(setq-default ispell-program-name "aspell")
(setq ispell-dictionary "english")
(setq ispell-local-dictionary "russian")
(setq flyspell-default-dictionary "russian")

При таких настройках

M-x ispell-buffer проверяет правильно только русский текст английский текст распознается как ошибка, варианты замены не предлагаются.

flyspell-mode проверяет русский текст, английский игнорирует.

В упомянутой выше ветке предлагают использовать ispell-multi

http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/ispell-multi.el

Располагаем файл ispell-multi.el в load-path

Фрагмент комментариев из ispell-multi.el:

;; If all you want to do is to change the behavior of ispell so that
;; it uses multiple ispell processes for different buffers, then
;; (require 'ispell-multi) is all you need to do.

Добавление этой (require 'ispell-multi) строчку в конце фрагмента .emacs:

(setq-default ispell-program-name "aspell")
(setq ispell-dictionary "english")
(setq ispell-local-dictionary "russian")
(setq flyspell-default-dictionary "russian")
(require 'ispell-multi)

не изменяет поведение, добавление (require 'ispell-multi) в начале фрагмента .emacs приводит к следующим ошибкам:

M-x ispell-buffer

Starting new Ispell process [english] ...
apply: Creating process pipe: no error

M-x flyspell-mode

Starting new Ispell process [english] ...
Enabling Flyspell mode gave an error

Подскажите решение.

ЭТО НЕ ПРИКОЛ, ЧИТАЙ ПОДТЕКСТ

amorpher ★★★★★
()
Ответ на: комментарий от amorpher

hypocrisy-the-arrival-eraser.el - not found!

HardRock я конечно сам люблю, но сабж не об этом. Предлагаете не использовать упомянутые в топике приложения? А как осуществлять spell-check plain-text -а?

Да, и, это, завязываем оффтопить! Есть что сказать по теме?

Kostafey
() автор топика

Я сам спелчекерами не пользуюсь, поэтому никаких особых рецептов я не 
дам. В тексте, который в самом начале ispell-multi.el написано, что 
словари надо переключать по контексту. 

;; Flyspell-mode provides a hook that runs before checking each word;
;; this allows you to change the value of ispell-local-dictionary to a
;; different language, depending on the context.  If you have a
;; package that parses a buffer and figures out what languages are in
;; it and where they are, you can tell flyspell about it by setting
;; the text property `ispell-multi-lang' to the correct ispell
;; language (this can be any value that ispell-change-dictionary
;; accepts).  Your package should set the value of the buffer-local
;; variable `flyspell-generic-check-word-predicate' to the symbol
;; `ispell-multi-verify'; do this *after* you have turned on
;; flyspell-mode.

Насколько я пока понял, тебе потребуется какой-то эвристический 
алгоритм, чтобы поменять ispell-local-dictionary. Хук вызывается, 
как написано, перед проверкой каждого слова. То есть надо в хуке 
взять слово прикинуть, на каком оно языке и выбрать язык для его 
проверки.

В качестве примеров там указаны два пакета, построенных на базе 
ispell-multi, где используется контекстное переключение. Но там 
алгоритмы для переключения явные:

;; I have written two packages that provide this sort of behavior.
;; One is flyspell-xml-lang.el, which tells flyspell what the local
;; language is in xml files depending on xml:lang attributes, and
;; another is flyspell-babel.el, which does the same with Babel
;; commands in LaTeX files.

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

Мое понимания этого пакета такое. Решения нет.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

> надо соображать, получается, как отличить
> немецкое слово от английского

Натыкался на старинную библиотеку libtextcat: http://software.wise-guys.nl/libtextcat/ (заброшена в 2003 году, но мне удалось ее нормально собрать сегодня).
Какую-то ее версию использует OpenOffice. Данные для опознавания слов можно выдрать из него. К Емаксу эту библиотеку тоже прикручивали: есть flyspell-textcat.el.

Правда, flyspell-textcat-mode опознает текст по абзацам, а не по словам, и вообще, насколько я понял, ничего кроме подсветки орфоргафии не делает. Саму подсветку я прикрутить так и не осилил, а с учетом того, что я работаю либо с английским, либо с русским текстом, обошелся хаком, найденным в архивах emacs@c.j.r: http://pastebin.ca/679988 — там выбор словаря сделан примитивно, по используемому алфавиту.

Sergius256
()

Можно использовать hunspell вместо aspell'а как описано в http://www.emacswiki.org/emacs/InteractiveSpell#toc6

Hunspell может использовать два словаря:

hunspell -d en_US,ru_RU

Варианты исправлений будут только для первого (en_US) словаря.

verbovet
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.