Personal tools
You are here: Home 原稿・資料 Software Design連載記事「Emacsのトラノマキ」の原稿 Emacsの検索機能を使いこなす(菅原泰樹)
Document Actions

Emacsの検索機能を使いこなす(菅原泰樹)

「Emacsのトラノマキ」 連載第一回 「Emacsの検索機能を使いこなす」

■■■100年のエディタの世界へようこそ(脚注)
今月からEmacsの話を中心にした連載を始めることになりました.本連載は,Emacsを使って最高のエンジニアになりたいと願う読者のために書きます.Emacsやその周辺のツールを使いこなすと,日々使うコンピュータ環境を便利に拡張できます.連載は回ごとのテーマを決めて,Emacsの便利な使い方や設定方法を紹介します.Emacsは環境そのものです.そして,Emacs Lispにより拡張可能な環境です.Emacs Lispを覚えるとEmacsの可能性は更に広がります.残念ながら他のプログラミング言語に比べてEmacs Lispを敬遠する人は多いようです.ひとつの要因が,Emacs Lispのイディオムや簡易なノウハウを紹介する場がないことにあると思います.本連載の中で,Emacsアプリや使い方の紹介と並行して,使われているEmacs Lispの実コードからイディオムやTipsを紹介していこうと考えています.本誌の読者の中には,昔Emacs使っていたけど,最近ごぶさたという人もいるかもしれません.Emacsも進化を続けています.最新バージョンや開発版の動向など,Emacsニュース的な情報も紹介していきます.

(脚注) http://www.aoky.net/articles/steve_yegge/tour_de_babel.htm


■■■ファイル検索
連載第一回の今回はEmacsの標準・非標準の検索機能の紹介をしていきます.

さて,突然余談ですが,筆者のまわりの人間でfindやgrepを端末で実行してから,Emacsでファイルを開いてる人がいます.不思議です.Emacsの検索機能を分かっていれば,そんな2度手間をする必要なんてなくて,Emacsの中で検索してそのままファイルを開く事ができます.そんな人たちは,この記事を読むとちょっとだけ幸せになれると思います.

注意: この記事はemacs23で動作確認をしています.emacs22でも大体の場合は大丈夫だと思いますが,一部の機能は使えないかもしれません.

■■■install-elisp -- EmacsWiki等からelispをインストールする為のプログラム
まず,機能の紹介の前にinstall-elispの紹介をします.
非標準elispのインストールが断然楽になるので入れておきましょう.

■■install-elisp のインストール
install-elisp.elを以下のURLから取得します.
http://www.emacswiki.org/emacs/download/install-elisp.el
保存場所は~/.emacs.d/elispにします.

.emacs.elには以下のように設定しておきます.

