ホームディレクトリ内でupdatedb/locate
ホームディレクトリ内限定でupdatedb/locateしてみる。Emacs内でlocate経由でファイルを開くとき、圧倒的にホームディレクトリ内が多いと思う。その上、俺の場合ホームディレクトリ内のファイルはシステム全体の1/13に過ぎない。
$ locate -S Database /var/cache/locate/locatedb is in the LOCATE02 format. Locate database size: 8856843 bytes Filenames: 837600 with a cumulative length of 49906902 bytes of which 4770 contain whitespace, 1 contain newline characters, and 2416 contain characters with the high bit set. Compression ratio 82.25% $ locate -S -d /log/home.locatedb Database /log/home.locatedb is in the LOCATE02 format. Locate database size: 625986 bytes Filenames: 61011 with a cumulative length of 3431545 bytes of which 191 contain whitespace, 1 contain newline characters, and 314 contain characters with the high bit set. Compression ratio 81.76%
そこまで差がある以上、ホームディレクトリ内限定でlocatedbを作るのは意味があることに思える。
locatedbに入れる必要のないディレクトリはRCS/, _darcs/, .svn/, coverage/*1, .rdoc/, archive/。updatedbは内部で実行するfindコマンドのオプションを受け付ける。俺はよく find dir | grep -v exclude で除外しているが、その手は使えない。findコマンドで除外するディレクトリを指定するオプションは -name exclude_dir -prune で、複数あるときはそれらを -o でつなぐ。
長くなるが、直書きすると追加が大変になるのでrubyのお世話になることに。
locate_prunes=`ruby -e 'puts ARGV.map{|x| " -name #{x} -prune "}.join("-o")' RCS _darcs .svn CVS coverage .rdoc archive` updatedb --output=/log/home.locatedb --localpaths=$HOME --findoptions="$locate_prunes"
anythingとの連携
http://www.emacswiki.org/cgi-bin/wiki/Anything
anything.elを使うとlocateからもファイルを開くことができる。anything-config.elでlocateから開く設定 anything-source-locate が入っているが、それはシステム全体から探索するため、時間も負荷もかかる。そこでホームディレクトリ限定版を作成。
(defvar locate-home-database "/log/home.locatedb") (defvar anything-source-locate-home '((name . "Locate") (candidates . (lambda () (start-process "locate-process" nil "locate" "-d" locate-home-database "-i" "-r" "--" anything-pattern))) (type . file) (requires-pattern . 3) (delayed)) "Source for retrieving files in home directory matching the current input pattern with locate.")
俺はこんな設定にしている。iswitchbでバッファにないファイルを開くとき、すぐさまC-x C-fできるが、anythingを使うと「あら、ないわ」と思ってる間にすでにlocateが見付けてくれるという寸法。anything便利便利!
(setq anything-sources (list anything-source-buffers anything-source-file-cache anything-source-bookmarks anything-source-file-name-history anything-source-locate-home anything-source-complex-command-history)) (setq anything-type-actions (list anything-actions-buffer anything-actions-file anything-actions-sexp))