本站截圖背後那份 ~/.tmux.conf:為小螢幕、程式助手,以及手機和電腦同時掛著的情境調過。
撰寫於
tmux 的預設值是為桌上型電腦寫的:只掛一個用戶端,鍵盤上有一整排修飾鍵,執行的程式只輸出文字。放到手機上,這幾條沒有一條成立,螢幕小,往往還有一台手提電腦同時掛著,而裏面跑的越來越多是程式助手,它講的是顏色、圖片和 Shift+Enter,這些在原裝 tmux 下都活不下來。
這就是我們真正在用的那份檔案,不是入門範本:本站所有 tmux 截圖都是透過它拍的。整份拷走,或者只挑你要的部分,每一行都帶註解說明它換來了甚麼,下面幾節則解釋那些不太顯然的取捨。
##### 終端機能力 ##### # 終端機類型 + 24 位真彩色:沒有 RGB,漸變會有色帶 set -g default-terminal "tmux-256color" set -as terminal-features ",*:RGB" # 內嵌圖片(sixel、kitty、imgcat):否則會被 tmux 丟掉 set -g allow-passthrough on set -as terminal-features ",*:sixel" # 在 tmux 裏複製,直接進手機剪貼簿(OSC 52) set -g set-clipboard on # ……走 mosh 時也一樣。tmux 發這條 OSC 52 時不填目標,發出來是 52;;, # 而 mosh 只轉發 52;c;,所以沒有這一行,在 tmux 裏複製的內容只會進 # tmux 自己的貼上緩衝區,根本出不了伺服器。%p1 一定要留着:跳過它 # 直接寫 %p2 的寫法能正常載入,然後甚麼都不發 set -ag terminal-overrides ',*:Ms=\E]52;%p1%sc;%p2%s\a' # 讓 Ctrl+Shift+…、Shift+Enter 之類以 CSI u 形式穿過 tmux # (Claude Code 靠這個來實現 Shift+Enter 換行) set -s extended-keys on set -as terminal-features ",*:extkeys" set -g extended-keys-format csi-u # 別在 Esc 上等:預設那 500ms 會毀掉 Alt 組合鍵 set -sg escape-time 10 # 焦點事件和滑鼠(在終端機裏按住 Shift 可以本機選取) set -g focus-events on set -g mouse on # 把視窗標題轉發出來,終端機 App 才能為分頁命名 set -g set-titles on set -g set-titles-string "tmux · #{pane_title}" # 捲動回看行數:程式助手輸出很多,給它留夠 set -g history-limit 100000 ##### 手機 / 同時掛著多個用戶端 ##### # 視窗大小跟著「最近活動」的用戶端走:手機和電腦同時掛著時, # 誰在打字就按誰的螢幕來;小螢幕不會把版面鎖死 set -g window-size latest setw -g aggressive-resize on # 視窗和窗格從 1 開始編號,關掉後自動補號:手機鍵盤上 1 比 0 好按 set -g base-index 1 setw -g pane-base-index 1 set -g renumber-windows on # 關掉目前工作階段時跳到下一個,而不是直接 detach: # 從手機上重新連線很麻煩 set -g detach-on-destroy off # 提示訊息多留一會兒,小螢幕上才來得及看 set -g display-time 2000 set -g display-panes-time 2000 ##### 程式助手提醒 ##### # Claude Code 這類工具做完會響鈴:不要閃螢幕, # 只在狀態列把那個視窗標紅 set -g bell-action any set -g visual-bell off setw -g monitor-bell on # 背景視窗有新輸出 -> 狀態列亮黃色標記, # 一眼就能看出哪個程式助手還在跑、哪個已經停了 setw -g monitor-activity on set -g visual-activity off ##### 配色:只用 ANSI 16 色 + 透明背景,自動跟隨終端機的 ##### ##### 明暗主題 ##### # 訣竅:狀態列裏絕不寫死 RGB。bg=default 讓終端機背景透過來, # colour0-15 取自終端機自己的調色盤,終端機在明暗之間切換時, # tmux 會跟著一起換。 # 狀態列放在頂部,避開底部 Claude Code 的輸入框 set -g status-position top set -g status-interval 5 set -g status-style "bg=default,fg=default" # 左邊顯示工作階段名稱;右邊只在按住前綴鍵時顯示 ^B 提示 set -g status-left "#[fg=colour5,bold] #S #[default]" set -g status-left-length 20 set -g status-right "#{?client_prefix,#[fg=colour3 bold]^B ,}" set -g status-right-length 20 # 視窗列表:目前視窗用藍底塊,其它灰色;響鈴(!)紅色, # 有活動(#)黃色 # reverse 讓文字取終端機背景色,淺色主題下是深色字, # 深色主題下是淺色字,自己會適應 setw -g window-status-format " #I #W#{?window_flags,#{window_flags}, } " setw -g window-status-style "fg=colour8" setw -g window-status-current-format " #I #W " setw -g window-status-current-style "fg=colour4,bold,reverse" setw -g window-status-bell-style "fg=colour1,bold" setw -g window-status-activity-style "fg=colour3" # 窗格邊框、訊息、複製模式的選取樣式 set -g pane-border-style "fg=colour8" set -g pane-active-border-style "fg=colour4" set -g message-style "fg=colour4,bold,bg=default" set -g mode-style "bg=colour4,fg=colour0" set -g display-panes-colour colour8 set -g display-panes-active-colour colour4 setw -g clock-mode-colour colour4 ##### 快捷鍵 ##### setw -g mode-keys vi # 分割和新增視窗都繼承目前目錄:不用再 cd 回程式助手做事的地方 bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" bind c new-window -c "#{pane_current_path}" # Alt+數字直接跳視窗,不用按前綴鍵:手機上少按一次組合鍵 bind -n M-1 select-window -t 1 bind -n M-2 select-window -t 2 bind -n M-3 select-window -t 3 bind -n M-4 select-window -t 4 bind -n M-5 select-window -t 5 # 前綴鍵 + hjkl 在窗格之間移動 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 複製模式:v 開始選取,y 複製(經 OSC 52 送到手機/本機剪貼簿) bind -T copy-mode-vi v send -X begin-selection bind -T copy-mode-vi y send -X copy-selection-and-cancel # 前綴鍵 + t:彈出一個小終端機跑一次性指令,不打亂程式助手的版面; # exit 就關 bind t display-popup -E -w 80% -h 75% -d "#{pane_current_path}" # 前綴鍵 + r:重新載入設定 bind r source-file ~/.tmux.conf \; display "已重新載入 ~/.tmux.conf"
多工器夾在程式和 Term 之間,而原裝的它對「放甚麼過去」相當保守。allow-passthrough on 才能讓內嵌圖片顯示出來:sixel、kitty graphics 和 imgcat 都是以逸出序列送達的,否則會被 tmux 吞掉。terminal-features ",*:RGB" 恢復24 位色,沒有它,TUI 裏的漸變全是色帶。而 set-clipboard on 才讓複製模式裏按 y 直接進手機剪貼簿,走 OSC 52,伺服器上不用裝任何輔助程式。
三行 extended-keys 是這組裏最新、也最容易漏掉的。它讓 Ctrl+Shift+…、Shift+Enter 這類按鍵以 CSI u 形式穿過去,而不是被壓扁成普通按鍵。Claude Code 用 Shift+Enter 在提示詞裏換行;少了這幾行,這一下會變成普通 Enter,把寫到一半的提示詞直接送出。
set-clipboard 下面那行 terminal-overrides 只為一種組合而存在:在 mosh 工作階段裏跑 tmux。一條 OSC 52 要寫明它指的是哪個剪貼簿,而 tmux 把這個名字留空,發出來是 52;;;mosh 按字面只認 52;c;,於是一條都不轉發,你在 tmux 裏複製的內容落進 tmux 自己的貼上緩衝區就到頭了。這一行把名字釘成 c。格式裏的 %p1 即使取值被丟掉也必須留着:跳過它直接寫 %p2 的版本能正常載入,然後一個位元組都不發。
掛兩個用戶端時,原裝 tmux 會把每個視窗縮到最小的那個用戶端,手機一連上,200 欄的手提電腦就被壓到 56 欄,而且一直保持。window-size latest 改成按最近活動的用戶端來:在手提電腦上打字就用它的螢幕,拿起手機就為手機重排。aggressive-resize 對個別視窗做同樣的事。
detach-on-destroy off 也是同一個道理。關掉工作階段的最後一個窗格,原裝 tmux 會把你丟回對端的 shell:在手機上,這意味著你剛花二十秒建起來的那條連線。跳到下一個工作階段,人就還在裏面。
程式助手做完一輪會響鈴。monitor-bell 開、visual-bell 關,這一下就變成狀態列裏那個視窗名變紅,而不是在你正在看的螢幕上閃一下;monitor-activity 則把任何有輸出的視窗標成黃色。手機上同一時間只看得見一個視窗,狀態列是唯一能讓你分辨四個 agent 裏誰還在想、誰在等你的地方。
大多數 tmux 主題把十六進位顏色寫死,所以終端機一在明暗之間切換就不對勁了。這一份從不指定調色盤以外的顏色:bg=default 讓 Term 自己的背景透過狀態列,所有顏色都是 colour0–colour15,取自你在 App 裏選的那套主題。
結果就是一條會自己換主題的狀態列。在 Term 裏換主題,或者讓它跟著系統進深色模式,tmux 在同一次重繪裏就跟上了,不用重新載入設定,也不用再維護第二套配色。目前視窗上的 reverse 對文字用的是同一招:它拿終端機背景色當字色,於是淺底深字還是深底淺字,它自己會算。
這裏每一條綁定都在省掉一次組合鍵或一次跨鍵盤的移動。| 和 - 按它們長的樣子分割。前綴鍵 + hjkl 在窗格間移動,完全不用碰方向鍵。前綴鍵 + t 在目前窗格上彈出一個臨時小終端機(這是手機上對「我要跑一條指令,但不想打亂程式助手的版面」的答案),exit 就關。
切視窗是 tmux 裏最頻繁的操作,在手機上也最貴:前綴鍵再加一個數字,是兩層組合。bind -n 把前綴鍵整個去掉,而 Term 的按鍵列有一個黏滯 alt,於是它就變成兩次點擊。
分割和新增視窗那幾條綁定上的 -c "#{pane_current_path}",讓新窗格開在你已經在的那個目錄裏。沒有它,每次分割都從 $HOME 開始,而你在手機鍵盤上要打的第一樣東西就是一長串 cd。
~/.tmux.conf:不是手機上。tmux 在工作階段執行的那一端讀它。前綴鍵 + r 重新載入即可。tmux source-file ~/.tmux.conf
中間那步看著和重新載入的綁定重複,其實不是:前綴鍵 + r 沒法完成第一次載入。這個綁定要等檔案被讀過才存在,而 tmux 伺服端是在啟動時讀設定的,第一次的時候,那還早於檔案存在。於是唯一不能用快捷鍵完成的重新載入,恰恰是把這個快捷鍵裝上的那一次。另外注意 source-file 是 tmux 的指令而不是 shell 的:所以在這裏要在前面加 tmux,而在設定檔裏則不用。
還有兩件事得先確認,否則怎麼改都不生效:這份設定需要 tmux 3.4 或更新的版本,更舊的版本啟動時只會報一句「unknown option」,那條設定就靜默失效了,用 tmux -V 看一下你裝的是哪個。另外在 Debian 與 Ubuntu 上,第一行選用的 tmux-256color 這條 terminfo 描述並不隨 tmux 一起裝,而是在 ncurses-term 套件裏,記得一併裝上。
延伸閱讀: 在手機上用 tmux · SSH 自動恢復 · 常見問題