zshでホストごとに色を変える

This entry was posted by on Monday, 22 October, 2007

いろいろあってこのところzshに関係することをあれこれやっていたりしてたんですが、やってるうちに思いついたことがありまして。

わたしはzshのRPROMPT(プロンプトの右端に出てくる文字)にユーザ名とホスト名を入れるという設定をしています。で、ユーザ名は通常は黄色なんだけど、suしたりsudo -sしたりしたときには赤くなる、という設定にしている。これはなかなか目立ってよろしいわけです。

でもまあ、昔はそうでもなかったんだが近頃じゃ滅多にsudo -sもしないし。そうすると色が変わることのメリットがあんまないんですわ。まああんまりなくてもやっておく意味はあるんですけど、この「色が変わる」というのはほかに活かせるんではないかと唐突に思いまして。たとえば、いろんなホストで作業するときにはマシンごとに色が変わると視認性が上がるんではないかと。

でまあどうしようかな、とちょっと思っていろいろ試してみたのが次の設定です。

set_rprompt() { local host_colors md5cmd host_color user_color host_colors=(red green yellow blue magenta cyan white) md5cmd=md5 host_color=$host_colors[$(( 0x`echo -n $HOST | $md5cmd | sed -e 's/\\(.\{8\}\\).*/\1/'` % 7))] if [ `whoami` = root ]; then user_color="%{$fg_bold[red]%}%n" else user_color="%{$fg[yellow]%}" fi RPROMPT="$user_color%n%{$reset_color%}@%{$fg[$host_color]%}%m%{$reset_color%}" } set_rprompt

やってることとしては、ホスト名からMD5値を取り、とりあえず上位8ビットを取り出して数値演算で0〜6の値をつくる。色はred、green、yellow、blue、magenta、cyan、whiteという7色を用意しておいて、0〜6の値に応じて色を選び出す。あとは$fgのキーに色名を渡すという次第。ハッシュの扱いとかは適当ですがどうせ7種類のバリエーションしかないんでこれでいいか、と割り切っています。

シェル関数を使ってるのは、関数内localを使うことで対話環境の名前空間を汚さないようにという配慮です。

ああ、Linux環境ではmd5cmd=md5のところをmd5sumとかにすればいいと思います。たぶん。その辺の条件分岐は面倒くさくなったのでやめました。わたしは異なるOS環境で同じzshrcを共有したりしないと思うので。そうでない人は環境に応じて条件分岐させるといいでしょう。

てことで自ら実験台として、しばらく試してみます。でも、基本的にはわりといいアイディアではないかという気がしますね。10分くらいで書いたので、もっとエレガントに実現する方法もあると思いますが。

Comments are closed.