isatty

grep なんかは grep --color=auto とかしておくと、端末に出す時は色を出す、というような処理をしてくれて、これに割と慣れてると色がついて欲しい時に色がついてないと割と腹が立ったりするわけです。例えば下記のような状況で色が出ないのが腹立たしい。

grep hoge *.c | lv -c              # lv -c は色ついてても大丈夫なのに!
grep hoge *.c | w3m                # w3m も色ついてても大丈夫なのに!
grep hoge *.c | grep hige          # 最終出力はどうせ端末じゃん!
grep hoge *.c | grep hige | lv -c  # 最終出力は色ついてても大丈夫だから!

後者2つの方はこう、色々頑張ってみたのですが色々難しかったのでした。一番最後のはまだ最後が lv かどうかとか調べればいいのでなんとかなるんですが、最後から2番目のヤツは、なんか知らんけど /proc/<最後の grep の pid>/fd/1 を見ても、どうもたいてい pipe:[...] とかになっていて、どうも出力先が pipe なんだか file なんだか tty なんだか識別できない感じで。

仮にうまくいったとしても grep hoge *.c | grep hogehige とかで何も出力されない (hoge の後に色コード入っちゃう) とか、イヤなレアケースも考えられたりして、いかんともしがたいなこれと。

まぁとりあえず lv に通す時だけなんとかできればいいか…と諦めつつあるのが今の状況で、とりあえず現状のコードがこんな感じ。同じ process group に lv か w3m があったら isatty が強制的に 1 をかえす、というような。環境にあわせて color_ok_programs をいじってください。

http://shinh.skr.jp/tmp/fake_isatty.c

% gcc -shared -o fake_isatty.so fake_isatty.c -ldl -fPIC

とかして作って、 grep の alias に LD_PRELOAD=/correct_path/fake_isatty.so などとして。あと GREP_COLORS=ne とかしといた方がいいかと思います。

もう一つの問題は wtools で bold にするだけじゃなくて、色つけたいな…というものがあるんだけど、 w3m に html で色を渡すのはこれがまた…

とりあえず wtools 上げなおしておきました。 GREP_COLOR=ne の場合も強調表示されるようにしたってのと、 wgrep でファイル一個が対象の時もちゃんとリンクはってくれるようにした、ってのあたりが違いだと思います。

http://shinh.skr.jp/koneta/wtools.tgz

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