ラベル Emacs の投稿を表示しています。 すべての投稿を表示
ラベル Emacs の投稿を表示しています。 すべての投稿を表示

2010年4月21日水曜日

せっかく ispell 入れたけど aspell に…

せっかく ispell を導入したのですが、 What's the Difference Between Ispell and Aspell? に気になることが書かれています。

...Its primary advantage is that it is better at making suggestions when a word is seriously misspelled... Its disadvantage is that the approximate-matching algorithm is specific to English.

私が綴りを確認したいのは英語なので、aspell の方が適しているのかもしれません。

となれば、早速 aspell をインストールします。 過去には OpenSolaris のリポジトリに存在したようなのですが、 最新のビルドでは見つからないため、自前で構築します。

まずは、インストール先の確保。 個人的な習慣なのですが、GNU 系のモジュールを自分で構築した場合は、/opt/gnu に配置することにしています。 最近は欲しいものがほとんどリポジトリから入手できるので、インストール先のディレクトリすら作成してませんでした。

$ pfexec mkdir /opt/gnu
$ mkdir /export/opt/gnu
$ pfexec vi /etc/vfstab
$ tail -1 /etc/vfstab
/export/opt/gnu - /opt/gnu lofs - yes -
$ pfexec mount /opt/gnu

続いて、aspell 本体を構築します。 実は最初は Sun 謹製のコンパイラを使用したのですが、コンパイルエラーになりました。 ならばということで gcc を試したのですが、これもコンパイルエラー。 gcc --version で確認すると 3.4.3。ちょっと古めです。 そういえばと言うことでパッケージマネージャーで gcc を検索すると 4.3.3 があったのでこちらをインストール。 ところがこのコンパイラでもエラー。 エラーメッセージに wget_wch というシンボルがでているので man コマンドで確認すると、XPG4 の curses ライブラリに含まれていることがわかります。 該当するファイル prog/check_funs.cpp を眺めても、curses がらみであることは明らかです。 となれば、CXXFLAGS を設定すればと考えたのですが、関係ない部分に影響を与えるのは馬鹿っぽいです。 README を眺めていると、--enable-curses と --enable-curses-include を使えば良さそうです。

$ wget -P /PATH/TO/WAREHOUSE ftp://ftp.gnu.org/gnu/aspell/aspell-0.60.6.tar.gz
$ gtar xfz /PATH/TO/aspell-0.60.6.tar.gz 
$ cd aspell-0.60.6
$ ./configure --prefix=/opt/gnu CC=/usr/gcc/4.3/bin/gcc CXX=/usr/gcc/4.3/bin/g++ --enable-curses='-L/usr/xpg4/lib -R/usr/xpg4/lib -lcurses' --enable-curses-include=/usr/xpg4/include
$ gmake
$ gmake install

aspell をインストールした後は、辞書をインストールします。 こちらのインストールには先にインストールした aspell が使用されます。

$ wget -P /PATH/TO/WAREHOUSE ftp://ftp.gnu.org/gnu/aspell/dict/en/aspell6-en-6.0-0.tar.bz2
$ bzip2 -d -c /PATH/TO/aspell6-en-6.0-0.tar.bz2 | gtar xf -
$ cd aspell6-en-6.0-0
$ PATH=/opt/gnu/bin:$PATH ./configure 
Finding Dictionary file location ... /opt/gnu/lib/aspell-0.60
Finding Data file location ... /opt/gnu/lib/aspell-0.60
$ gmake
$ gmake install

Emacs の中からは ispell という名前で起動しますので、 aspell が提供している ispell 互換スクリプトをインストールします。

$ cp -p scripts/ispell /opt/free/bin/ispell

ここで Emacs から M-x ispell を実行してみるとエラーになります。

Error: No word lists can be found for the language "ja_JP".

綴りを調べたいのは英語だけですので、先ほどのスクリプトで言語を指定することにします。

$ diff -u scripts/ispell /opt/free/bin/ispell
--- scripts/ispell 水 10月 27 02:12:17 2004
+++ /opt/free/bin/ispell 水  4月 21 16:59:50 2010
@@ -6,6 +6,8 @@
 #   mapping when checking files with the "ispell command".
 #CHECK_FLAGS="--keymapping=ispell"
 
+LANG=en_US.UTF-8 export LANG
+
 command=""
 
 for p

これで無事に aspell が使えるようになりました。

Emacs でスペルチェックしたいので

Emacs で ispell を使いたくなったのですが、OpenSolaris のリポジトリには無いので、久しぶりに自分で構築することにしました。

GNU Emacs FAQ を見ると、ispell は International Ispell から持ってくるのが良さそうです。現行のバージョンということで、ispell-3.3.02.tar.gz をダウンロード。

wget -P ~/PATH/TO/WAREHOUSE http://www.lasr.cs.ucla.edu/geoff/tars/ispell-3.3.02.tar.gz

README ファイルを見ると、local.h.solaris を local.h にコピーして、必要があれば編集しろとのこと。 多少の試行錯誤の結果、次のように変更。 TERMLIB は変更しないと "-lncurses" が使用されて、コンパイルに失敗します。 ファイルの置き場所は基本的に好みの問題ですが、セクション番号はシステムの流儀にあわせます。

--- local.h.solaris 水  4月 27 07:40:08 2005
+++ local.h 水  4月 21 11:16:08 2010
@@ -67,6 +67,8 @@
 #define USG  /* Define on System V or if term.c won't compile */
 #define HAS_RENAME
 
+#define TERMLIB "-lcurses"
+
 /*
  * Important directory paths.  If you change MAN45DIR from man5 to
  * something else, you probably also want to set MAN45SECT and
@@ -73,11 +75,11 @@
  * MAN45EXT (but not if you keep the man pages in section 5 and just
  * store them in a different place).
  */
-#define BINDIR "/usr/local/bin"
-#define LIBDIR "/usr/local/lib"
-#define MAN1DIR "/usr/local/man/man1"
-#define MAN45DIR "/usr/local/man/man4"
-#define MAN45EXT ".4"
+#define BINDIR "/opt/free/bin"
+#define LIBDIR "/opt/free/share/ispell"
+#define MAN1DIR "/opt/free/share/man/man1"
+#define MAN45DIR "/opt/free/share/man/man5"
+#define MAN45EXT ".5"
 
 /*
  * Place any locally-required #include statements here

そして構築してインストール。 ディレクトリの自動作成がうまくいっていないようなので、自分で作成。 そして単に make install とすると不要なファイルまでインストールされるので、 必要なファイルだけということで partial-install を指定。

$ make
$ mkdir /opt/free/share/ispell
$ make partial-install

これで、無事に ispell が Emacs から使用できるようになりました。