GNU locate を有効活用する
GNU findutils に入ってる locate/updatedb は本来にシステム管理用のソフトウェアですが、いつくかのオプションを与えることで、特定のディレクトリのみを検索対象にすることができ、 Emacs などのバックエンドとしても利用しやすくなります。今回は GNU locate を有効活用して、 Emacs で階層の深いファイルを簡単に開く方法を紹介します。
GNU findutils のインストール
http://www.gnu.org/software/findutils/
上の URL からソースコードをダウンロードしてきて以下のようにインストールします。 Gentoo を使っている場合でもソースコードからインストールする必要があります(セキュリティ上の問題から findutils の locate/updatedb はインストールされないようになっている)。
% tar xvzf findutils-4.3.8 % cd findutils-4.3.8 % ./configure && make && make install % /usr/local/bin/locate --version GNU locate version 4.3.8 Built using GNU gnulib version 2007-05-26
ラッパースクリプトの作成
locate や updatedb するたびにオプションでデータベースファイルのパスを指定したりするのは面倒なので簡単なラッパースクリプトを作って、オプションの入力を極力減らします。
このエントリに添付してある locate と updatedb をダウンロードしてきて以下のようにインストールします。
% mkdir ~/bin % cd ~/bin % cp ~/downloads/locate ~/downloads/updatedb . % chmod +x locate updatedb % echo 'export PATH="$HOME/bin:$PATH"' >> ~/.profile % source ~/.profile
PATH 環境変数の先頭に ~/bin を追加することによってラッパースクリプトを透過的に実行できるようにしています。ちゃんとパスが通っているかは以下のように確認します。
% which locate /home/tomo/bin/locate
/usr/local/bin/locate のままなら正しくパスが通っていないので設定を再確認してください。
updatedb ラッパースクリプト
updatedb ラッパースクリプトはカレントディレクトリを検索対象としてデータベースを作成します。
% cd ~/music % updatedb % file PATH # データベースファイル PATH: GNU findutils locate database data, format 02 (frcode)
GNU updatedb は --findoptions を使うことによって特定のディレクトリをデータベースから除外したりすることができます。
% updatedb --findoptions='-name tmp -prune' # tmp ディレクトリを除外
また updatedb ラッパースクリプトは ~/.updatedbrc から --findoptions を自動的に補完することができます。それをするには ~/.updatedbrc に、データベースファイルのパスの次の行に --findoptions の内容、という形式で記述していきます。
~/.updatedbrc:
/home/tomo/music/PATH -name tmp -prune /home/tomo/PATH -name tmp -prune -o -name .svn -prune
このようにすることで updatedb するたびに --findoptions を入力する必要がなくなります。
locate ラッパースクリプト
locate ラッパースクリプトはカレントディレクトリから上にむかって PATH ファイルを検索し、 PATH ファイルが見つかったディレクトリを検索対象にして locate を実行します。
% cd ~/ % ls PATH music/PATH PATH music/PATH % locate hoge # ホームディレクトリを検索対象にして locate % cd tmp % locate hoge # ホームディレクトリを検索対象にして locate % cd ../music % locate hoge # music ディレクトリを検索対象にして locate % locate -g hoge # 本来の locate をそのまま呼び出す
Emacs から使う
以下のようにデータベースファイルを作っておきます。
% cd ~/src/javaproj % updatedb
~/.updatedb:
/home/tomo/src/javaproj/PATH -name .svn -prune -o name classes -prune -o ! ( -name .svn -o -name "*.class" )
Emacs デ locate を実行する際は、 find-file や dired で ~/src/javarpoj 以下の適当なファイルやディレクトリを開いておきます。これにより locate ラッパースクリプトは、そのバッファのカレントディレクトリからデータベースファイルの検索を開始します。
locate コマンドを使う
以下の設定を ~/.emacs に書いておきます。
~/.emacs:
(eval-after-load "locate" '(progn (defadvice locate (before locate-buffer-cd activate) (setq locate-directory default-directory)) (add-hook 'locate-mode-hook (lambda () (cd locate-directory)))))
後は通常通り M-x locate で検索できます。
globalff を使う
globalff は locate を使ってグローバルに find-file するパッケージです。 locate コマンドに似ていますが、 globalff は検索結果をインテラクティブに絞りこめるのでこちらのほうが多少使いやすいです。
http://emacswiki.org/cgi-bin/wiki/globalff.el
上の URL から globalff をインストールしてください。そして以下の設定を ~/.emacs に書きます。
~/.emacs:
(if (require 'globalff nil t) (defadvice globalff (before globalff-buffer-cd activate) (let ((buffer (get-buffer globalff-buffer)) (dir default-directory)) (if buffer (with-current-buffer buffer (cd dir))))))
後は M-x globalff で検索できます。以下のようにキーバインドしておくと便利かもしれません。
~/.emacs:
(global-set-key "\C-x\M-f" 'globalff)
anything を使う
antyhing の anything-c-source-locate ソースから使う事も可能です。
以下の設定を ~/.emacs に書きます。
~/.emacs:
(require 'anything-config) (defadvice anything-initialize (after anything-buffer-cd activate) (let ((dir default-directory)) (with-current-buffer (get-buffer anything-buffer) (cd dir)))) (setq anything-sources (list ... anything-c-source-locate ...))
後は M-x anything で検索できます。
最後に
以上のように特定のディレクトリを検索対象にすることで、高速に locate できる上、不必要なファイルが表示されないので、ソフトウェアの開発などにはかなり力を発揮すると思います(僕は毎日使ってます)。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/use-gnu-locate/tbping