zsh でウィンドウ名に ホスト名とコマンド名を表示する

iterm2 で複数のタブを使っていたり、tmuxやscreenで複数のウインドウを開いていると、どの端末がどのホストにログインしているのか、何を実行中なのかといった情報が欲しくなります。
どうせなら各ウインドウにフォーカスを移さなくてもわかると便利ですよね。

そこで今回は、各ウィンドウ名に「ホスト名:実行中のコマンド名」というフォーマットで表示させることにします。

zshには preexec() と precmd()という組み込み関数があります。

preexec() コマンドを実行直前に呼び出される
precmd() プロンプトを表示直前に呼び出される

ここら辺の組み込み関数については、zshmisc(1) に記載されています。

preexec()でコマンド名を設定し、precmd() でコマンド名を消去すれば良さそうですね。

ホスト名は hostname コマンドを使って取得したものからホスト名部分を抽出します。

実行コマンドは$1 に入っています。ただし実際に実行コマンドのすべてを表示するのは冗長なので、実行コマンド名のみにして引数は表示しないようにしましょう。

早速設定例です。

preexec() {
    mycmd=(${(s: :)${1}})
    echo -ne "\ek$(hostname|awk 'BEGIN{FS="."}{print $1}'):$mycmd[1]\e\\"
}

precmd() {
    echo -ne "\ek$(hostname|awk 'BEGIN{FS="."}{print $1}'):idle\e\\"
}

ついでに、tmux のステータス欄でもウインドウ名を表示するようにしておきます。

set -g set-titles on
set -g set-titles-string '#W'

これで、どのホスト名のサーバで何を実行しているのかが一目瞭然です。

f:id:yizawa:20120918170929j:plain