# tmux

Tessera 原生支援 tmux 的控制模式（`tmux -CC`）：視窗和窗格是第一級的介面元素，
而非文字透傳。它需要伺服器上已安裝 `tmux`。

## 為什麼要用 tmux

在以 tmux 為後盾的工作階段中，shell 執行在伺服器上。關閉 Tessera、失去 Wi-Fi、
切換到行動網路、讓裝置睡眠 —— 這些都不會終結你的工作。重新連線後，你會回到
離開時的位置。

## 接入

**自動 tmux** 啟動模式會接入（或建立）該主機專屬的工作階段，名稱為決定性的
`tessera-XXXXXXXX`，並在 App 重新安裝後仍會記住。**具名 tmux** 則接入你指定
名稱的工作階段。兩者都在[主機編輯器](https://bambouville.com/docs/zh-hant/connections/#啟動模式)中依主機設定。

決定性的名稱意味著，使用同一筆主機項目的兩台裝置會進入*同一個* tmux 工作階段
—— 這正是在兩者之間[接續工作階段](https://bambouville.com/docs/zh-hant/continuity/)如此順暢的原因。

如果 tmux 起不來，Tessera 不會讓你乾等：主機未安裝 tmux、tmux 工作階段啟動失敗，
或 dotfiles 在登入時已經 `exec tmux`，這些情況都會把你帶進一個純 shell，並附上
說明原因的橫幅（「此主機在登入時會自行啟動 tmux —— 將該工作階段作為純終端機
顯示」）。詳見
[連線卡住時](https://bambouville.com/docs/zh-hant/connections/#連線卡住時)。

## 視窗

tmux 視窗以分頁形式出現在工作階段的頂欄中，依索引順序排列。列上的 **+**
按鈕可開啟新視窗；當分頁多到放不下時，一個溢位控制項會列出所有視窗。每個分頁都
帶有關閉控制項，而視窗可以從 **⌘K** 面板重新命名 —— 該名稱對接入此工作階段的
所有用戶端都生效。

| 快速鍵 | 操作 |
| --- | --- |
| **⌘T** | 新增視窗 |
| **⇧⌘W** | 關閉窗格 / 視窗 |
| **⇧⌘[** / **⇧⌘]** | 上一個 / 下一個視窗 |
| **⌘1** – **⌘9** | 跳至視窗 1–9 |

## 窗格

窗格就是真正的 tmux 窗格，透過控制模式驅動。

| 快速鍵 | 操作 |
| --- | --- |
| **⌘D** | 左右分割 |
| **⇧⌘D** | 上下分割 |
| **⌘[** / **⌘]** | 循環切換窗格 |
| **⇧⌘↩** | 縮放 / 還原窗格 |

![Tessera 中的一個 tmux 工作階段，頂部橫排三個視窗分頁，下方是兩個左右並排的窗格：左邊是顯示 git log 輸出的 shell，右邊是執行中的 htop。](https://bambouville.com/docs/assets/img/tmux-panes.png)

*同一個 tmux 視窗中的兩個窗格，工作階段的視窗以分頁形式列在上方。每個窗格都有自己的標題列和關閉控制項。*


## 在 iPhone 上

從 iPhone 接入絕不會重排你的版面：分割和縮放狀態會維持大螢幕留下的樣子，
而手機透過切換器一次顯示一個窗格。詳見[iPhone 上的 tessera](https://bambouville.com/docs/zh-hant/iphone/)。

## mosh + tmux

在 mosh 之下，終端機跑在 UDP 上，而 tmux 分頁則搭乘第二條 SSH 側通道。對 mosh
主機而言，這條側通道同樣負責承載
[連接埠轉發](https://bambouville.com/docs/zh-hant/port-forwarding/#mosh-與轉發) —— 以及
[真正的回捲緩衝](https://bambouville.com/docs/zh-hant/mosh/#真正的回捲緩衝)。

## 響鈴

正是 tmux 控制模式的接線，讓 Tessera 能把終端機響鈴導向
[通知](https://bambouville.com/docs/zh-hant/notifications/) —— 以視窗為單位，並標記發出響鈴的分頁。

## 注意事項

- 環境變數和啟動指令片段只在 tmux 工作階段啟動時執行。變更之後，請在伺服器上
  結束該工作階段（`tmux kill-session`）才能套用更改。
- 同時從 Tessera 和另一個用戶端接入是可行的，但兩個用戶端會共用相同的視窗 ——
  這是 tmux 的行為，不是錯誤。當另一個用戶端是你自己的 iPhone 或 iPad 時，
  Tessera 會妥善處理這種競用 —— 詳見[取回控制權](https://bambouville.com/docs/zh-hant/continuity/#取回控制權)。
- 如果在大量重繪之後輸出看起來卡住了，**⌘R**（iPad）會強制完整重繪。而如果
  工作階段接入後畫面始終沒有繪製，Tessera 會告訴你（「按任意鍵將其喚醒」）——
  你的第一次按鍵就會讓畫面出現。
