EmacsとHunspell:通常のスペルチェック



Hunspellは、今日入手可能な最も有望な無料のスペルチェッカーです。 デフォルトでは、FirefoxやOpenOfficeなどのプログラムに統合されています。 それに対する辞書は、類推の中で群を抜いて最大です。 しかし、Emacsでは、友人を作るのはそれほど簡単ではありません。





Hunspellのインストール



Hunspellには依存関係がほとんどないため、まず最初にHunspellを組み立てる必要があります。 これを行うには、 ここにアクセスし 、ソースコードのtarballをダウンロードする必要があります。



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







これでHunspellのソースコードができましたが、それでもEmacsでは動作しません。それを動作させるには特定のNikolai Suschenko によって書かれたパッチ必要です。 彼に感謝します。 念のため、ここにパッチを用意します。



パッチ
 --- 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で機能するようになりました。




All Articles