screen の見た目を変えた

コマンド実行中の場合はコマンド名を表示し,それ以外はカレントディレクトリ名を表示したかったのでいろいろ調べて .zshrc をいじってみました。

.zshrc

if [ "$TERM" = "screen" ]; then
    local -a shorthost

    echo $TERMCAP | grep -q -i screen
    if [ $? -eq 0 ]; then
        shorthost=""
    else
        shorthost="${HOST%%.*}:"
    fi

    echo -ne "\ek$shorthost\e\\"

    preexec() {
        echo -ne "\ek${shorthost}($1)\e\\"
        echo -ne "\e_`dirs`\e\\"
    }

    precmd() {
        echo -ne "\ek${shorthost}$(basename $(pwd))\e\\"
    }
fi
参考にしたところ
screenのキャプションにディレクトリ名 or コマンド名を表示 - メモの日々 (2008-03-31)
  • \eエスケープ文字を表現できるのかー
    • 環境によっては出ないかもなので -e オプションを明示的に指定してる
  • $(basename $(pwd)) の部分がいまいち好みじゃないけどいい案が思いつかない
    • 基本フルパスかホームからの相対パスで,長くなると ... ってプレフィックスがつくようにしたいんですが。zshexpn 勉強すればなんとかなるかなぁ。
  • `dirs` も時として冗長になる
  • $TERMCAPgrep してるところは,screen を起動したホストの場合はホスト名をつけずに,そうでない場合はホスト名をつけるため
  • ${HOST%%.*} ってところは zshexpn 参照
    • ざっくりいうと,.* の部分は shell glob pattern で考える
    • %% は末尾からの longest match でマッチしている部分を削除する
    • つまり結果的に $HOST の「.」以下を削除した結果になる
  • 元ネタとかたいてい実行中のコマンド自身をパラメータなしで表示するようにしてるけど,コマンド全体を表示するようにした

.screenrc

もともとどっかからのコピペで

hardstatus ignore "#%n %t | %h"

caption always "[%c] %`%-w%{=b bw}%n %t%{-}%+w"

ってしてたんですが,やっぱり時計はいらないなということで削除。backtick コマンド使ってないくせに %` とか残ってるし。

で先ほどの screenのキャプションにディレクトリ名 or コマンド名を表示 - メモの日々 (2008-03-31) を見たらちょっとかっこよかったんで caption の部分だけ参考にしてみました。

caption always "%?%F%{= kw}%:%{= wK}%?%-w%?%F%{=b bW}%:%{= Wk}%?%n %t%{-}%+w"

% だらけでめまいがしますけど,%?%:%?三項演算子のように働くと考えればそう難しくなかったです。解説を書こうと思ったんですが,元記事であげられている caption について - アキレス亀日記 - 2004/06a Diary がひっじょーにわかりやすかったのでそちらをご参照ください。

元記事だとフォーカスされてないペインのインアクティブなタブを見えないようにしてたんですが,そのへんは見えるようにしています。色も変更。むかし設定していた内容よりかなり好ましいものになりました。バーの色が純黒じゃないのが結果的に好み。

設定結果

いつもはウィンドウ分割なんて使ってないんですけど。

おまけ(screen のエスケープキー)

screen のエスケープキーはやっぱり CTRL+\ にしました。ホームポジションから遠いけど,逆にミスタッチしないですし。

なんで .screenrc

escape ^\\\

として,

From: [148] 名無しさん@お腹いっぱい。 
Date: 03/05/09 23:25

>>146
自分も ^\\\  に変えた頃は、 screen を使っていない窓で時々 foreground の
プロセスを殺してしまうので、stty でこの機能を使わないようにした。
必要あれば kill でシグナル送ればいいしね
http://www.dekaino.net/screen/screen-thread2.txt

を参考に

stty quit undef

としました。zsh ならこれしなくても経験上大丈夫ぽいんですけど。