grep はえええええええ
ということに気付きました。前から速い速いとは思ってたんですが、実際すんごく速いですよ grep 。手元だと自分の SVN レポジトリ全部 + /usr/include + /usr/local/include + /usr/i586-mingw32msvc/include の 250MB 程度の grep が 2 秒もあれば終わる。インデックスとかいらん。 Let's 富豪。
まず私の場合、 /data/trunk の下に SVN リポジトリを checkout しました。んで cron で 1時間おきに update 。で書いたのが grepa:
#!/bin/sh DIRS=/data/trunk case $3 in '*.rb') DIRS="$DIRS /usr/lib/ruby /usr/local/lib/ruby" ;; '*.py') DIRS="$DIRS /usr/lib/python2.4 /usr/local/lib/python2.4" ;; '*.pl') DIRS="$DIRS /usr/lib/perl5" ;; *) DIRS="$DIRS /usr/include /usr/local/include /usr/i586-mingw32msvc/include" ;; esac echo TARGET: $DIRS /bin/grep --color=auto -n -I -r --exclude '*.svn*' "$@" $DIRS
case 文は --include '*.rb' とかに対応して見るディレクトリ変える工夫です。んで例のごとく w3m でリンクとかはるラッパ。
#!/usr/bin/ruby $:.push("#{ENV['HOME']}/bin") require '__wraputil' w3m_wrap_each('grepa', ['--color=always', *ARGV]) do |line| w3m_grep(w3m_color(line)) end
w3m_color とか w3m_grep とかは __wraputil にまとめた。
def w3m_color(line) line.gsub!(/\x1b\[01;31m(\x1b.*?)\x1b/, "<b>\\1</b>\x1b") line.gsub!(/\x1b\[(\d*;?\d*m|K)/, '') line end def w3m_grep(line) line.sub(/^([^:]+):(\d+)/,'<a href="\1#\2">\&</a>') end
要は色つきオプションで吐いておいて、赤いところはマッチした文字列なので <b> で囲む、と。
あとは適当に alias はりまくる。
alias wgah='wga --include "*.h"' alias wgac='wga --include "*.h" --include "*.c" --include "*.cc" --include "*.hh" --include "*.cpp" --include "*.hpp"' alias wgarb='wga --include "*.rb"' alias wgapy='wga --include "*.py"' alias wgapl='wga --include "*.pl"'
実際のファイルはこんなかんじ。
http://shinh.skr.jp/koneta/wtools.tgz
次はドキュメントも grep できる態勢を整えると良いと思う。