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'
これで、どのホスト名のサーバで何を実行しているのかが一目瞭然です。