# tmux

Tessera は tmux のコントロールモード（`tmux -CC`）をネイティブに話します。
ウインドウとペインはテキストのパススルーではなく、第一級のインターフェイス
要素です。サーバー側に `tmux` がインストールされている必要があります。

## なぜ tmux なのか

tmux に支えられたセッションでは、シェルはサーバー上にあります。Tessera を
閉じても、Wi-Fi が切れても、セルラーに切り替えても、デバイスをスリープさせて
も、作業が失われることはありません。再接続すれば、離れたときのままの場所に
います。

## アタッチする

**自動 tmux** の起動モードは、`tessera-XXXXXXXX` という決定的な名前を持つ
ホストごとのセッションにアタッチします（なければ作成します）。この名前は
アプリを再インストールしても記憶されます。**名前付き tmux** は、自分で選んだ
セッション名にアタッチします。どちらも[ホスト
エディタ](https://bambouville.com/docs/ja/connections/#起動モード)でホストごとに設定します。

名前が決定的であるということは、同じホストのエントリを使う 2 台のデバイスが
*同じ* tmux セッションにたどり着くということです。それが、デバイス間の
[セッションの引き継ぎ](https://bambouville.com/docs/ja/continuity/)をなめらかにしています。

tmux が立ち上がらない場合も、Tessera は待たせたままにはしません。tmux が
入っていないホスト、起動に失敗した tmux セッション、ログイン時にすでに
`exec tmux` する dotfiles — いずれの場合も素のシェルに落とし、理由を告げる
バナーを表示します（「このホストはログイン時に独自の tmux を起動します —
そのセッションを素のターミナルとして表示します」）。
[接続が進まないとき](https://bambouville.com/docs/ja/connections/#接続が進まないとき)を参照してください。

## ウインドウ

tmux のウインドウは、セッション上部のバーにインデックス順のタブとして並び
ます。バーの **+** ボタンで新しいウインドウが開きます。タブが収まりきらない
ときは、あふれた分のコントロールがすべてのウインドウを一覧します。各タブには
閉じるコントロールが付いており、ウインドウの名前は **⌘K** のパレットから
変更できます。この名前は、そのセッションにアタッチしているすべての
クライアントで共有されます。

| ショートカット | 動作 |
| --- | --- |
| **⌘T** | 新規ウインドウ |
| **⇧⌘W** | ペイン／ウインドウを閉じる |
| **⇧⌘[** / **⇧⌘]** | 前／次のウインドウ |
| **⌘1** – **⌘9** | ウインドウ 1〜9 へ移動 |

## ペイン

ペインは本物の tmux のペインで、コントロールモードを通じて操作されます。

| ショートカット | 動作 |
| --- | --- |
| **⌘D** | 左右に分割 |
| **⇧⌘D** | 上下に分割 |
| **⌘[** / **⌘]** | ペインを順に切り替え |
| **⇧⌘↩** | ペインのズーム／解除 |

![Tessera 上の tmux セッション。上部に 3 つのウインドウタブが並び、左右に 2 つのペインがある。左は git log の出力を表示するシェル、右は htop が動作中。](https://bambouville.com/docs/assets/img/tmux-panes.png)

*1 つの tmux ウインドウ内の 2 つのペインと、上部にタブとして並ぶセッションのウインドウ。各ペインは独自のタイトルバーと閉じるコントロールを持ちます。*


## iPhone では

iPhone からアタッチしても、レイアウトが組み直されることはありません。分割と
ズームの状態は大きい画面が残したままで、電話ではスイッチャーを通じて一度に
1 つのペインを表示します。[iPhone の tessera](https://bambouville.com/docs/ja/iphone/)を参照してください。

## mosh + tmux

mosh 経由では、ターミナルは UDP 上で動き、tmux のタブは 2 本目の SSH サイド
チャネルに乗ります。そのサイドチャネルは、mosh ホストの
[ポート転送](https://bambouville.com/docs/ja/port-forwarding/#mosh-と転送)や
[本物のスクロールバック](https://bambouville.com/docs/ja/mosh/#本物のスクロールバック)も運びます。

## ベル

Tessera がターミナルのベルを[通知](https://bambouville.com/docs/ja/notifications/)へ振り分けられるのは、
tmux のコントロールモードの配線があるからです。ウインドウ単位で、鳴った
タブに印が付きます。

## 落とし穴

- 環境変数と起動スニペットは、tmux セッションが開始するときにだけ実行
  されます。変更したあとは、サーバー上でセッションを終了させて
  （`tmux kill-session`）変更を取り込んでください。
- Tessera とほかのクライアントから同時にアタッチすることもできますが、
  どちらのクライアントも同じウインドウを共有します。これは tmux の仕様で
  あってバグではありません。相手のクライアントが自分の iPhone や iPad の
  場合、Tessera は競合を丁寧に扱います —
  [操作を取り戻す](https://bambouville.com/docs/ja/continuity/#操作を取り戻す)を参照してください。
- 激しい再描画のあとに出力が詰まったように見えるときは、**⌘R**（iPad）で
  全体を描き直せます。また、セッションがアタッチしても描画されないことが
  あれば、Tessera がそう伝えます（「任意のキーを押して表示させてください」）。
  最初のキー入力で画面が現れます。
