読者です 読者をやめる 読者になる 読者になる

screenのウィンドウタイトルをいい感じに自動変更する方法のメモ

GNU Screenでウィンドウタイトルを

に自動変更し、非アクティブウィンドウでコマンドが終了した際にハイライトさせる方法のメモ。

ここでは、次のようにscreenrcに書いておくことで、常に各ウィンドウのタイトルが表示されている状態を想定する。

hardstatus alwayslastline "%{=r dd}%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"

また、シェルとしてbashを想定する。

Dynamic Titlesを使う

screenでは、適当なオプションとシェルのプロンプト文字列(PS1)を設定することで

  • 普段はシェル名などの固定文字列
  • コマンド実行中はコマンド名

をタイトルに自動設定することができる。

具体的には、screenrcに次のようなコマンドを書いておく。

shelltitle "$ |bash"

|より前はプロンプト文字列の末尾、後ろはデフォルト文字列を意味する。

次に、シェルの設定ファイル(bashrc等)でプロンプト文字列を次のような感じに設定する。

PS1='\u@\h:\w\[\033k\033\134\]\$ '

\033k\033\134の部分がscreenで空のタイトル文字列を設定するシーケンスになっており、screenはこれをシグナルとしてプロンプト文字列の終端とコマンド名を判別する。 また、\[...\]は囲まれた文字列を表示上の文字数としてカウントしないことを意味する。

標準でカレントディレクトリのディレクトリ名を使う

上の方法である程度自動変更できるが、普段のウィンドウタイトルがすべてbash等の固定文字列となるため、いまいち区別が付けづらい。 そこで、デフォルト文字列をディレクトリ名に変えることを考える。 これを行うには、空のタイトル文字列を設定した直後に適当なタイトル文字列で上書きすればよい。

PS1='\u@\h:\w\[\033k\033\134\033k\W\033\134\]\$ '

\Wはカレントディレクトリのディレクトリ名を表す。

SSHしているウィンドウのタイトルをリモートホスト名にする

さらに、リモートサーバにSSHログインしているウィンドウのタイトルをそのホストのホスト名に変えることを考える。 これを行うには、環境変数STYの有無で分岐させればよい。

case "$TERM" in
     screen*)
         if [[ -z "$STY" ]]; then
             # if the shell is on the remote server, display hostname
             __set_screen_title='\[\033k[\h]\033\134\]'
         else
             # otherwise, display command name or directory name
             __set_screen_title='\[\033k\033\134\033k\W\033\134\]'
         fi
         ;;
esac

PS1="\u@\h:\w\${__set_screen_title}\\$ "

こうすることで、(自分のbashrcが使える)リモートサーバにログインしているウィンドウのタイトルを[hostname]のように変えることができる。

非アクティブウィンドウでコマンドが終了したときに通知する

非アクティブウィンドウで時間のかかるコマンドを実行している際、終了時にそれを通知させることを考える。 これを行うには、プロンプト文字列にベル文字を含めればよい。

PS1="\[\a\]\u@\h:\w\${__set_screen_title}\\$ "

このようにすることで、コマンド終了時にそのウィンドウのタイトルをハイライト表示させることができる。

完成図

すべて設定すると、次の図のようになる。

f:id:inaz2:20170114001215p:plain

0はSSH中のリモートサーバ、1はtopコマンド実行中、2はコマンド終了直後のホームディレクトリ、3は/tmpディレクトリである。