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とかで指定する文字列は覚えられん。。