= tmux - Terminal multiplexer =
サーバーでなんらかしら処理を実行させている時、接続してたセッションが突然切れてしまい、
それまで実行していた処理が台無しになるという悲劇は誰もが経験することの一つだと思います。

nohup ~ & によるバックグラウンド実行…ネタは典型かもしれませんが、
tmux(GNU Screen でもいいけど)で端末を仮想化してしまうのも手です。
繊細なオペレーションが必要な場合は tmux を使う癖を付けておきたいところ。

<<TableOfContents(3)>>

= 基本機能 =

== 起動方法 ==
{{{
tmux new [コマンド...]
  または
tmux new-session [コマンド...]
}}}
新しい「セッション」を立ち上げます。
指定した「コマンド」が終了すると、そのまま tmux も終了してしまうため、
「コマンド」は指定せずに、デフォルトシェル(環境変数 SHELL を参照してる)で立ち上げて、
「コマンド」を実行しましょう。

== 終了方法 ==
もちろんコマンドを終了すればいいので、シェルなら exit(logout)で終了します。
「他爆装置」的な機能も用意されていますが、どちらかというとトラブルシュート時に使うものになります。

== 一時的な切断 ==
ターミナルが突然切断されても tmux で保護された仮想端末はそのまま処理し続けます。

人為的に(意図的)に切断したい場合は「''PREFIX''」を入力して「d」を入力して、で切断します。
''PREFIX'' は tmux の場合 CTRL+b(コントロールキーを押しながら b を入力)となります(設定変更可)。
この場合「コントロールキーを押しながら b を入力、コントロールキーから手放して d を入力」操作となります。

なお GNU Screen の ''PREFIX'' は CTRL+a で、この手のツールの説明ではよく、
「PREFIX+d」ないしは「CTRL+b d」(CTRL+b が ''PREFIX'' として)ないしは、
「^b d」という表現で表されています。

勘のいい人なら「PREFIX+^d」(つまり CTRL+b CTRL+d)でも一時切断できるのに気がつくと思います。
使う人に優しいキーバインド。

== セッションの一覧 ==
{{{
tmux ls
  または
tmux list-sessions
}}}
複数の tmux セッションを立ち上げたときに、どの tmux に接続できるのか一覧で確認できます。

== 一時切断したセッションに接続する ==
{{{
tmux attach [-t <セッション番号>]
  または
tmux attach-session [-t <セッション番号>]
}}}
''PREFIX''+d で抜けた、あるいは、強制切断してしまったセッションに再接続したい時に指定します。

== 新しいウィンドウを作成する ==
セッション上に複数のウィンドウを開くことができます。
''PREFIX''+c ないしは ''PREFIX''+^c です。

== ウィンドウを切り替える ==
 * 「次のウィンドウ」に切り替えたいときは「''PREFIX''+n」ないしは「''PREFIX''+^n」です。
 * 「前のウィンドウ」に切り替えたいときは「''PREFIX''+p」ないしは「''PREFIX''+^p」です。
 * 「直前のウィンドウ」に切り替えたいときは「''PREFIX''+l」です。
 * 「指定したウィンドウ番号」に切り替えたいときは「''PREFIX''+0」~「''PREFIX''+9」です。

== バックログを見る ==
「''PREFIX''+[」でバックログ(過去の表示履歴)を見る状態に移行します。
この状態を「コピーモード」と言います。

カーソルキーで上下に移動可能です。
デフォルトで emacs キーバインドでスクロールすることが可能なのですが、
自分は普段 vi キーバインドで使用している(設定変更により)のと、
emacs キーバインドを忘れてしまったので、詳細は省略します。

このモードから脱出する場合は「q」を押します。

== ウィンドウの縦分割(ペイン) ==
「''PREFIX''+"」(ダブルクォート)でウィンドウを縦半分に分割します。

== ウィンドウの横分割(ペイン) ==
「''PREFIX''+%」(パーセント)でウィンドウを横半分に分割します。

== ペイン間の上下左右移動 ==
 * 「''PREFIX''+↑」で上にあるペインに移動します。
 * 「''PREFIX''+←」で右にあるペインに移動します。
 * 「''PREFIX''+→」で左にあるペインに移動します。
 * 「''PREFIX''+↓」で下にあるペインに移動します。

ウィンドウ間の移動と違って、戻るとか進むとか直前の…あるいは番号指定といった操作はありません。

== ペインのサイズ変更 ==
 * 「''PREFIX''+^↑」で上に1行、ペインを拡大または縮小します。
 * 「''PREFIX''+^←」で左に1桁、ペインを拡大または縮小します。
 * 「''PREFIX''+^→」で右に1桁、ペインを拡大または縮小します。
 * 「''PREFIX''+^↓」で下に1行、ペインを拡大または縮小します。

リサイズ=サイズ変更なので拡張か縮小しかないのですが、どういう理屈で拡大したり縮小するかはよくわかってないです:-)。

なお、CTRL の代わりに ALT(META)キーを押しながら…だと5行ないしは5桁単位でリサイズできます。

