今回はtmuxというアプリケーションを紹介したいと思います。
tmuxはterminal multiplexerの略で、要するに1つの環境上で複数のターミナルを起動できるアプリケーションです。
ということで今回はLinuxやOS X上でターミナルをよく使う人(主にWeb開発者でしょうか)へ向けた内容になります。開発者でなくても弊社QAのような方にも参考になれば嬉しいです。
tmuxが便利なのは例えば次のような場合です。
- エディタやDBコンソールなど複数のターミナルを同時に使いたい
- 画面分割してターミナルを使いたい
- SSHで接続して作業している環境を、一旦SSHから抜けてまた接続した後に再開したい
GNU screenでも同じようなことができるので知っている人はそちらを使っているかもしれません。自分はscreenは使ったことがなく、最近tmuxを使い始めて今では手放せなくなっています(もっと早く知っていればよかった)。
表記について
これからの説明のためにキーボード操作の表記についてまとめておきたいと思います。
Ctrlキーと同時にaキーを押すときの操作を「C-a」と表記します。
Ctrlキーと同時に大文字のAキーを押した場合は「C-A」と表記します。
C-a xと表記した場合はCtrlと同時にaキーを押して一旦話した後、xキーを押します。
また、
$ command
のような表記はシェル上でのコマンド入力を表します。
インストール
さて、早速インストールしてみましょう。
tmuxはパッケージからインストールするのが簡単です。OS XであればHomebrewまたはportsから、Linuxではaptやyumなど各パッケージマネージャからインストールできます。
Homebrewの場合
$ brew install tmuxportsの場合
$ sudo port install tmuxyumの場合
$ sudo yum install tmux
他のパッケージ管理でもだいたい同じようなコマンドになると思います。
うまくいけば次のコマンドでバージョンが表示されます。
$ tmux -V
tmux 1.6
tmuxセッションの起動
tmuxセッションを開始するには単純にtmuxコマンドを入力します。
$ tmux
これでtmuxの新しいセッションを立ち上げることができます。
図1.tmuxセッションの起動 |
画面の一番下にtmuxのステータスラインが表示されます。
tmuxのセッションを抜けるには単純にexitして終了します。
$ exit
exitすると標準のターミナル(tmuxセッションを開始した元のターミナル)に戻ってきます。
アタッチとデタッチ
それでは次にセッションを起動し、そのセッションからデタッチしてみましょう(セッション終了させずにバックグラウンドで実行させ、元のターミナルに戻ります)。
次のようにするとセッションは名前をつけて起動できます。
$ tmux new-session -s mysession
または
$ tmux new -s mysession
セッションが立ち上がったらその中で C-b d を押すことでデタッチできます。
この C-b d の最初の「C-b」をPrefixキーと呼び、tmuxへ命令を送る合図になります。
Prefixキーを押した後のキー入力はtmuxに送られてコマンドとして解釈されることになります。どんなコマンドがあるかは C-b ? で確認することができます。
今後はC-b xと表記する代わりにPrefix xと表記しますので、Prefix xとあれば「C-b x」と読み替えてください。
さて、元のターミナルに帰ってきたら次のコマンドでバックグラウンドで実行しているセッションを確認することができます。
$ tmux list-sessions
または
$ tmux ls
次のような1行が表示されると思います。
mysession: 1 windows (created Sat May 26 12:02:06 2012) [65x20]
今度はデタッチしたセッションを再開するにはtmux attachコマンドを使います。
$ tmux attach -t mysession
デタッチされたセッションはバックグラウンドで動いているので、セッション再開したときに以前のアプリケーション状態などがそのまま再開できます。
デタッチされたセッションは元のターミナルから次のコマンドを送ることで終了することもできます。
$ tmux kill-session -t mysession
このようにデタッチされたセッションに対してコマンドを送れるのも特徴です。後ほど説明するウィンドウを増やしたり、画面分割したりするコマンドも元のターミナルからバックグラウンドで動作しているセッションに対して送ることができます。
ウィンドウ
tmuxでは1つのセッション内で複数のターミナルを立ち上げることができます。ちょうどブラウザのタブのようなイメージです。これをtmuxではウィンドウと呼びます。
現在のセッションからウィンドウを追加するには Prefix c を打ちます。
図2.ウィンドウの追加 |
tmuxのステータスラインにウィンドウを示す番号と名前が追加されています。 ウィンドウの名前はデフォルトでは実行中のプロセス名になりますが、 Prefix ,(カンマ)で変更することができます。図2では番号1のウィンドウ名をeditorに変更しています。
それぞれのウィンドウには Prefix n または Prefix pで移動できます。 Prefix の後にウィンドウの番号を入力することでも移動できます。 10個以上のウィンドウがある場合は Prefix f で名前入力するか、Prefix w でウィンドウ一覧から移動したいウィンドウを選びます。
各ウィンドウを終了したい場合はexitしてシェルを終了するか、Prefix &(アンパサンド)でも終了できます。
次はウィンドウ内を画面分割してみましょう。
pane(画面分割)
tmuxはウィンドウ内を分割して、1画面で複数のターミナルを表示することもできます。分割された各画面をpane(ペイン)と呼びます。
ウィンドウ内で Prefix % を押すと垂直分割、Prefix “(ダブルクォート)を押すと水平分割されます。分割されたpane内でさらに分割することもできます。
図3.pane分割 |
paneを移動するには Prefix の後にカーソルキー(Up, Down, Left, Right)で移動できます。Prefix oを使うと各paneを順番に移動します。
paneを閉じる場合はやはり単純にexitするか、Prefix x を使います。
コマンド入力
これまでPrefixキーを押してから入力してきた各コマンドは、Prefix :でコマンド入力欄を表示させた後にコマンド名を入力することでも実行できます。例えば"console"という新しいウィンドウを作る場合は次のように入力します。
: new-window -n console
図4.コマンド入力 |
どんなコマンドが使えるかや、そのコマンドの使い方については他の紹介サイトやtmuxのmanページを参考にしてください。Prefixキーに割当たっているコマンドは Prefix ? で見ることができます。
次はコンフィグファイルによるキーバインドの変更方法について説明します。
コンフィグファイル
.tmux.confファイルを書いてホームディレクトリに置くことでtmuxのキーバインディングやステータスラインの内容をカスタマイズすることができます。
例えばPrefixキーの割当てを変更してみます。デフォルトのPrefixキーはC-bなのですが、bキーは中々打ちにくいのでこれをC-aに変更します(GNU screenのデフォルトと同じにします)。
[.tmux.conf]
set -g prefix C-a (1)
unbind C-b (2)
bind C-a send-prefix (3)
(1) -g はglobalの意味で、すべてのセッションで利用するためのオプションです。
(2) C-bはもうprefixキーとしては使わないのでバインドを解除します。
(3) C-aをprefixキーとして割り当てたのはいいのですが、このままだとC-aを使うアプリケーションでC-aが入力できなくなってしまいます。C-aを2回押したときにアプリケーション側にC-aが送られるように設定します(bind xはPrefix xを入力したときのコマンドをセットします。ここではbind C-aなのでC-a C-aが入力されたときにsend-prefixを実行します)。
よく使う機能を割り当てたり、自分の使いやすいようにキーバインドを変更しておくと便利です。
次で最後になりますが、コピーモードについて説明します。
コピーモード
tmuxではコピーモードに入ることで、ターミナルに表示されている内容をキーボードを使ってコピー&ペーストできるようになります。
コピーモードに入るには Prefix [ を押します。すると表示されていた画面のスナップショットがとられ、画面内をカーソルで移動できるようになります。ちょうどエディタで編集できないテキストを開いたようなイメージです。
コピーモードでのデフォルトのキー操作はEmacs風になっています。例えば、上下左右へのカーソル移動はそれぞれC-p,C-n,C-b,C-fに対応します。C-sを押すと検索ワードが入力できるようになるので入力したあとEnterを押すことでマッチした検索ワードまでジャンプできます。
Vimのキー操作がお好みであればコンフィグに次の設定を書きます。
set -g mode-keys vi
移動のキーがvi操作と同じになり、/や?で検索できるようになります。
さて、コピーをするにはSpaceキーとEnterキーを使います。Spaceを押すと選択モードになるので好きなところまで移動してからEnterを押すことで内容がtmuxセッションのバッファにコピーされます。
図5.コピーモード |
図5ではtopコマンドで実行した内容の一部をコピー選択しています。
バッファにコピーされた内容は Prefix ]でペーストできます。
選択しているpaneの内容全体をコピーするコマンドもあります。Prefix :を押した後capture-paneを入力します。
コピーバッファリスト
コピーした内容はtmuxのセッション内にコピーバッファリストとしてたまっていきます。過去にコピーした内容を使いたい場合はバッファのリストを開いて選択することで呼び出すことができます。
Prefix : を入力してコマンド欄に list-buffers を打てばバッファの一覧を表示できます。一覧からバッファを選んでペーストまでしたい場合はchoose-bufferコマンドを使います。
図6.choose-bufferコマンド |
図6はchoose-bufferコマンドを実行した状態ですが、この状態でEnterを押せば "Second buffer"という文字列がペーストされます。