screenのステータスバーを実行したコマンド名にする。

昨日最後に書いてた
screenのステータスラインでウィンドウ毎に実行されている(された)
プログラム名を表示する方法を紹介します。
実行すると↓の様になります。

[23:46] 0 vi  1 mongrel_rails  2 top 3 tail  4 autotest

tail でログを流しつつmongrel_rails 起動したり、topでプロセスの動作確認しつつ
viでプログラム弄るとやってるんですが、windowを切り替える時にどのウインドウで
どの作業してたかわからなくなるので、こんなことしてみました。


あまり切り替えで役に立ったことないけど、
top実行したいけど、top用のウインドウ起動してないから^t cで作成してtopとかには
使えます。


というわけで必要な設定。
まず~/.screenrcから

hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"

要はウインドウ名出してくれれば良いだけです。


で、.zshrc

preexec () {
    if [ $TERM = "screen" ]; then
        1="$1 " # deprecated.
        echo -ne "\ek${${(s: :)1}[0]}\e\\"
    fi
  }

TERMがscreenの時、コマンド名の1個目を引き渡してます。


実際の自分の端末は、コマンドの実行のたびにプロンプトに時間を表示してます。

preexec () {
    PROMPT='%D %T %(!.#.$) '
    RPROMPT='[%~]'
    if [ $TERM = "screen" ]; then
        1="$1 " # deprecated.
        echo -ne "\ek${${(s: :)1}[0]}\e\\"
    fi
  }

なので、プロンプトがこんな感じになってる。

08-01-17 12:03 $ 

実は、時間がリアルタイムで表示されるわけじゃないんですが、
プロンプトのログをputtyでとってるので、
後で時間確認するのに便利なんですよね。