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

от автора

     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.

ссылка на оригинал статьи http://habrahabr.ru/post/215055/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *