← 文章

一鍵讓 tmux 變 IDE,外加十一件順手小插件

· 13 分鐘閱讀 · 360 次閱讀
tmux tmux plugin 開發環境 AI Agent 開源
半年份的 tmux 客製

一鍵讓 tmux 變 IDE,

外加十一件順手小插件

開一個專案,我每次都手動 split 三四刀:檔案樹一格、編輯一格、git 一格、AI 一格。拆到後來嫌煩,這半年堆在 tmux 設定裡的客製,一件一件抽成獨立插件,湊成十二個。這篇按痛點走,不逐件報菜名。哪個場景戳中你,就看那一段。

十二個 tmux 插件裝上前後的畫面對照
十二件裝上前後的對照

不用全裝。都走 TPM,長這樣:

# ~/.tmux.conf,放在 TPM 的 run 那行「上面」 set -g @plugin 'operonlab/tmux-workdesk' # 存檔後按 prefix + I(大寫)讓 TPM 下載

換掉 @plugin 後面那串就是別件——都住在 github.com/operonlab 底下,倉庫名就是插件名。(那頁還會列到 tmux-webui,那是把 pane 搬進瀏覽器的服務、不是 TPM 插件,這篇不談。)

開一個專案就是那四格:tmux-workdesk

按 prefix + i 後 tmux 一秒排成 IDE 版面
按 prefix + i,一秒排成 IDE 版面

游標停在任何專案目錄,按 prefix + i,畫面一秒排成 IDE 版面:左邊 yazi 檔案樹、中間打字、下面 lazygit、右邊 claude。再按一次跳回同一個 window,不會開第二個。每一格跑什麼、佔多寬都能改,@workdesk-main-cmd 'nvim' 這種一行搞定;某格設成空字串就跳過它。

prefix + g 是另一種排法,把當前視窗排成 2×2 田字格,還有直欄、橫列幾種可以自己綁鍵。這些排法只加格子不砍格子,切來切去原本那幾格會原地重排。

預設的 prefix + i 會蓋掉 tmux 內建顯示視窗資訊的鍵,介意的話用 @workdesk-ide-bind 換掉。

視窗卡在 80×24:tmux-autosize

tmux-autosize 在接上、改大小、切視窗、開視窗這幾個時機,把卡住的視窗收斂到客戶端的真實寬高,不放狀態列、不佔位置,只做這一件事。

但總有幾個 window 整個只有 80x24——裡面同樣切了三四格,每格剩二十來欄,什麼都讀不了,而且怎麼弄都不變大。多半是腳本或 agent 在背景開的,沒有客戶端看過它,生下來就是 tmux 的預設尺寸。

卡在 80x24 的視窗被自動收斂回正確大小
卡住的視窗被收斂回客戶端的真實寬高

我在 27 吋 2K 螢幕上跑 tmux、Dock 靠左,一個 window 有 356 欄寬,切成四格每格還有 88 欄——這是正常時候的樣子。

要老實講定位:如果你用 tmux 預設的 window-size latest,它只是一道保險絲,補的是背景視窗、attach 太早那些邊角;改成 window-size manual 之後才升格成主力。另外它在你捲動歷史時會延後改大小——改大小會逼 tmux 重排整份回捲,歷史一長很貴(上游有同類的凍結紀錄)。

mac mini 半夜卡死,AI 全部失憶:tmux-agent-resume

tmux-resurrect 救得回版面,救不回對話——tmux-agent-resume 補的就是這一層:存檔前記下每一格是哪個 AI、怎麼接回那場對話,還原後把接回指令打進去,讓 AI 從斷點續、不是從零開始。目前認得八個 CLI(Claude Code、Codex、Antigravity、Copilot、OpenCode、Kimi、Hermes、Qwen),各家把對話編號藏在不同地方。

tmux 重啟後每一格 AI 的對話被接回斷點
還原後把接回指令打進每一格,AI 從斷點續

會補這一層是因為一個很狼狽的晚上:書房那台常開的 mac mini 半夜卡死,背景的看門程式照設計把終端強制重啟。版面靠 tmux-resurrect 救回來了,裡面幾個 AI 助手卻全部失憶,忘了剛剛聊到哪——格子回來是空的,或 CLI 重開成全新空白 session。

得誠實講:tmux-agent-resume 會真的把指令打進你的窗格、按下 Enter。所以每條指令都先過白名單,形狀不對的一律丟掉,而且只對停在空提示符的格子動手;想先看它要打什麼可以開 @agent-resume-dry-run 1。代價是綁著八個第三方工具的介面,它們改我就得改;目前只支援 macOS。

剩下這幾件,看場景快速帶過

前面 workdesk、autosize、agent-resume 這三件是我最有感的,剩下九件各自解一個具體麻煩:右鍵選單、浮動終端、巢狀 tmux 搶鍵、狀態列數字。

1

慣用滑鼠、記不住快捷鍵

tmux-context-menu 把切分割、放大、關掉、改名搬到滑鼠右鍵,選單從你點的位置彈出來(不想用滑鼠就按 Alt+q)。跟前輩 jaclu/tmux-menus 走不同路:那個是鍵盤逐層的選單樹,這個刻意做窄,繞著「在哪點、選單就在哪」。

2

想要一個隨手的暫存終端

tmux-floatpane 按 prefix + t 從螢幕中央浮出一個小終端,再按一次收起來,裡面留著的東西下次還在。它是 omerxx/tmux-floax 的強化分支,原始設計與實作歸功於 Omer Hamerman;我只是用下來遇到幾個小毛病想乾淨修掉。因為改自 GPL-3.0 的作品,這個分支同樣是 GPL-3.0。

3

常 ssh 進遠端又在那頭開 tmux

兩層 tmux 會搶 Ctrl-b。tmux-passthrough 給一個「讓一下」鍵(預設 F12),按一下外層閉嘴、按鍵全落到內層,狀態列轉暖桃色提醒你在哪一層。它比前輩 tmux-suspend 多一道防呆:F12 只在這格真的是遠端連線時才動作,本機誤按什麼都不做。

4

想把系統數字擺進狀態列

tmux-sysmon 給你 CPU、記憶體、磁碟、網速四個 #{...} 佔位符,只吐純文字、配你自己的主題(macOS 上磁碟路徑要指到 /System/Volumes/Data 才量得準)。想多開一整排放這些環境資訊,tmux-pillbar 幫你在第一排底下再加一排、切左中右三格。它只是框架不是主題,顏色跟內容你自己帶。

tmux 裡右鍵選單在滑鼠點的位置彈出
右鍵選單就在滑鼠點的位置彈出

先講兩件給「終端裡同時跑一堆 AI CLI」的人,沒在跑就跳過。tmux-agent-status 在狀態列數出有幾個 AI 在忙、卡住等你點頭、或閒著;一個都沒跑,膠囊自己消失。tmux-llm-usage 把你接進來的用量、額度渲染上去——它不幫你抓數字,只給一份 JSON 約定加一個不卡頓的膠囊。

這兩顆膠囊加上前面的 agent-resume,是我自己寫的時候最沒有參考對象的三件。上面幾件我都能指出站在誰的肩膀上,這三件當時翻不到現成的就自己來。後來才知道同一塊有人在做——tmuxwatch 做純觀測的 TUI、harness-terminal 做會偵測「agent 在等你」的原生終端,切角跟我不一樣,但解的是同一批問題。沒找到不等於不存在,只是我當時沒翻到。

代價也是這三件最重:得追著八個第三方 AI 工具的介面跑,它們改我就得補。

一個翻歷史、一個看現在:tmux-agent-history / tmux-agent-dock

狀態列上的 agent-status、llm-usage 只說「有幾個在忙、幾個卡住」,這裡補的是下一步——那我要進哪一個。都不放狀態列,按一個鍵開一條全高的清單:一個翻過去、一個盯現在。

一條清單收齊各家 AI CLI 的歷史對話,選一列就在旁邊預覽那場對話
各家 CLI 的歷史對話收進同一條清單,選中就預覽

每家 CLI 把對話存在硬碟上,位置和格式各不相同——Claude Code 寫成一種 JSONL、Codex 又是另一套、Gemini 塞在別的資料夾。tmux-agent-history 把九家(Claude Code、Codex、Gemini、Copilot、OpenCode、Kimi、Hermes、agy、Qwen)掃進同一條清單,選哪一列就在旁邊預覽那場對話。想翻上週那段沒接完的討論,不用一個一個 CLI 開來找。它只讀檔案、不碰你正在跑的 agent。

當前視窗右緣拉出一條側欄即時列出每個正在跑的 agent,上方預覽選中那個的畫面,按 Enter 跳過去
右緣側欄列出正在跑的 agent,選中就預覽、⏎ 跳過去

tmux-agent-dock 在當前視窗右緣拉出一條側欄,即時列出這台 server 上每個正在跑的 agent,等你點頭的排前面。游標移到哪,上半部就換成那個 agent 的畫面;⏎ 跳過去、⌃x 終止它。狀態判斷跟 agent-status 那顆膠囊共用同一套,不另外跑背景程式、不存東西。

這兩件跟前面的 agent-status、llm-usage、agent-resume 同一個包袱:得認得各家 CLI 怎麼存歷史、畫面長什麼樣,多接一家就多補一份規則,目前也只在 macOS 驗過。

十二個插件功能對照

插件一句話最低 tmux授權
tmux-workdesk一鍵把當前專案排成 IDE 版面,另含田字格、直欄等幾何排法2.4MIT
tmux-autosize背景把卡在 80×24 之類的視窗收斂到正確大小3.0MIT
tmux-context-menutmux 裡右鍵叫出動作選單,就在滑鼠旁邊3.3aMIT
tmux-floatpane隨叫隨到的浮動 scratch 終端,內容留存3.3GPL-3.0
tmux-passthrough一鍵把控制權讓給遠端那層 tmux,不再搶鍵2.4MIT
tmux-sysmon狀態列顯示 CPU/記憶體/磁碟/網速四個讀數1.8MIT
tmux-pillbar多開一排狀態列,左中右三格塞你要的東西2.9MIT
tmux-agent-status狀態列數出有幾個 AI 在忙/卡住/閒著2.1MIT
tmux-llm-usage狀態列顯示你自己接進來的 AI 用量/額度1.8MIT
tmux-agent-resume重啟後把每一格 AI 的對話接回斷點(需 tmux-resurrect)1.9MIT
tmux-agent-history一條清單翻遍各家 AI CLI 存在硬碟上的歷史對話,選中就預覽1.9MIT
tmux-agent-dock右緣側欄即時列出正在跑的 agent,⏎ 跳過去、⌃x 終止1.9MIT

懶得挑:每天開專案、或想一次看多格,都是 workdesk(prefix + i 排 IDE、prefix + g 排田字格);尺寸老出包就 autosize;在跑一堆 AI 就最後那五件。只想裝一個又不想改習慣的話,autosize 最無痛。

工具

貼你的 .tmux.conf,看哪幾件裝得起來

上面那張表有十二個最低版本要對,一格一格看很煩。把 tmux -V 印出來那行跟你的 ~/.tmux.conf 貼進來,這裡用同一張表跑一次版本閘,順便掃本文列的那五個鍵(prefix + i、prefix + g、prefix + t、Alt+q、F12)有沒有跟你現有的綁鍵撞上,最後產一段可以直接貼進 conf 的 TPM 區塊。全部在你的瀏覽器裡跑,貼進來的東西不送去任何地方;conf 裡如果夾著 token、密碼或不想給人看的路徑,先刪掉再貼。

常數出處都在本文:十二件的最低 tmux 版本與授權逐格抄自〈十二個插件功能對照〉表,要掃的五個鍵是「帶走這段」那段 prompt 第 2 點自己列的,@workdesk-ide-bind、TPM 區塊要放在 run 那行上面、存檔後按 prefix + I,都是本文原話。平台限制本文只交代三件:agent-resume 與 agent-dock 寫「只支援 macOS」,agent-history 寫「只在 macOS 驗過」,其餘九件在 Linux/WSL 上怎樣本文沒提。它讀的是你貼進來那段字串,不是你的機器——沒跑過 tmux -V、沒看 TPM 裝了沒、不跟著 source-file 進別的檔,所以「沒掃到」有可能只是撞在另一個檔裡;綁鍵也可能來自你已裝的別的插件,那些行不在 conf 裡,這裡看不到。撞到時本文只給得出 workdesk 的改鍵選項名,floatpane、passthrough、context-menu 的改法要去各自 repo 查。上面「帶走這段」那段 prompt 讓 agent 去你機器上真的跑 tmux -V、真的讀 conf,比這裡準;這個工具的用處只在手邊沒有 agent 時立刻拿到答案,而且指得出撞在哪一行。

