# mosh

mosh は、ネットワークが協力してくれないときでもセッションを生かし続けます。Wi-Fi
からモバイル通信に切り替える、ふたを閉じる、電波の届かない場所へ歩いていく —
再接続すれば、セッションはそのまま残っています。Tessera はこれに、iOS の他のどの
mosh クライアントも備えていないものを組み合わせました。**本物のスクロールバック**
です。

mosh を使うには、ホストに`mosh-server`がインストールされていること、そして初期
設定では UDP ポート 60000〜61000 が開いていることが必要です。ホストごとの選択は、
[ホストエディタのトランスポート設定](https://bambouville.com/docs/ja/connections/#トランスポート-ssh-か-mosh-か)で
行います。

## ローミング

mosh のセッションは、ネットワーク経路ではなく利用者の識別情報に紐づいています。
Wi-Fi ↔ モバイル通信の切り替え、アドレスの変更、スリープと復帰をまたいでも
Tessera はアタッチしたままで、セッションはパケットが途切れたところから続きます。
VPN や tailnet 越しでも同じように動作します。mosh に必要なのは、サーバーに届く
UDP だけです。

## 本物のスクロールバック

素の mosh にスクロールバックはありません。設計上、同期されるのは表示中の画面だけ
で、流れて消えたものは送られません。iOS の他の mosh クライアントはいずれもこの
制限を受け継いでおり、tmux の copy-mode を使うよう案内されます。

Tessera はその代わりに履歴を組み立てます。tmux 上で動く mosh セッションでは、
ターミナルは UDP に乗り、2 本目の SSH サイドチャネルが tmux と話します。上に
スクロールすると、そのチャネルを通じて本物の履歴が取り込まれ、その場に表示され
ます。[ターミナル内を検索](https://bambouville.com/docs/ja/keyboard/#ターミナル内を検索)で検索でき、選択もでき、
欠けもありません。

![Tessera の mosh セッションで、長い git log をさかのぼった画面。コミットメッセージと diffstat が完全に描画され、その下にシェルのプロンプトが見えています。](https://bambouville.com/docs/assets/img/mosh-scrollback.png)

*git log の奥までさかのぼった mosh セッション — 素の mosh なら捨てていたはずの履歴です。*

読んでいる間の挙動は次のとおりです。

- 上にスクロールすると、履歴が**その場で固定**されて現れます。新しい出力に下まで
  引き戻されることはありません。
- 一番下に戻る（または入力する）と、オーバーレイが消えて最新の画面に戻ります。
- 勢いよくフリックしてもそのまま流れ続けます。最初のページはすぐに読み込まれ、
  残りの履歴はその後ろから、サーバーが保持している範囲まで順に届きます。

## 必要なもの

- **tmux の起動モード。** スクロールバックの組み立てが働くのは、**自動 tmux** と
  **名前付き tmux** のセッションです（自動 tmux が既定です）。カスタムコマンドで
  起動した mosh ホストには問い合わせる tmux がないため、素の mosh と同じ
  スクロールになります。
- **サーバー側の履歴。** さかのぼれる深さは、サーバー側の tmux の
  `history-limit`に制限されます。Tessera が表示できるのは、tmux が保持していた分
  だけです。
- **プライマリスクリーン。** `vim`、`less`、`htop`のような全画面プログラムは、
  スクロールを自分で処理します。Tessera は他のターミナルと同じく、スクロール操作を
  入力としてそれらに渡します。

## mosh とそれ以外

履歴を取ってくるのと同じ SSH サイドチャネルは、mosh のホストでは
[tmux のウインドウとペイン](https://bambouville.com/docs/ja/tmux/)や
[ポート転送](https://bambouville.com/docs/ja/port-forwarding/#mosh-と転送)も運びます。
[ファイルパネル](https://bambouville.com/docs/ja/files/)は独自の SSH の橋を開くため、ファイル転送とトンネルは
mosh でも素の SSH でも同じように機能します。

1 つ注意点があります。**mosh の UDP は SSH の踏み台ホストを越えられません**。
[踏み台チェーンを経由するホスト](https://bambouville.com/docs/ja/connections/#踏み台ホスト)では、Tessera はまず
mosh を試し、UDP でサーバーに到達できなければ SSH にフォールバックします。VPN や
tailnet 経由などで元々 UDP が届く相手なら、そのまま mosh として動き続けます。
