Обновить

Emacs и Hunspell: нормальная проверка правописания

Emacs

Hunspell является наиболее перспективным из имеющихся на сегодняшний день свободных приложений для проверки правописания. Он встроен по умолчанию в такие программы как Firefox и OpenOffice. Словари к нему на сегодняшний день самые большие среди аналогов. Но с Emacs его так просто не подружить.


Установка Hunspell


Перво-наперво вам придется собрать Hunspell вручную, благо зависимостей у него не много. Для этого вам нужно пойти сюда и скачать тарболл с исходным кодом.

 cd /tmp
 wget 'http://hunspell.cvs.sourceforge.net/viewvc/hunspell/hunspell/?view=tar' -O hunspell.tgz
 tar -xzf hunspell.tgz
 cd hunspell


Теперь у нас есть исходный код Hunspell, который тем не менее не будет работать с Emacs, а чтобы он заработал нам нужен патч, написанный неким Николаем Сущенко. За что ему огромное спасибо. На всякий случай привожу патч здесь.

Патч
--- src/tools/hunspell.cxx~0	2011-01-21 19:01:29.000000000 +0200
+++ src/tools/hunspell.cxx	2013-02-07 10:11:54.443610900 +0200
@@ -710,13 +748,22 @@ if (pos >= 0) {
 			fflush(stdout);
 		} else {
 			char ** wlst = NULL;
-			int ns = pMS[d]->suggest(&wlst, token);
+			int byte_offset = parser->get_tokenpos() + pos;
+			int char_offset = 0;
+			if (strcmp(io_enc, "UTF-8") == 0) {
+				for (int i = 0; i < byte_offset; i++) {
+					if ((buf[i] & 0xc0) != 0x80)
+						char_offset++;
+				}
+			} else {
+				char_offset = byte_offset;
+			}
+			int ns = pMS[d]->suggest(&wlst, chenc(token, io_enc, dic_enc[d]));
 			if (ns == 0) {
-		    		fprintf(stdout,"# %s %d", token,
-		    		    parser->get_tokenpos() + pos);
+		    		fprintf(stdout,"# %s %d", token, char_offset);
 			} else {
 				fprintf(stdout,"& %s %d %d: ", token, ns,
-				    parser->get_tokenpos() + pos);
+					char_offset);
 				fprintf(stdout,"%s", chenc(wlst[0], dic_enc[d], io_enc));
 			}
 			for (int j = 1; j < ns; j++) {
@@ -745,13 +792,23 @@ if (pos >= 0) {
 			if (root) free(root);
 		} else {
 			char ** wlst = NULL;
+			int byte_offset = parser->get_tokenpos() + pos;
+			int char_offset = 0;
+			if (strcmp(io_enc, "UTF-8") == 0) {
+				for (int i = 0; i < byte_offset; i++) {
+					if ((buf[i] & 0xc0) != 0x80)
+						char_offset++;
+				}
+			} else {
+				char_offset = byte_offset;
+			}
 			int ns = pMS[d]->suggest(&wlst, chenc(token, io_enc, dic_enc[d]));
 			if (ns == 0) {
 		    		fprintf(stdout,"# %s %d", chenc(token, io_enc, ui_enc),
-		    		    parser->get_tokenpos() + pos);
+		    		    char_offset);
 			} else {
 				fprintf(stdout,"& %s %d %d: ", chenc(token, io_enc, ui_enc), ns,
-				    parser->get_tokenpos() + pos);
+				    char_offset);
 				fprintf(stdout,"%s", chenc(wlst[0], dic_enc[d], ui_enc));
 			}
 			for (int j = 1; j < ns; j++) {


Сохраняем патч в файл /tmp/hunspell/emacs_patch.patch. Теперь применяем его:

  cd /tmp/hunspell
  patch src/tools/hunspell.cxx emacs_patch.patch


Все готово к сборке. Префикс по умолчанию /usr/local/, так что конфликтовать со стандартным hunspell вашего дистрибутива не будет.

  ./configure
  make
  sudo make install



Установка словарей


Вам нужно установить стандартные словари hunspell, в нашем случае английский и русский:

  sudo apt-get install hunspell hunspell-en-us hunspell-ru



Настройка Emacs


В .emacs добавьте в конец файла следующее:

;; список используемых нами словарей
(setq ispell-local-dictionary-alist
    '(("russian"
       "[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
       "[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
       "[-]"  nil ("-d" "ru_RU") nil utf-8)
      ("english"
       "[A-Za-z]" "[^A-Za-z]"
       "[']"  nil ("-d" "en_US") nil iso-8859-1)))

;; вместо aspell использовать hunspell
(setq ispell-really-aspell nil
      ispell-really-hunspell t)

;; полный путь к нашему пропатченному hunspell
(setq ispell-program-name "/usr/local/bin/hunspell")


Все, теперь проверка правописания на русском и английском языке будет работать через привычные ispell-buffer и flyspell-mode.
Теги:emacshunspellispellaspellрусский язык
Хабы: Emacs
Рейтинг +3
Количество просмотров 6,6k Добавить в закладки 14
Комментарии
Комментарии 1

Похожие публикации

Технический писатель
от 90 000 до 180 000 ₽Digital LineМосква
Junior Clojure Developer
от 70 000 до 150 000 ₽Health SamuraiСанкт-ПетербургМожно удаленно
QA engineer
от 100 000 ₽ГЕТ бизнес консалтингСанкт-Петербург
Консультант SAP PP (стажёр)
от 40 000 до 50 000 ₽SabrisМосква

Лучшие публикации за сутки