bambouville

mosh

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

mosh を使うには、ホストにmosh-serverがインストールされていること、そして初期 設定では UDP ポート 60000〜61000 が開いていることが必要です。ホストごとの選択は、 ホストエディタのトランスポート設定で 行います。

ローミング

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

本物のスクロールバック

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

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

Tessera の mosh セッションで、長い git log をさかのぼった画面。コミットメッセージと diffstat が完全に描画され、その下にシェルのプロンプトが見えています。
git log の奥までさかのぼった mosh セッション — 素の mosh なら捨てていたはずの履歴です。

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

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

必要なもの

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

mosh とそれ以外

履歴を取ってくるのと同じ SSH サイドチャネルは、mosh のホストでは tmux のウインドウとペインポート転送も運びます。 ファイルパネルは独自の SSH の橋を開くため、ファイル転送とトンネルは mosh でも素の SSH でも同じように機能します。

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