screenのhardstatus設定と.zshrc

MacのTerminalでscreenを使ってる。ステータスラインは邪魔だから要らないと思っていたけど、さすがにwindowの数が多くなってくると把握できないし自分がどこを開いているのかもよく分からなくなってきたので、表示させることにした。
表示させるだけの設定は、.screenrcに

hardstatus on

だけでOK。常時最下行に表示させる場合は

hardstatus alwayslastline [string]

とかで、[string]に表示させる内容を指定できる。
ここに指定できる特殊文字列については"man screen"すれば載っているので頑張って読む。
読みたくなくて検索するとよくヒットするのが下記の設定。
- unknownplace.org
中身についてはここで解説されていたり。
hardstatusを解読 - urekatのスカンク日記3
自分はこれに倣って

hardstatus alwayslastline "%-w%{= ck}%n %t%{-}%+w"

と設定した。
"%w"でウィンドウ番号とウィンドウ名を表示させられるけど、現在選択しているウィンドウだけ違う表示をするために"%-w"と"%+w"に分けて、カレントウィンドウは"%n %t"(number, title)で表示。カレントの部分だけ色を変更するように"%{= ck}"でシアン背景、黒文字表示。


で、%tで表示されるwindow titleは、何もしない状態だと普通シェル名(zsh使っていれば"zsh")が表示される。これは"\ek"と"\e\\"で挟んだ文字列で指定することができるらしい(よくわかってない)。

echo -ne "\ekhoge\e\\"

といったものを.zshrcのpreexec()内で使うことで実行中のコマンド名に設定することができる。
http://ogawa.s18.xrea.com/tdiary/20080331.html#p02
実行終了後も同じものが表示され続けるのがイヤだったので今度はprecmd()で元に戻す。
しかしprecmd()内でechoを使われるとscreenじゃないときにもコマンド実行ごとに表示されてしまう。
ので$TERM値によってprecmd()を使い分ける。

setopt prompt_subst
RPROMPT='%{${fg[green]}%}%/%{$reset_color%}'
common_precmd() {
    LANG=en_US.UTF-8 vcs_info
    LOADAVG=$(sysctl -n vm.loadavg | perl -anpe '$_=$F[1]')
    PROMPT='${vcs_info_msg_0_}%{${fg[yellow]}%}%* ($LOADAVG) %%%{$reset_color%} '
}
case $TERM in
    screen)
        preexec() {
            echo -ne "\ek$1\e\\"
        }
        precmd() {
            echo -ne "\ek$(basename $SHELL)\e\\"
            common_precmd
        }
        ;;
    *)
        precmd() {
            common_precmd
        }
        ;;
esac

これで一応自分のやりたい表示にはなった。



それにしても.screenrcとか.zshrcとかで指定する文字列は覚えられん。。