優れたterminal multiplexerのGNU Screen、長年使っていると不満な点もちらほら出てきます。 そこで、思い切って改造してみました。
ここではscreenのコマンドを:commandのように表記します。
更新次第ここに追加します。
state_fileのmemory leakを直しました。
オプションを新しく追加しました。
ウィンドウが終了するとき、:zombieで設定して必ずそのウィンドウを消すようにします。
番号つきで:screenを使ったとき、その番号のウィンドウが使われていたらそのウィンドウを選択します。
オプションを新しく追加しました。
コマンドを割り当てたのち、そのコマンドを実行します。
screenコマンドラインで、コマンドヒストリが使えるようになりました。 C-pで過去方向、C-nで未来方向へヒストリを辿ります。 また、C-dでカーソル位置の文字を消すようにしました。
:bindと:screenの新オプションによって、キー割り当て、プログラム起動、ウィンドウ選択を一文で実現できるようになりました。 次のようなコマンドを使います。
:bind -x 割り当てるキー screen -z (-t タイトル) 番号 起動するプログラム
たとえば、次の設定を.screenrcに入れたとします。
:bind -x ^J screen -z 0 emacs -nw
このように、その番号のウィンドウを特定のプログラム専用のものにすることができます。 特定のプログラム専用のウィンドウの番号は、高い番号を割り当てることをおすすめします。 高い番号は通常簡単には選択できないし、:windowsやハードステータスラインに書かれるウィンドウのリストからはみ出てしまいます。 しかし、すでにキー割り当てが行われた後なので、そのウィンドウは番号を気にせずに使うことができます。
現在のウィンドウの状態をリアルタイムにファイルに書き出すようにしました。 これでかなりスクリプティングの幅が広がると思います。 ファイル名は
~/.screen.windows.$STY
です。$STYは環境変数STYの値です。
state fileのフォーマットは、次の行の集合になっています。実際にスペースは入っていません。
ウィンドウ番号 ^A FileDescriptor ^A tty ^A タイトル ^A カレントディレクトリ ^A コマンドライン
^AはC-a(\001)です。コマンドラインは引数ごとに^B(C-b, \002)で区切られています。
emacs ^B -nw ^B
といった感じです。
なお、zombie状態のウィンドウは FileDescriptor が -1 になっています。
このstate fileを使えば、たとえば「次のw3mへ切り換える」などといった処理を簡単に書くことができます。 もう自前でウィンドウを管理するような小細工は必要はありません。
screen-4.0.2-short_ttyname.patchの効果で、String Escapeの%Tは現在使用中のttyに置換されます。次の設定を試してみてください。
:windowlist title 'Num TTY Name' :windowlist string '%3n %f %T %t' :hardstatus lastline "%f%n:%t[%T]%LW"