info
kitetu.net
2008/3/16 日曜日 (13:35:01)、宇田川 浩行 による、Ubuntu, Emacs への投稿。
namazu.el (namazu-mode) は Emacs 上で高速な全文検索を可能にするための、 Namazu の Emacs 版インターフェイスです。現状では、Emacs 上で最も安定して使えるインデックス型の全文検索だと思います。しかし、Ubuntu などの OS で標準環境の文字エンコーディングが UTF であったり、文書が UTF で保存されていたりする場合には検索語が正確に伝わらなかったり、文字化けすることがあります。この記事では、とりあえず検索自体は問題なく行なえるようにする簡単な対処方法を説明します。
インデックスの作成
インデックスを作成するには、以下のようなコマンドを使用します。例では端末エミュレータの文字コードが UTF-8 である場合を想定して、EUC-JP での画面出力を UTF-8 に変換する ” | nkf -w” を付けていますが、この部分は使用者の環境に合わせて適宜変更して下さい。
(1) 現在のディレクトリにインデックスを保存したい場合
LANG=ja_JP.eucJP mknmz [検索対象ディレクトリ] | nkf -w
(2) インデックスを保存するディレクトリを指定したい場合
LANG=ja_JP.eucJP mknmz -O [保存ディレクトリ] [検索対象ディレクトリ] | nkf -w
コンソールでの検索
コンソールで検索する場合のコマンドは、以下のようにします。複雑になってしまいますが、namazu-mode では当然こんなコマンドを入力する必要はありません。テストのためです。
LANG=ja_JP.UTF8 namazu `echo "[検索語]" | nkf -W` [インデックス] | nkf -w
このコマンドでは、まず nkf を使い namazu コマンドに検索語を UTF-8 として扱わせ、その実行結果を更に nkf で UTF-8 として出力しています。
UTF-16 の場合は、NKF のオプションを “-W16″ と “-w16″ に変えてください。
namazu.el での検索
上記のコマンドをコンソールで実行して問題がなければ、namazu-mode での検索で文字化けや検索語が伝わないことの原因は、namazu.el 内での namazu コマンドの呼び出し方にあります。
そこで、簡単なシェルスクリプトを経由させることで呼び出し方を変えてしまいます。
#!/bin/sh LANG=ja_JP.UTF8 namazu $1 $2 $3 $4 $5 `echo "$6" | nkf -W` $7 | nkf -w
上記の内容を例えば “namazu-utf8.sh” のようなファイル名で保存して、下記のようなコマンドで実行権限を付与します。
chmod +x namazu-utf8.sh
“.emacs” などの設定ファイルで、このスクリプトが置かれているパスを “namazu-command” 変数に設定します。
(setq namazu-command "[スクリプトのパス]")
以上で、UTF 環境でも namazu.el を利用した検索が正常に行なえるようになります。
他の問題
筆者の場合、Emacs 21.4.1 と namazu.el 1.0.3 で、font-lock が原因でフリーズする問題が併発していました。これは単純に、namazu-mode で font-lock を切って解決していますが、色分けなどはされなくなってしまいます。
(add-hook 'namazu-mode-hook (lambda () (font-lock-mode nil)))
注意点など
Namazu で UTF を扱うには、NKF のバージョンが、2.04 以上である必要があります。最近の OS であれば問題ないはずですが、上手くいかない場合は NKF のバージョンを確認してみて下さい。
今回紹介した方法は、あくまで応急処置的なものです。もっと根本的に解決する方法があるかもしれません。namazu.el 自体がしばらく更新されていないようなので、本体に何か反映できればいいのですが、Emacs Lisp に関する筆者の知識不足により実現できていません。
追記
2008/4/27 内容を修正
mknmz に LANG=ja_JP.UTF8 を指定すると記述していましたが、ご指摘を頂いて間違いであることが分かりました。この文字コード指定はインデックスの出力に使用されるもので、入力ファイルの処理には関係ないようです。UTF ファイルであっても mknmz は自動的に EUC-JP に変換してインデックスを作成してくれます。したがって、namazu.el の挙動不良に関してだけいえば、原因は Emacs 側に設定している文字コードと namazu コマンドの入出力文字コードとの不整合のみにある、ということでした。
この記事に寄せられたご意見は、現在 2件です。(RSS 2.0)
2008/4/26 土曜日 (18:51:26)、opengl2772 さんによる投稿。
mknmzrc の $NKF を書きかえる必要はありません。 nkf はそのままで自動認識します。また、コマンドではなく NKF モジュールをお使いになることをおすすめします。
なお、mknmz は ja_JP.UTF8 に対応していませんので、ここで書かれた内容を実行しないようにお願いいたします。
ja_JP.eucJP でインデックスを作成し、検索を行ってください。 検索語が UTF-8 の場合は、検索語を EUC-JP に変換して namazu に渡してください。検索結果は ja_JP.eucJP で返りますので、nkf で UTF-8 に変換して表示してください。
2008/4/27 日曜日 (14:25:07)、宇田川 浩行 さんによる投稿。
opengl2772さん
トライ&エラーでとりあえず動いたからいいやと思っていたんですが Namazuの挙動に関してかなり勘違いしていたようです。
mknmzは余計なことをせずja_JP.eucJPで良かったんですね。 スクリプトはここに書いてあるまま弄ってないんですが namazu.el でもメッセージの文字化けがあっさり消えました。
大変勉強になりました。ご指摘ありがとうございます! 早速記事に反映させていただきます。
この記事へのトラックバック URI :
http://www.kitetu.net/old/notes/0012.html/trackback