2012/03/18

GNU Screenは終わったのか?

最近、ずっと dotfiles ばかりをいじっていた関係で、あまりブログ等でのアウトプットが出来ていませんでした。これからはドンドン書いていきますのでどうぞよろしくお願いします。本日は tmux と同様の機能を持つ GNU Screen を紹介します。

GNU Screen や tmux は、1つのターミナル画面上に複数のコンソールウィンドウを表示するためのソフトです。比較的最近、注目を浴びている tmux と比べ、デファクトスタンダードと言われる GNU Screen も git にある開発版では着実に進化しています。私も 6 年ほど開発版を常用し、便利に使わせていただいています。ここでは、GNU Screen を便利に使うために私が行っている設定を紹介します。

GNU Screen の特徴

初回に screen を実行すると、screen のバックエンドプロセスが起動し、そこに screen フロントエンドプロセスで接続した状態になります。そのため、複数の端末で同じ画面を表示することが出来ます。

また、GNU Screen ではひとつの画面(window)を複数の領域(複数 region)に分割することができます。開発版では新たにレイアウト(layout)という概念が加わり、バックエンド、フロントエンド、ウィンドウ、領域、そしてレイアウトという概念があり、tmux の複雑さにようやく追いついたかなと思います。

コマンドラインも充実しています。ウィンドウ分割やバッファ操作などの命令は、キーバインドだけでなく、screen コマンドを用いても指示を出せます。これを使って各サーバーの自作管理ツールは作っていませんので、残念ながらその話は出来ません。

GNU Screen を起動する

Fedora の場合、

yum install screen
でサクっとインストールできます。

よく使う screen コマンド

私は下記のコマンドをよく使います:

screen -r - すでに開いたセッションにアタッチする
screen -X windowlist (C-A ") - ウィンドウの一覧を表示する
screen -X screen (C-A c) - 新しいウィンドウを作る
screen -X detach (C-A d) - クライアントをデタッチする
screen -X help (C-A ?) - キーバインドの一覧を表示する
screen -X next (C-A n) - 次のウィンドウを表示する
screen -X prev (C-A p) - 前のウィンドウを表示する
screen -X kill (C-A k) - ウィンドウを強制的に閉じる
screen -r 以外は、すべてキーバインドにアサインされています。デフォルトは Ctrl-A ですが、.screenrc を編集(escape xy)したり起動時に -e xy を指定することで変更可能です。

.screenrc でカスタマイズ

ホームディレクトリの .screenrc や変数 SCREENRC に指定するファイルを作成して編集することで、キーバインドの変更や、オプションの設定を行えます。ここでは、私が設定している設定について説明します。

1.バックスクロール行数を増やす

scrollback 10000
この例では、screen のスクロールバックバッファの行数を1万行に設定しています(デフォルトは 100 行)。screen ではウィンドウごとにバッファを管理しており、さかのぼって検索するだけでなく、コピー&ペーストを行うことも可能です。

2.ステータスラインの見た目変更

utf8 on
caption always '%?%F%{= gW}%:%{= Kk}%?%2n%f%07=%t%='
hardstatus alwayslastline '%m/%d %02c:%s %{= .g}%H%{-} %L=%-w%45L>%{= g.}%n %t%{-}%+w %-17<%=%{= .y}(%l)'
この辺の設定はお好みで。マニュアルを見ながらカスタマイズすると良いでしょう。(screen(1) の STRINGS ESCAPES のあたり)

3.マウス操作に対応する

mousetrack on
上記設定により、私が普段使っている iTerm2.app にてマウスによる領域が選択できるようになります。マウスの選択範囲でバッファコピー&ペーストを行ったり、ステータスラインでマウスクリックによるウィンドウ選択などは残念ながら可能になりません。iTerm2.app の場合、デフォルトのマウス操作(OSX 標準クリップボード)を使いたい場合は、Alt キーを押しながら操作します。

4.キー割り当てのカスタマイズ

bind ^N           eval 'next' 'command -c select'
bind ^P           eval 'prev' 'command -c select'
bind -c select ^N eval 'next' 'command -c select'
bind -c select ^P eval 'prev' 'command -c select'
私はフルスクリーン作業を中心にするため、頻繁にウィンドウ切り替えを行います。そのため、Ctrl-N および Ctrl-P をウィンドウ操作(隣接するウィンドウ番号への切り替え)に割り当てています。

5.画面に表示されている内容を自分宛にメールで送る
bind S eval "exec sh -c 'screen -X hardcopy -h hardcopy; cat hardcopy | tail -n 10000 | /usr/sbin/sendmail yoshikaw@example.com'"

よく、今見えている画面を残しておきたい(ログがわりに取得しておきたい)ことがあります。そういう時には、上記設定が便利です。Ctrl-S をタイプすると、バッファの1万行分の画面表示が、自分のメールアドレスに送信されます。

上の例のように、screen ではバインドキーに対するシェルスクリプトを実行できます。使い方次第では、他にも応用例が考えられるでしょう。

screen の注意点

ウィンドウを多数開いている場合、スクロールバッファを増やしすぎると、screen バックエンドプロセスのメモリ使用量が非常に大きくなりますが固まってしまうことはあまりありません。screen の安定性に対して疑問に思うことはありませんが、あまりスクロールバッファを大きくすることは控えた方が賢明です。

おわりに

この記事は以下に触発されて書きました。ほとんどコピペですみません。

ターミナルマルチプレクサとして tmux が便利なのは理解できますが、GNU Screen でも出来ることのホンの少しの例示だけでそれは無いんじゃないのと思った次第です。私の端末操作における要望は開発版 GNU Screen でほぼ満たされていますので、tmux ならではの機能が必要とされない限りは乗り換える理由がみつかりません。そのような機能については以下の記事で紹介されています。 これは screen 単体では無理ですね。zsh が利用可能な環境であれば、以下の記事を参考にすると幸せになれます。 古いとか新しいではなく、自分の用途に合ったツールを見極めて使いこなしてゆきたいですね。

0 件のコメント:

コメントを投稿