zsh始めてみる

まずはプロンプトの設定から。
漢のzsh (2) 取りあえず、プロンプトを整えておく。カッコつけたいからね | マイナビニュース
Introduction of the ZSH

  • RPROMPTを設定すると右側に文字列を表示できる。入力がぶつかれば勝手に消える。
  • PROMPTの設定に使う '^[' はエスケープ文字。viではCtrl-v ESCで入力する。
    • 表示可能な文字で扱いたい場合は、$'...' とクォートしてる中で \e と入力すれば同じことができるらしい。
  • \e[色番号m でプロンプトの色を変えて、 \e[m で元の色に戻すとか。意味分からん。
    • 色番号は30〜37あたり。ググれば出てくる
  • %{ … %} という記法でエスケープシーケンスを括る。らしい。

とりあえず右側に緑色でカレントディレクトリを表示させてみた。

RPROMPT=$'%{\e[32m%}%/%{\e[m%}'

左側は特に表示させておきたい情報も無いしなー。
(長さが変わるのはイヤだったのでカレントディレクトリは右側にしてる)
色だけ変えて"zsh" とだけ表示させておいてみよう

PROMPT=$'%{\e[36m%}zsh %%%{\e[m%} '
RPROMPT=$'%{\e[32m%}%/%{\e[m%}'


こんなカンジで。

zshのhistoryうんぬん

zshの魅力として、history機能の強さがよく語られる。

制御構文の履歴

$ for i in 1 2 3
> do
> echo $i
> done
1
2
3
<↑でhistoryを遡る>
$ for i in 1 2 3; do echo $i; done
% for i in 1 2 3
for> do
for> echo $i
for> done
1
2
3
<↑でhistoryを遡る>
% for i in 1 2 3
do
echo $i
done

bashでは複数行に分けて書いたものが1行にまとめられてhistoryに格納されてしまうが、zshでは入力した形がそのまま再現される、ということらしい。
編集しやすくなるので、このような書き方をしてちょっとずつ編集する、という方法は便利かもしれない。
最初から1行にまとめて書いてしまっていたらあまり意味はなさそう…。

履歴の共有

HISTFILE=~/.zsh_history    # 履歴データを保存するファイルを指定
setopt share_history       # コマンド履歴ファイルを共有する設定

これを指定しておけば、別々の所で開いたzsh同士で履歴が共有できるようになるらしい。
bashでも頑張って設定すればできないことはないらしいけど。
iandeth. - bashにて複数端末間でコマンド履歴(history)を共有する方法

履歴の検索など

KeyRemap4MacBookを入れているからか、

% bindkey -L

で表示されるものの通りに動いていないようだ。
^R で history-incremental-search-backward はできるのに、
^S で history-incremental-search-forward はできない
とか。
^Xsは効くので前方検索はこれを使えばできる…が、押しづらい。
^P と ^N は上下キーの代わりとして手放したくないしなぁ。どうしよう。
今のところは履歴検索でそれほど困ることもなさそうだし、とりあえず放置しておこう。
何か困ってきたら対処を考える。

プロンプトでシステムの平均負荷を表示する

http://d.hatena.ne.jp/sugyan/20090317/1237258555にコメントをいただいたので、変更してみた。
uptime コマンドから、システムの平均負荷状態を得ることができるらしい。

The uptime utility displays the current time, the length of time the system has been up, the number of users, and the load average of the system over the last 1, 5, and 15 minutes.

ということで.zshrcを以下のようにしてみた。
(※追記した。これはひどい)

precmd () {
  PROMPT=$'%{\e[36m%}%* ('$(uptime | awk '{ print $8 }')$') %%%{\e[m%} '
}
RPROMPT=$'%{\e[32m%}%/%{\e[m%}'

Perlでもよかったけど、なんとなくここはawkで。
現在の時間と、最近1分間での平均負荷を括弧で表示する。

追記

かなりの表記依存があってマズいので修正する。
上記のものだと起動後の経過時間によって表記が変わるらしく、1日を超えてたりするとスペースの数が変わってしまう。
正規表現使って解析してもいいんだけど、とりあえず別の方法で。たぶんMac専用。

precmd () {
  PROMPT=$'%{\e[36m%}%* ('$(sysctl -n vm.loadavg | perl -anpe '$_=$F[1]')$') %%%{\e[m%} '
}
RPROMPT=$'%{\e[32m%}%/%{\e[m%}'

Linuxだったら/proc/loadavg なんかを読むといいらしい。