= 独断と偏見の推奨設定 =
いかんせん、PREFIX のデフォルトが CTRL+b である、GNU Screen からの移行でいくつかの操作の振る舞いに慣れない、
など、自分にとって使いづらいことこの上ないので、カスタムしています。
カスタム内容は ~/.tmux.conf に記載することで対応します。
tmux.conf の変更は新しいセッションで反映されますが、セッションが生き残ってると反映されません。

== ''PREFIX'' の変更 ==
{{{
set-option -g prefix ^t
unbind-key ^b
}}}

tmux にせよ GNU Screen にせよ、微妙なキーをデフォルトにしているので、普段使わなさそうなキーを ''PREFIX'' に指定します。
自分は CTRL+t に決めました。

また「''PREFIX''+''PREFIX''」の振る舞いが GNU Screen とは違います。
tmux の場合''PREFIX''を特別扱いしません。
''PREFIX''であるところの「CTRL+b」としてキー割り当てが行われています。

また tmux では「CTRL+b そのものを入力する」機能が割り当てられています。
いずれにせよ、そんなキーは無効にするに限る、と。

== 直前のウィンドウに戻る ==
{{{
bind-key t   last-window
bind-key C-t last-window
unbind-key l
}}}
GNU Screen と同じく「''PREFIX''+''PREFIX''」の挙動を「直前にウィンドウに戻る」とします。
''PREFIX''+l の振る舞いは認めない:-)。

== バックログの保持行数の変更 ==
{{{
set-option -g history-limit 10000
}}}
1ペイン毎に保持する行数となります。あまり大きすぎると負荷になりますが、少なすぎても使いづらいです。

== ステータス行の表示可否 ==
{{{
set-option -g status off
}}}
画面下の行にステータスを表示したくない時に off に指定します。表示したい時(デフォルト)は on です。

== ウィンドウの開始番号を指定する ==
{{{
set-option -g base-index 0
}}}

''PREFIX''+0 から ''PREFIX''+9 まで10個のウィンドウを「直接」指定することができます。

自分の場合、0は特別扱いして普段使いは1から使うようにしています。
そのため base-index には 0 を指定しています。

キーボードを見ると、1~9、0という並びなので、1から始めると使いやすいかもしれません。
その場合は base-index に 1 を指定します。

いずれにしてもウィンドウの開始位置と自分の感覚が合うよう、調整が必要です。

== ウィンドウタイトルの表示変更可否・書式指定 ==
{{{
set-option -g set-titles on
set-option -g set-titles-string "#T #S:#I"
}}}

tmux は XTerm 由来のウィンドウタイトルバーの変更機能(エスケープシーケンス)に対応しています。
この機能のオンオフ(set-titiles)や表示フォーマットの指定(set-titles-string)が可能です。

||<#FFFF00>書式 ||<#FFFF00> 表示内容    ||
|| #T           || ユーザー指定タイトル ||
|| #S           || セッション番号       ||
|| #I           || ウィンドウ番号       ||
他にもたくさんあるけど、あまり使い出が…。

※ユーザー指定タイトルは XTerm 由来のウィンドウタイトルバー変更エスケープシーケンスに対応したアプリが設定した内容となります。

== コピーモードのキーバインド ==
{{{
set-window-option -g mode-keys vi
}}}

== ウィンドウ(ペイン)の縦分割 ==
{{{
bind-key - split-window -v
unbind-key '"'
}}}

ウィンドウ(ペイン)の縦分割は先に説明した通り、非常に直感的でないキーが割り当てられています。
ここでは「-」(マイナス)を割り当てることで、「横に切って縦に割る」感で縦分割します。

一応「delete-buffer」という機能が割り当てられていましたが、まぁ使わんでしょう。

== ウィンドウ(ペイン)の横分割 ==
{{{
bind-key | split-window -h
unbind-key %
}}}

ウィンドウ(ペイン)の横分割は先に説明した通り、非常に直感的でないキーが割り当てられています。
ここでは「|」(バーティカルライン)を割り当てることで、「縦に切って横に割る」感で横分割します。

= セッション・ウィンドウ・ペイン =
tmux は以下の包含関係があります。起動直後はこれが1:1:1の関係となっています。
一セッション中でウィンドウ・ペインに対して操作することで、自在に表示割り当てができます。
おおよそ1:n:m,,n,,の関係が作れると思って問題無いです。
厳密にはセッションも複数扱えますが、セッション間の移動は行えません。
あるセッションでオペレーションしていた画面(端末)で別のセッションのオペレーションをしていた…ということはありません。

{{{
+- セッション -----------+
|                        |
|  +- ウィンドウ -----+  |
|  |                  |  |
|  |  +- ペイン ---+  |  |
|  |  |            |  |  |
|  |  |            |  |  |
|  |  |            |  |  |
|  |  +------------+  |  |
|  |                  |  |
|  +------------------+  |
|                        |
+------------------------+
}}}

 * 「セッション」は tmux new で作成されるある種のコンテナ(tmux サーバープロセス)です。
 * これに画面であるところの「ウィンドウ」が割り当てられます。
 * またウィンドウ内に複数(1~)の「ペイン」を割り当てられます。
 * tmux の場合「ペイン」の操作が難しく感じることがあるのは、作成(分割)だけでなく位置・サイズの指定といった部分にあります。
 * 少しずつ整理すれば使いこなしは簡単です。