GNU Screenでscreenの中のscreenを操作しやすくする

たとえば、ローカルで起動したscreenの中でSSH接続を行い、接続先のサーバで起動したscreenを操作したいとする。 前者のscreenを外側、後者のscreenを内側としたとき、内側のscreenで新しいウィンドウを開くには、一旦C-a a (meta) で内側のscreenにC-aを送った後cを押す必要がある。 他の操作についても同様に、あらゆる操作の前にC-a aをつけなければならず、非常に操作しづらい。

これを簡単にするために内側のscreenで異なるキーをエスケープに用いる方法が知られているが、接続するたびにエスケープキーを変更、あるいは接続先のサーバで異なるscreenrcを用意する必要があり、この方法もやや煩雑である。

そこで、metaを実行した後echoするコマンドをC-a Spaceにバインドし、renditionでメッセージの表示色を変えるようにしてみる。 具体的には、次のような内容を~/.screenrcに書く。

escape ^Tt

# let space do meta + echo
bind " " eval meta "echo 'operating the inner screen...'"

# display time at the right side
hardstatus alwayslastline "%{=r dd}%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<%-06= %c"
# set message color to white over green
rendition so "= gW"

ここでは、エスケープキーとしてC-aの代わりにC-tを用いるようにしている。

上の設定をローカル、リモート両方のscreenに対して行い、1番のウィンドウでSSH接続した先でさらにscreenを起動したときの様子を次に示す。

C-t Spaceを押す前

この状態でC-t Spaceを押すと、エスケープシーケンスが内側のscreenに送られ、次のような表示に変わる。

C-t Spaceを押した後

この状態でcを押せば新しいウィンドウの作成、nを押せば次のウィンドウへの切り替え、数字キーを押せば指定した番号のウィンドウへの切り替えができる。 さらにSpaceを押せば、もう一段内側のscreenに操作対象を切り替えることもできる。

視覚的に状態が確認できるようになって便利。

追記(2015-02-15)

asciinemaを使って動画にしてみた。