端末で作業をするなら、特にsshなどでネットワーク後しに作業を行うなら、仮想端末管理ソフトウェアであるGNU Screenは必須といってよいでしょう。Ubuntu 10.04であれば、GNU Screenをさらに便利に使うためのアプリケーション「byobu」が最初から導入されているので、こちらを使っているユーザも多いと思います(byobuについては本連載72回参照、注1)。
今週のレシピは、GNU Screenと同じ仮想端末管理ソフトウェアである「tmux」ターミナルマルチプレクサを紹介します。
GNU Screenの利点とは
GNU Screenの利点を簡単におさらいしておきましょう。GNU Screenには多くの機能がありますが、筆者が主に使っているのは以下のような機能です。
- GUIのタブ機能のように、複数の端末を起動して切り替えられる
- 端末を画面分割して使うことができる
- 端末上でコピー&ペーストができる
- 端末をデタッチ/アタッチすることができる
ブラウザやエディタなど複数のページやファイルを開くアプリケーションならば、タブ型のインターフェイスはもはや当然です。screenも複数のウィンドウを一つの端末内で開くことができ、タブのように切り替えて使うことができます。またウィンドウ内で画面を分割し、二つのシェルを並べるような使い方もできます。場合によってはウィンドウ切り替えよりもこちらが便利でしょう。これらは多数のマシンに接続したり、複数の端末を同時に使う場合に威力を発揮します。
コピーペースト機能は文字通り、端末上の文字をコピーペーストする機能です。これはGnome端末のようなGUIのターミナルエミュレータを使っている場合は、あまり恩恵がないかもしれません。しかしtmuxにはコピーしたバッファをさらに便利に使う機能が用意されています(後述)。
そしてscreenを使う最大の理由と言っても過言ではない機能が、デタッチ/アタッチ機能です。これは一言で言えばscreenの中身と接続している端末を分離する機能で、会社から帰宅する際にデタッチを行い、自宅でアタッチして作業再開、のようなことを可能にしてくれます。screenはユーザが C-a C-z を入力した時や、端末が閉じられた時、不意に回線が切れた時などにデタッチを行います。デタッチされたscreenのプロセスはバックグラウンドで動作しつづけるため、アタッチしなおすことで作業を再開することができるのです。
これらの機能は、当然tmuxでも使うことができます。
tmuxのインストールと実行
tmuxはUbuntuのリポジトリからバージョン1.1をインストールすることができます。Ubuntuソフトウェアセンターから「tmux」で検索するか、下記のコマンドを実行してインストールしてください。
tmuxを起動するには、その名のとおりtmuxコマンドを使います。GNU Screenの場合は何も設定を行わずに起動すると、画面には何も表示されず、現在開いているウィンドウの番号すら分からない[2]ですが、tmuxはステータスラインがデフォルトで最下部に表示されるようになっています。ステータスラインにはクライアント番号(後述)、ウィンドウのリスト、現在の日付と時刻が表示されています。
tmuxの構成を知ろう
まず、tmuxを構成している要素について知っておきましょう。
セッション
セッションとは、tmuxが管理している端末ウィンドウの集合体です。tmuxは起動すると一つのセッションを作成し、その中で一つのウィンドウを作成します。現在起動しているセッションの一覧を取得するには、list-sessionコマンドが使用できます。シェルからtmuxコマンドに続いてlist-sessionサブコマンドを指定するか、起動したtmux上でC-b :[3]キーでtmuxのコマンドプロンプトに入り、list-sessionコマンドを実行してください。一番左に表示されている数字が、セッション番号です。その後に、セッション中で開かれているウィンドウ数や作成日時、クライアントのサイズ、アタッチの状況が表示されます。またtmuxの最下行に表示されているステータスラインに表示されている情報は、カレントセッションの情報になります。
クライアント
クライアントとは、セッションにアタッチしているttyを指します。クライアントの情報を得るには、list-clientコマンドが使用できます。
ウィンドウ
ウィンドウとは、セッション中で開かれている独立した端末です。ウィンドウはセッションの画面全体を占有し、セッションは一つ以上のウィンドウを持ち、任意に切り替えることができます。
screenでは分割したスクリーンに複数のウィンドウを表示することができましたが、tmuxではウィンドウは常にスクリーン全体を占有し、「ペイン」と呼ばれる単位に分割することになります。開いているウィンドウの状態はステータスラインに表示されるので、一目でわかるでしょう。ウィンドウのリストを得たい場合は、list-windowコマンドを使用します。ウィンドウの名前は起動しているプログラム名が自動的に設定されますが、任意に変更することもでき、名前には日本語を使うことも可能です。
ペイン
ペインはscreenにはないtmux独自の概念で、ウィンドウを分割する単位です。通常ウィンドウは単一のペインを持ってクライアントの全画面を占有していますが、split-windowコマンドを使うことで、ウィンドウを上下二つのペインに分割することができます[4]。
display-paneコマンドを使うと、各ペインに番号のインジケータを表示させることができ、数字キー0~9でペインを選択することができます。またbrake-paneコマンドを使うと、対象となるペインをウィンドウから切り離し、対照となるペインひとつをもつ新しいウィンドウを生成します。
tmuxの操作
既にいくつかのコマンドを紹介した通り、tmuxはコマンドで機能を呼び出すことができます。screenのようなショートカットも用意されていますが、これらは任意のキーにコマンドをバインドすることで実現されています。このあたりは関数をキーにバインドするEmacsに似ているかもしれません。ショートカットはscreenと同様prefixキーを用いて入力し、デフォルトのprefixキーはCtrl+bに設定されています。現在のキーのリストはlist-keysコマンドか、C-b ?キーで見ることができますので、一通り目を通しておきましょう。また、使用できるコマンドの詳細はman tmuxを参照してください。
表1 tmuxの主な操作
キーバインド | コマンド |
C-b ? | ショートカットキーのリストを表示 |
C-b c | 新しいウィンドウを作成 |
C-b n | 次のウィンドウへ移動 |
C-b p | 前のウィンドウへ移動 |
C-b w | ウィンドウの選択メニューを表示 |
C-b d | セッションのデタッチ |
C-b : | コマンドプロンプトの開始 |
C-b [ | コピーモードの開始 |
C-b ] | バッファ内容のペースト |
C-b q | ペインのインジケータを表示 |
C-b t | ペイン全体に時計を表示 |
C-b % | ウィンドウを左右のペインに分割 |
C-b o | 次のペインへ移動 |
C-b { | ペインの入れ替え |
C-b } | ペインの入れ替え(逆順) |
C-b M-↑ | ペインの上下分割位置を上へ移動 |
C-b M-↓ | ペインの上下分割位置を下へ移動 |
C-b M-← | ペインの左右分割位置を左へ移動 |
C-b M-→ | ペインの左右分割位置を右へ移動 |
C-b x | ペインの破棄 |
tmuxでのコピー&ペースト
tmuxでもscreenと同様、コピー&ペーストを行うことが可能です。tmuxの操作方法はscreenによく似ていますが、screenのコピーモードがviをベースとしたキーバインドになっているのに対し、tmuxではEmacsベースのキーバインドになっている点が異なります。設定の変更でviベースのキーバインドにすることもできますが、デフォルトはEmacsベースです[5]。
C-b [でコピーモードを開始したら、C-n、C-p、C-f、C-b、C-a、C-eといったEmacsライクなカーソル移動が可能になります。コピーモードではscreenと同様、バックスクロール機能がない端末でもスクロールアウトしてしまったバックログを遡っていくことができます。余談ですが、tmuxにはもともとバックスクロールを閲覧する専用のモードが用意されていたのですが、バージョン1.1からはコピーモードに統合されました。そのかわりといってはなんですが、Page Up/Page Downキーを使えばカーソル位置を変えずにバックログを辿ることができます。
コピーの開始位置まで移動できたら、C-Spaceでマークをセットします。次にコピーの終点までカーソルを動かし、C-wで選択領域をコピーバッファに取り込むことができます。ペーストにはC-b ]を使いましょう。
tmuxではEmacsのキルリングのように、コピーした内容はセッションごとに持っているペーストバッファにスタックされ、複数保存しています。バッファの内容はlist-bufferコマンドで確認することができるほか、copy-bufferコマンドで別のセッションにコピーすることも可能です。キーバインドからペーストを行う場合は最後にスタックに積んだバッファ内容がペーストされますが、paste-bufferコマンドにlist-bufferで得られるバッファ番号を与えれば、任意のバッファをペーストできます。詳細はmanのBUFFERSセクションを参考にしてください。
tmuxでのデタッチ/アタッチ
tmuxはscreen同様に回線が切断された時などに自動でデタッチする他、C-b dキーバインドや、detach-clientコマンドでセッションをデタッチすることができるようになっています。
アタッチするにはtmuxを起動する際にtmux attachとしましょう。この際-tオプションでターゲットとなるセッションを指定することができます。セッション番号はlist-sessionコマンドで取得することができますので、複数のtmuxセッションを立ち上げている場合は確認してみましょう。なお、ひとつのセッションに複数のクライアントをアタッチすることも可能です。
tmuxの設定
tmuxの設定ファイルは~/.tmux.confです。/usr/share/doc/tmux/examplesに設定例がいくつか存在しますので、これを参考にするのもよいでしょう。例えばscreen-keys.confを~/.tmux.confにコピーするだけで、GNU Screenのデフォルトと同様のキーバインドを実現することができるようになっています。筆者はscreen-keys.confをベースに、Prefixを^Zに変更して使っています。前述の通りtmuxは設定を行わなくてもそれなりに動作してしまいますので、最初はこの程度で充分でしょう。
既存のキーバインドを解除するにはunbind、新しいキーバインドを設定するにはbind、オプションの設定にはset-option(省略形はset)を使います。例えばPrefixキーをC-bからC-zに変更するには、~/.tmux.confに次のように記述します。-gはグローバルの意味で、-gをつけて設定したオプション値は、tmux全体で有効になります。
ペーストバッファはデフォルトで9個用意されていますが、この個数を変更するにはbuffer-limitに値を変更します。同様にバックログの行数はデフォルトで2000行ですが、この行数を変更するにはhistory-limitの値を変更します。以下はペーストバッファを20、バックログを5,000行に設定する例になります。
tmux 1.2
Ubuntu 10.04でリポジトリから導入できるtmuxは1.1ですが、Debian unstableには既に1.2のパッケージが存在します。これをUbuntu 10.04上でリビルドしたパッケージを、筆者のPPAに置いておきました。
tmux 1.2ではイベント通知ライブラリにlibeventを使うようになった他、新しいオプションやコマンドが追加されています。コマンドのオプションに指定するターゲットウィンドウでは、!や+-で、最後に使ったウィンドウや前後のウィンドウを指定することも可能になっています。1.1からの詳細な変更点はCHANGELOGを参照してください。