帶走這段

先在設定檔裡湊合,同一件事煩到第三次才值得抽成插件——這十二件沒有一件是先決定要做插件才動手的。多數是設定檔裡那幾行實在礙眼了才抽出來;少數幾件是真的出事逼出來的,像半夜那次重啟。反過來說,只煩過一次的事,寫進設定檔就夠了。

自己看不出哪件有用的話,把下面這段貼給你的 AI,讓它對照你的實際環境判斷。

# 複製給你的 AI Agent 我在看一篇文章〈一鍵讓 tmux 變 IDE,外加十一件順手小插件〉 (https://blog.joneshong.com/zh/blog/tmux-plugin-family), 作者把自己這半年的 tmux 客製抽成十二個插件。請幫我判斷哪幾件適合我,不用全裝。 清單(插件 → 解決什麼 → 最低 tmux 版本): - tmux-workdesk → 一鍵把專案排成 IDE 版面,另含田字格、直欄等排法 → 2.4 - tmux-autosize → 背景視窗卡在 80x24 這類錯誤尺寸時自動收斂 → 3.0 - tmux-context-menu → 右鍵在滑鼠位置叫出動作選單 → 3.3a - tmux-floatpane → 浮動的暫存終端,關掉再開內容還在 → 3.3(GPL-3.0) - tmux-passthrough → 巢狀 tmux 時一鍵把按鍵讓給內層 → 2.4 - tmux-sysmon → 狀態列顯示 CPU/記憶體/磁碟/網速 → 1.8 - tmux-pillbar → 多開一排狀態列,切左中右三格 → 2.9 - tmux-agent-status → 狀態列數出幾個 AI 在忙/卡住/閒著 → 2.1 - tmux-llm-usage → 狀態列顯示 AI 用量與額度(只給框架,不幫你抓數字)→ 1.8 - tmux-agent-resume → 重啟後把每格 AI 對話接回斷點(需 tmux-resurrect,只支援 macOS)→ 1.9 - tmux-agent-history → 一條清單翻遍各家 AI CLI 存在硬碟上的歷史對話,選中就預覽 → 1.9 - tmux-agent-dock → 右緣側欄即時列出正在跑的 agent,⏎ 跳過去、⌃x 終止(只支援 macOS)→ 1.9 請先查我的實際情況再判斷,不要憑一般情況回答: 1. 跑 `tmux -V` 看版本,版本不夠的直接排除 2. 讀我的 ~/.tmux.conf,我已經自己解過的就不用再裝; 順便檢查 prefix + i、prefix + g、prefix + t、Alt+q、F12 有沒有跟我現有的綁鍵衝突 3. 看我平常會不會在終端裡同時跑多個 AI CLI,沒有的話最後五件直接跳過 然後回我:哪幾件真的值得裝、理由是什麼、各自要付什麼代價。 如果一件都不適合,就直接說不適合,不要為了給我答案硬湊。

延伸閱讀

六個連結裡,三個是站上去的肩膀(tmux-floax、tmux-suspend、tmux-menus),其餘是 tmux-resurrect 與踩過的 issue、同類前輩。

資源為什麼重要
omerxx/tmux-floaxtmux-floatpane 的上游。浮動 scratch 終端的原始設計出自這裡,我的分支只把用下來卡到的幾個毛病修乾淨
MunifTanjim/tmux-suspend它開了「把整套 prefix 交給另一層」這條路,讓我看清 passthrough 該補的是「只在遠端格子才作用」那道防呆
jaclu/tmux-menus讓我想清楚 context-menu 該做窄:它走鍵盤選單樹,我走滑鼠右鍵原位,兩條路服務不同習慣
tmux-resurrect救版面的現成方案。正因為它只救版面不救對話,才逼出 agent-resume 那一層——直接掛在它的存檔/還原上
tmux/tmux#4814tmux 上游一類「改大小觸發整份回捲重排」的凍結。autosize 的「捲動時延後改大小」是對同類成本的保守閃避
tmux-plugins/tmux-cpu「改寫 status 裡的佔位符 token」這招 agent-status、sysmon 都沿用;也是 sysmon 老實承認的同品類前輩
✦ 帶走這段