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 できる態勢を整えると良いと思う。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h