======================
(add-to-list 'load-path "~/.emacs.d/elisp")
(require 'install-elisp)
(setq install-elisp-repository-directory "~/.emacs.d/elisp")
======================

これで準備は完了です.

■■install-elisp を使う

ちょっと使ってみましょう.例としてこの記事で紹介しているgrep-editをインストールしてみます.

まず"M-x install-elisp-from-emacswiki"とします.すると以下のようにミニバッファで聞いてくるので"grep-edit.el RET"とします.
======================
Pagename: grep-edit.el
======================

すると"grep-edit.el: Type C-c C-c to install!"という名前のバッファが開きます.中身がそれっぽいバッファになっていたら取得成功です.空のバッファの場合はpagenameが間違っている可能性があります."C-x k"して,もう一度取得しなおしましょう.

問題なさそうなら"C-c C-c"を押してインストールします.
install-elispは.emacs.elの編集はしてくれないので自分で編集します.
======================
(require 'grep-edit)
======================

簡単でしょ?

■■■lgrep,rgrep -- 標準のgrepインターフェイス
基本のgrepから紹介します.
最近(といってもemacs22から)は,grepのユーザーフレンドリなインターフェイスであるlgrep,rgrepが標準で追加されました.

それぞれ
- lgrep: 指定したディレクトリ直下のファイルを検索
- rgrep: 指定したディレクトリ以下を再帰的に検索
となっています.

また,変数case-fold-searchの値で大文字小文字を無視するかを自動で判別してくれます.便利ですね.

さっそく使ってみましょう.

■■lgrepを使う
"M-x lgrep"と入力すると以下のプロンプトが表示され,検索したい文字列を聞いてきます.おもむろに検索したい文字を入れて"RET"を押しましょう.

======================
Search for (default "XXX"): hoge
======================

すると,今度はどんなファイルを検索するかを聞いてきます.*.txtのように入力してあげます.

======================
Search for "hoge" in files (default ch): *.txt
======================

複数種類のファイルを検索する場合は*.txt *.elのようにスペースで区切って入力してあげれば大丈夫です.

======================
Search for "hoge" in files (default ch): *.txt *.el
======================

すると,今度はどこのディレクトリを基準に探すかを聞いてきます.今いる場所が基準でよければ,そのまま"RET"を.そうでなければ,探したい場所を指定して下さい.

======================
In directory: ~/work/emacs-book/
======================

結果は以下のようになります.

======================
-*- mode: grep; default-directory: "~/work/emacs-book/" -*-
Grep started at Fri Mar 20 07:59:09

grep -i -nH -e hoge *.txt
emacs-search.txt:31:Search for (default "XXX"): hoge
emacs-search.txt:38:Search for "hoge" in files (default ch): *.txt
emacs-search.txt:45:Search for "hoge" in files (default ch): *.txt *.el

Grep finished (matches found) at Fri Mar 20 07:59:09
======================

検索結果の行をクリックするか"RET"を押すと,該当行にジャンプします.
*grep*バッファ内で"n","p"を押す事で次・前の結果を確認しながら,移動できます.
また,"M-g M-n","M-g M-p"で,*grep*バッファの外でも次・前の検索結果にジャンプできます.

■■rgrepを使う
使いかたはlgrepとまったく同じです.rgrepではCVSや.svnを標準で除いてくれるので,バージョン管理しているソースを探すときも面倒な事を考えずに探せるのが便利です.

■■lgrep,rgrepのカスタマイズ
ここでは簡単にlgrep,rgrepのカスタマイズ方法を紹介します.

■日本語を自動判別する
通常のgrepでは日本語の自動判別が行なえないのでlvを使って自動判別を行なえるようにします.

lgrepはgrep-templateで,rgrepはgrep-find-templateで実行するコマンドを変更できます.

以下のように設定することで,日本語の自動判別が行なえるようになります.
<C>や<R>などのタグの意味はgrep-template,grep-find-templateのdocstringを参照して下さい.

======================
(setq grep-host-defaults-alist nil) ;; これはおまじないだと思ってください
(setq grep-template "lgrep <C> -n <R> <F> <N>")
(setq grep-find-template "find . <X> -type f <F> -print0 | xargs -0 -e lgrep <C> -n <R> <N>")
======================

Windows環境の場合,上記のままではうまく動きません.以下のように設定する事でこの問題を回避できます.
======================
;; shell-quote-argumentの問題回避
(defvar quote-argument-for-windows-p t "enables `shell-quote-argument' workaround for windows.")
(defadvice shell-quote-argument (around shell-quote-argument-for-win activate)
"workaround for windows."
(if quote-argument-for-windows-p
(let ((argument (ad-get-arg 0)))
(setq argument (replace-regexp-in-string "\\\\" "\\\\" argument nil t))
(setq argument (replace-regexp-in-string "'" "'\\''" argument nil t))
(setq ad-return-value (concat "'" argument "'")))
ad-do-it))

;; lgrep で Shift_JIS を使うように設定
(setq grep-host-defaults-alist nil) ;; これはおまじないだと思ってください
(setq grep-template "lgrep -Ks -Os <C> -n <R> <F> <N>")
(setq grep-find-template "find . <X> -type f <F> -print0 | xargs -0 -e lgrep -Ks -Os <C> -n <R> <N>")
======================

■rgrepで無視するディレクトリを追加する.
grep-find-ignored-directoriesで制御できます.標準で以下に対応しているので,変更する事はそうそうないとは思いますが.

======================
"SCCS", "RCS", "CVS", "MCVS", ".svn", ".git", ".hg",
".bzr", "_MTN", "_darcs", "{arch}"
======================

たとえば.hogeを無視したい場合は以下のようにします.

======================
(require 'grep)
(add-to-list 'grep-find-ignored-directories ".hoge")
======================

■■■grep-edit -- grep の結果を直接編集してファイルに反映させる
grep の結果から複数のファイルをまとめて編集したいと思った事はありませんか?そんなときにはgrep-editを使えは直接編集できるようになります.

■■grep-editのインストール

install-elispを使ってインストールします.

======================
M-x install-elisp-from-emacswiki
Pagename: grep-edit.el
======================

.emacs.elには以下のように書いておきます.

======================
(require 'grep-edit)
======================

■■grep-editでダイレクト編集
さて,おもむろにgrepしましょう."M-x lgrep"です.grepした結果がでてきました.

======================
lgrep -i -n \ほ\げ sample.txt /dev/null
sample.txt:1:ほげほげほげ
sample.txt:2:ほげふがほげ
======================

そうしたら*grep*バッファを編集します.普通に編集です.query-replaceを使うのもいいですね.

======================
lgrep -i -n \ほ\げ sample.txt /dev/null
sample.txt:1:FooFooFoo
sample.txt:2:FooふがFoo
======================

編集したら,"C-c C-e"と入力します.すると,編集した個所が全てのファイルに反映されます.開いていないファイルにもちゃんと反映してくれます.

この状態だとまだ保存をしてないので,あとは"C-x s"してから"!"で全部のバッファを保存してしまいましょう.

■■■find-name-dired -- findコマンドでファイルを探す.
ファイル名は覚えてるけど,どこにあるか忘れた.けどいろいろ前準備するのは面倒だしという時はfind-name-diredが便利です.find-name-diredを使えば,findで検索した結果をdiredで表示してくれます.

端末でfindしてからemacsで開き直すといった事をしないで済むのがいいですね.

"M-x find-name-dired"とすると,まずどこのディレクトリを起点とするかを聞いてきます.
======================
Find-name (directory): /usr/share/emacs/23.0.60
======================

次にファイル名を聞いてきます.rgrepとは違い,複数ファイル名を指定できないのが残念な所です.
Find-name (filename wildcard): *.xbm

すると以下のようにfindした結果がdiredバッファとして表示されます.
======================
/usr/share/emacs/23.0.60/:
find . \( -name \*.xbm \) -exec ls -ld \{\} \;
-rw-r--r-- 1 root root 281 2005-02-13 17:47 etc/images/gnus/gnus-pointer.xbm
-rw-r--r-- 1 root root 47730 2005-02-13 17:47 etc/images/gnus/gnus.xbm
-rw-r--r-- 1 root root 578 2005-02-13 17:47 etc/images/gnus/preview.xbm
======================

■■■locate -- locate のEmacsインターフェイス
homeディレクトリ以下のどこかにあるファイルを見つけたいといった場合にはfind-name-diredよりlocateを使ったほうが便利でしょう.

デフォルトではシステム全体をlocateで探してしまうので,home以下やプロジェクトディレクトリに専用のlocate dbを作って利用します.

■■find-utilsのlocateのインストール
ubuntu等の最近のdistributionに入っているlocateはmlocateです.mlocateだと除外したいディレクトリの指定が困難なので,まずはfind-utilsのlocateをインストールします.

オフィシャルなサイトは以下のURLです.
http://www.gnu.org/software/findutils/

aptで入れる場合はapt-get install locateで入ります.ubuntuの場合,apt-getで入れた直後は
- locate: locate.findutils
- updatedb: updatedb.findutils
となっています.筆者は普段使うlocateはmlocateで構わないので放置していますが,気にくわない場合はupdate-alternativesで変更しましょう.

また,findutilsのupdatedbがシステム全体のlocate dbを作るのが気になる場合は/etc/cron.daily/locateを編集して何もしないようにしてしまいましょう.この辺はdistributionごとに違うと思いますので,それぞれの環境に合わせた修正をして下さい.

Windowsで使用する場合はcygwinを使うのが簡単です.

■■homeディレクトリ以下のlocate dbを作る
次にlocate dbを作ります.筆者は以下のようなスクリプトを使ってlocate dbを作っています.
このスクリプトでは$HOME/locate.dbにlocate dbを作るようにしています.
PRUNESが除外したいディレクトリの指定です.自分の環境に合わせて変えて下さい.
======================
#!/bin/sh

PRUNES="
-name RCS
-o -name CVS
-o -name .svn
-o -name .hg
-o -name .git
-o -name classes
-o -path $HOME/tmp
"

updatedb.findutils \
--findoptions="( -type d ( $PRUNES ) -prune ) -o -type f" \
--localpaths=$HOME --output=$HOME/locate.db
======================

あとはこれをcron等で適当な間隔で実行するようにしておきます.

プロジェクト毎のlocate dbが必要な場合は同じようなスクリプトを各プロジェクトに作っておいて,ビルド時などに作り直すのが良いでしょう.

また,以下のURLにlocateのwrapper scriptの紹介があるのでそれを使うのも良いと思います.
http://dev.ariel-networks.com/Members/matsuyama/use-gnu-locate


■■home ディレクトリ以下をEmacsから探す
やっとEmacsから使える準備が整いました.まず,自分が使いたいlocate dbを指定できるように.emacs.elを設定します.

======================
;; locate dbのファイル名
(defvar locate-db-name "locate.db")
;; locateコマンド
(setq locate-command "/usr/bin/locate.findutils")

;; locateコマンドラインを作る為の共通関数
(defun locate-make-command-line (search-string dbpath &rest opts)
(append
;; 大文字小文字を虫するように設定
(list locate-command "-i")
(when (and dbpath (file-exists-p dbpath))
(list "-d" dbpath))
opts
(list search-string)))

;; home以下のファイルを探す為のlocateコマンドライン
(defun home-locate-make-command-line (search-string &optional &rest opts)
(apply 'locate-make-command-line
search-string
;; home直下の locate.db を使うように指定
(expand-file-name locate-db-name "~")
opts))
;; 標準のlocateでhome以下を探すように設定する.
(setq locate-make-command-line 'home-locate-make-command-line)
======================

locate を使ってファイルを探すには M-x locate とします.

======================
Locate: *.txt
======================

すると以下のようにlocateで探した一覧が表示されます.

======================
/:
Matches for *.txt:

/home/taiki/work/emacs-book/emacs-search.txt
...
======================

■■プロジェクトごとのlocate dbを使って探す
あるプロジェクトのファイルを編集していて,そのプロジェクト中のファイルをlocateで探したい事もありますよね.そんな時向けの設定を紹介します.

まずプロジェクトのルートにlocate dbを作っておいて下さい.
そうしたら以下の設定を.emacs.elに追加します.

======================
;; 指定したファイルを dir を起点に探す為の関数
(defun find-file-upward (name &optional dir)
(setq dir (file-name-as-directory (or dir default-directory)))
(cond
((string= dir (directory-file-name dir))
nil)
((file-exists-p name)
(expand-file-name name dir))
(t
(find-file-upward name (expand-file-name ".." dir)))))

;; プロジェクト毎のlocate dbを使ったlocateコマンドライン
(defun plocate-make-command-line (search-string &optional &rest opts)
(apply 'locate-make-command-line
search-string
(find-file-upward locate-db-name)
opts))

;; プロジェクト毎のlocate dbを使ったlocateコマンド
(defun plocate (search-string &optional arg)
(interactive
(list
(locate-prompt-for-search-string)
current-prefix-arg))
(let ((locate-make-command-line 'plocate-make-command-line))
(locate search-string nil arg)))
======================

プロジェクト以下のディレクトリに移動してM-x plocateとすればそのプロジェクトに関係するファイルだけlocateで探す事ができます.プロジェクト以下の深い階層にいても別の階層のファイルを探してくれるので便利です.

余談になりますが,ここで作ったfind-file-upwardはlocateに限らずある名前のファイルを探すときには汎用で使う事ができます.たとえばjavaで開発していて,antを実行するコマンドを作るならこれを利用して以下のようにすると便利です.

======================
(defvar ant-command-history nil)
(defun ant ()
(interactive)
(let ((build-xml (find-file-upward "build.xml"))
command)
(unless build-xml
(error "cannot found build.xml"))
(setq command (read-string "Ant: "
(concat "ant -f " build-xml " -e ")
'ant-command-history))
(let ((default-directory (file-name-directory build-xml)))
(compile command))))
======================

■■■imenu -- バッファ内での関数ジャンプ
次はimenuの紹介です.imenuを使うとそのバッファ内で定義されている関数や変数に簡単にジャンプする事ができます.imenuの利点は後で紹介するetags等と違って特別な準備が必要ない事です.

さて,使ってみましょう.適当なelisp,C,Java等のソースを開いて"M-x imenu"とします.すると以下のようにミニバッファで聞いてくるので,飛びたい先の関数名を入力します.当然タブでの補完もできます.

======================
Index item: lgrep
======================

飛んだあと元の場所に戻りたい場合はC-u C-SPCです.実はこのC-u C-SPCは何かしてどこかに飛んだあと元の場所に戻ってくるすぐれものコマンドです.一回で戻らない場合は何回か実行すれば大体戻りたい場所に戻ってくれます.この際一緒に覚えてしまいましょう.

■■■etags -- TAGSファイルを使ったソースコードブラウズ
imenuを紹介したところで,次はetagsの紹介です.imenuがカレントバッファを対象とした関数ジャンプなら,etagsはファイルをまたがった関数ジャンプを実現します.

etagsでは最初に外部コマンドを使ってTAGSというインデックスファイルを作る必要があります.

■■Exuberant Ctagsのインストール
TAGSファイルを作る為にExuberant Ctagsをインストールします.Emacs標準で付いてくるetagsコマンドでも問題ないとは思いますが,こっちの方が流行っているようです.長いものには巻かれろです.

オフィシャルは以下のURLです.
http://ctags.sourceforge.net

インストールはオフィシャルページからバイナリを落とすなり,aptで入れるなりお好きにどうぞ.Windows用のバイナリもあります.

■■TAGSファイルの作成
まずはTAGSファイルを作らないとetagsが使えません.

たとえば,emacs付属のelispのTAGSファイルを作るにはshellから以下のようにします.

======================
> cd /usr/share/emacs/23.0.60/lisp
> ctags -e *.el
======================


Java等の複数階層に分かれているソースの場合はfindを使って以下のようにします.

======================
> find . -name "*.java" | xargs ctags -e -L -
======================

TAGSファイルはビルド時等に作り直すようにしてしまうのがよいでしょう.

これでetagsを使う準備が整いました.

■■etagsを使う
etagsの使い方は簡単です."M-."として,探したい関数名やクラス名を入力するだけです.カーソルが探したい関数名の上にある場合は,その関数をデフォルトで探してくれます.

======================
Find tag: find-file
======================

最初に"M-."としたときは,TAGSファイルの名前を聞かれるので,作ったTAGSファイルを入れてあげましょう.

======================
Visit tags table (default TAGS): /usr/share/emacs/23.0.60/lisp/TAGS
======================

そうすると,入力した関数名にジャンプする事ができます.もし同じ名前の関数が複数ある場合は"C-u M-."とすると,次の候補を探してくれます.

元の場所に戻りたい場合は"M-*"を押せば戻ってくれます.

■■■gtags -- gnu-global用のインターフェイス
etags,ctagsに似たツールでgnu-globalというものがあります.対応している言語はJava,C,C++,PHPと少ないですが,その言語で開発しているならばさらに強力なソースブラウズ環境が作成できます.

■■gnu-globalのインストール
オフィシャルサイトのURLは以下になります.
http://www.gnu.org/software/global/

インストールはオフィシャルサイトからバイナリをインストールするなりaptで入れるなりお好きにどうぞ.Windows用のバイナリもあります.

gnu-globalをインストールしたらgtags.elも一緒にインストールしましょう.apt等で入れた場合は勝手にsite-lisp以下に入れてくれると思います.入っていなければ~/.emacs.d/elisp以下あたりに自分で入れてしまいます.

.emacs.elの設定は以下の通りです.

======================
(require 'gtags)
(add-hook 'java-mode-hook (lambda () (gtags-mode 1)))
(add-hook 'c-mode-hook (lambda () (gtags-mode 1)))
(add-hook 'c++-mode-hook (lambda () (gtags-mode 1)))
======================

gtags.elが入ったかは"M-x locate-library"としてからgtags.elと入力してください.入っていれば"Library is file ~/.emacs.d/elisp/gtags.el"のように表示されます.

■■GTAGSファイルの作成
gnu-globalもetagsと同じようにTAGSファイルを作らないといけません.こちらではGTAGSというファイル名になっています.

作るのは簡単.ソースのルートディレクトリで以下のようにgtagsコマンドを実行するだけです.再帰的にサブディレクトリを辿ってGTAGSファイルを作ってくれます.
======================
> gtags
======================

一度GTAGSファイルを作った後は以下のコマンドを利用する事で,高速に更新する事ができます.
======================
> global -u
======================

■■gtagsを使う
使い方はほとんどetagsと同じです."M-."として探したい関数名やクラス名等を入れるだけです.カーソルが探したい関数名の上にある場合は,その関数をデフォルトで探してくれます.
======================
Find tag: (default Comparator)
======================

同じ名前の関数名やクラス名が複数ある場合は,どれを選ぶかを選択する画面が表示されます.
======================
Comparator 723 .../com/sun/org/apache/xpath/internal/objects/XNodeSet.java abstract class Comparator
Comparator 80 .../java/util/Comparator.java public interface Comparator<T> {
======================

gtagsのetagsより強力な点として,その関数やクラスが使用されている個所を一覧で表示する機能があります."M-x gtags-find-rtag"がそのコマンドです.これを使うと以下のように使用れている個所の一覧を表示する事ができます.
======================
Comparator 109 .../java/text/Collator.java implements java.util.Comparator<Object>, Cloneable
Comparator 3307 .../java/util/Collections.java implements Comparator<Comparable<Object>>, Serializable {
...
======================

元の場所に戻りたいときはetagsと同じように"M-*"で戻れます.

■■■anythingと組み合わせる
anythingとはその名の通り,そこからなんでも開いてしまおうというインターフェイスです.これを使うと何かキーワードを入力するだけで,それに関連するリソースを一覧するといった事が可能になります.

今まで紹介してきた,検索用のコマンドはanythingと組合せる事でさらに便利になります.anythingについて書くと,それだけで一つの記事になってしまうので,ここでは簡単に紹介するだけに留めておきます.

■■anythingのインストール
install-elispを使ってanything.el,anything-config.el,anything-match-plugin.elをインストールします.
======================
M-x install-elisp-from-emacswiki
Pagename: anything.el
M-x install-elisp-from-emacswiki
Pagename: anything-config.el
M-x install-elisp-from-emacswiki
Pagename: anything-match-plugin.el
======================

■■anything-etags,anything-gtagsのインストール
etags,gtagsをanythingから使うためにanything-etags,anything-gtagsインストールしておきます.

install-elispを使ってインストールします.
======================
M-x install-elisp-from-emacswiki
Pagename: anything-etags.el
M-x install-elisp-from-emacswiki
Pagename: anything-gtags.el
======================

■■anythingの設定
インストールが終わったのであとは設定です.

まず.emacs.elに以下を書いておきます.
======================
(require 'anything)
(require 'anything-config)
(require 'anything-etags)
(require 'anything-gtags)
======================

これでanythingを使う準備が整いました.後はanythingから何を検索するかを設定します.何を検索するかはanything-sourcesという変数に設定していきます.まずはbuffer,imenu,etags,gtagsだけにしておきましょうか.以下を.emacs.elに追加します.

======================
(setq anything-sources
'(anything-c-source-buffers
anything-c-source-imenu
anything-c-source-etags-select
anything-c-source-gtags-select
))
======================

anythingを起動するキーも一緒に設定してしまいましょう.簡単に押せるキーがおすすめです.switch-to-bufferの代わりにもなるので"C-x b"に設定してしまうのもありですね.

======================
(global-set-key (kbd "C-x b") 'anything)
======================

■■anythingを使う
おもむろに"M-x anything"です.するとバッファの一覧が出てくると思います.
パターンの入力を求められるので,「scratch」等を入力するとその文字で一覧が絞られるのがわかると思います.大体絞り込めたら"C-n","C-p"で対象を選んで"RET"を押せばそのバッファを選択できます.
複数の条件で絞り込みたい場合,スペースで区切る事でAND検索を行なう事も可能です(anything-match-pluginの機能).

次は関数定義に飛んでみましょう.前にTAGSファイルか,GTAGSファイルを作ったソースを開いてM-x anythingとしてみて下さい.そして探したい関数名をここで入力します.

すると今度は,*anything*バッファに入力した関数が表示されます.あとはバッファと同じように,適当に絞り込めたところで対象を選んで"RET"を押せばその関数の定義にジャンプできます.

このように,色々な事への同じ入口の提供,そしてEmacsに分かりやすい選択系のインターフェイスを提供しているのがanythingです.

■■anythingからlocateを使う
今度はanythingからlocateを使ってみましょう.本当は上の方でまとめて書きたかったのですが,設定が少しややこしくなるので,ここに書く事にします.自分の文書記述力の無さに泣けてきます.

まずはhome以下のファイルをanythingから探す設定です.前述のlocateの設定をした上で,以下の.emacs.elに追加しましょう.
======================
(defvar anything-c-source-home-locate
'((name . "Home Locate")
(candidates . (lambda ()
(apply 'start-process "anything-home-locate-process" nil
(home-locate-make-command-line anything-pattern "-r"))))
(type . file)
(requires-pattern . 3)
(delayed)))
======================

プロジェクトごとのファイルをanythingから探すには以下を追加します.
======================
(defvar anything-c-source-plocate
'((name . "Project Locate")
(candidates
. (lambda ()
(let ((default-directory
(with-current-buffer anything-current-buffer
default-directory)))
(apply 'start-process "anything-plocate-process" nil
(plocate-make-command-line anything-pattern "-r")))))
(type . file)
(requires-pattern . 3)
(delayed)))
======================

そうしたらanything-sourcesにこれらのsourceを追加しましょう.home-locateとplocateの両方を追加する事でproject以下で見つからなかったものをhome-locateの方で探す事ができるようになります.
======================
(setq anything-sources
'(anything-c-source-buffers
...
anything-c-source-plocate
anything-c-source-home-locate
))
======================

これでanythingからlocateを使う準備が整いました.あとは"M-x anything"してから,ファイル名にマッチするキーワードを入力すれば,簡単にファイルを探す事ができるようになります.

このようにlocateをanythingから使えると便利なのですが,いくつか不便な点もあります.それは,以下の点です.
- サブプロセスを起動するため,一覧に表示されるのに少し時間がかかる
- スペース区切りでの絞り込みができない(anything-match-pluginとサブプロセスの問題)

これを解決する為にanythingの作者のrubikitchさんが以下のエントリーで「candidates-fileプラグイン」を使った解法を紹介しています.興味のある方は覗いてみて下さい.
http://d.hatena.ne.jp/rubikitch/20090211/1234349678

■■■最後に
今回は駆け足でEmacsな強力な検索機能の一部を紹介しました.Emacsから使える検索用の機能はまだまだあります.namazuやhyperestraierをemacsから使う事もできます.辞書を検索したり,各種マニュアルを引いたり等もできます.EmacsWikiやEmacs電子書棚を探せばまだまだ沢山の検索機能が見つかります.是非自分の好みにあったelispを探してみて下さい.

情報を探すための入口となるURLをちょっとだけ載せておので,参考にしてみて下さい.
- EmacsWiki: http://www.emacswiki.org/
- Emacs電子書棚: http://www.bookshelf.jp/
- Anything: http://www.emacswiki.org/cgi-bin/wiki/Anything


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.