shtaxxx日記

コンピュータアーキテクチャについて研究している研究者の日記や技術紹介

screenのステータスバー(hardstatus)のウィンドウ名を自動で現在実行中のコマンド名に設定する (bashの場合)

仮想ウィンドウシステムscreenではhardstatusの設定をすることで,こんな感じに現在のウィンドウ一覧を画面下方に表示することができます.

ウィンドウ名はデフォルトではシェルの名前(bash使いの僕の場合はbash)となっています.
コマンドを実行することで手動で設定することも可能ですが,いちいち変更するのは面倒なので,現在実行中のコマンドの名前に自動で変更されるようにします.

.screenrc

僕の.screenrcはこれだけです.短い.あまりうまく使いこなせていないと思います.
エスケープキーはzに変更してあります.

startup_message off

shelltitle "$ |bash"
hardstatus alwayslastline "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %Y %m/%d %C%a "
hardstatus off

escape ^z^z

termcap * 'G0:S0=\E(%.:E0=\E(B:TY=iso2022'
autodetach on
defflow off
crlf off
vbell off
vbell_msg "Bell"

defutf8 on
defkanji utf-8
encoding utf-8 utf-8
defencoding utf-8

bind o focus
bind k kill
bind s split

screen 0
screen 1

ウィンドウ一覧などを画面下方に表示させるには"hardstatus alwayslastline"と"hardstatus off"の行を追加します.

僕の環境(MacOS X 10.8 Mountain LionおよびUbuntu Server 12.04)では"hardstatus off"を追加しておかないと,screen起動時にステータスバーが表示されないため,こうなっています.

シェルがbashの場合にウィンドウ名を現在実行中のコマンドに自動的に変更するためには"shelltitle "$ |bash""を追加します.
この"bash"の部分は好きな文字列が利用できます.

このときの注意点は,初期ウィンドウ設定の.screenrc下方の"screen 0"および"screen 1"の記述は"shelltitle "$ |bash""よりも後に記述する必要があるということです.先に書いてしまうとウィンドウ名が"bash"で上書きされてしまい,自動で変更されなくなります.

.bashrc

.bashrcでPS1の設定をします.
.bashrcに以下の記述を追加します.

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

ここで重要なのは"\[\033k\033\\\]"の部分です.これ以降の部分は好きに書き換えてください.これをPS1に追加することで現在実行中のコマンドが取得できるらしいです.仕組みは理解していません.

"\["と"\]"で囲われた部分は非表示のコマンドして認識されます.これで囲わないと,bashコマンド履歴とたどったときに,カーソルの位置がずれる,表示と異なるといった現象が発生することがあります.

以上で設定完了です.
ホームディレクトリで

source .bashrc

とコマンド入力し,.bashrcを読み込みし直します.そして,screenを起動してみましょう.

topコマンド等を実行してみるとウィンドウ名が変わるのが確認できます.
なお,screen上でsshした先でコマンドを実行した場合でも,ウィンドウ名がそのコマンド名に自動的に変更されます.便利.