終端機會閃,這件事比 Claude Code 老得多。

它會閃是因為更新畫面的方式很土:要改哪裡,就把那一片重新刷一遍。刷得夠快、範圍夠小,你的眼睛接不到;刷得慢一點、範圍大一點,中間那一下空白就露出來了。平常沒人在意,因為平常的終端機一行印完就不動了,沒什麼好刷的。

Claude Code 不是那樣用終端機的。它一邊跑一邊改畫面:spinner 在轉,tool output 一段一段串進來,上面已經印過的東西還會回頭被改寫。那個「刷一遍」於是變成每秒好幾次,刷的還是一整片。捲動位置會自己跳回最上面,畫面會抖。官方點名三個地方最明顯:VS Code 內建終端機、tmux、iTerm2。這三個的共同點是算繪吞吐量本來就是瓶頸。

字吐出去之後就歸終端機管,所以 Claude Code 對「畫面現在長什麼樣」幾乎沒有控制權,它想改一行字,只能把整塊重印。閃就是這樣來的。

轉捩點是一個很老的招數

vim 開起來的時候,整個畫面會被換掉;離開的時候,原本那些東西原封不動回來。那叫 alternate screen buffer,htop 也是這樣。

終端機其實有兩塊畫布。一塊是你平常一行一行往下累積的那塊,另一塊是空的,整張借給程式去用。

拿收據紙跟白板來比就很清楚。第一塊畫布是收據紙,一張一張吐出來,吐出去就固定了,要改只能整捲重印。第二塊是白板,你可以只擦掉右下角那三個字,別的地方碰都不用碰。

全螢幕算繪就是搬到白板上去畫。文件另外提了一件更省事的做法:它只算繪當前可見的那幾則訊息。畫面外的不畫,所以每次更新送給終端機的資料量會少很多,長對話跑下去記憶體用量也維持平坦。至於少多少、平坦到什麼程度,文件一個數字都沒給,我也不補。

名字倒是先擋一下誤會。文件自己寫了一句:fullscreen 指的是 Claude Code 怎麼接管終端機的繪圖表面,就像 vim 那樣,跟把終端機視窗最大化完全無關,任何視窗大小都能用。

同一塊畫布可以被推向兩個相反的方向。這跟〈它把框線拆光,換成一行一行的字〉是同一個介面的兩篇:那篇是把 TUI 拆掉、換成印出去就不再動的純文字;這篇是把 TUI 推到極致、整張畫布拿去用。兩邊不可能同時成立,文件也就寫死了:螢幕閱讀器模式的其他 session 一律走傳統 renderer。

走到現在,這題可能已經替你答過了

三條路可以開:

1
2
3
/tui fullscreen     # 切到全螢幕:存下 tui 設定並帶著對話重啟,不會掉 context
/tui default # 切回傳統 renderer
/tui # 不帶參數:印出目前用的是哪個 renderer
1
2
CLAUDE_CODE_NO_FLICKER=1 claude          # 用環境變數啟用
CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1 # 強制傳統 renderer,無視存下的 tui 設定

/tui fullscreen 那句註解值得多看一眼:它是重啟,只是把對話一起帶過去。帶得過去的有螢幕上那份對話、permission mode 與 effort level、上次 /model 選的模型,還有 --allowed-tools--disallowed-tools--agent--agents--append-system-prompt--system-prompt-snapshot 這些旗標。

帶不過去的它會直接擋:用 --system-prompt 取代過系統提示、用 --tools 給過允許清單、或傳過 --setting-sources 的 session,切不過去,會吐 Cannot switch renderers in this session。hook 或 SDK permission update 只為這個 session 新增的 deny/ask 規則也一樣。這條在你「跑到一半想換」的時候最容易撞到,因為那些旗標是啟動當下打的,你多半已經忘了。

真正有意思的是預設值。文件給了一張九列的判定表,由上往下第一個符合者勝,其中兩列根本不問你的意見:這台機器第一次跑 Claude Code 的版本是 v2.1.239 或更新的(而且那個 session 不向 Anthropic 抓 feature flag)→ 全螢幕;會抓 feature flag、而你第一次用 Claude Code 是在 2026-05-06 當天或之後 → 也是全螢幕。文件沒有解釋為什麼是那一天,我也不替它編一個。

滑鼠是怎麼被收走的

要能點、能用滾輪捲,Claude Code 就得捕捉滑鼠事件。捕捉之後,終端機原生的 copy-on-select 就失效了。

這句話拆開來講會比較有感覺。你拖出來的那段選取,現在存在 Claude Code 裡,不在終端機的選取緩衝區。所以 tmux copy mode 看不到它,Kitty hints 看不到它,任何活在終端機那一層的工具都看不到它。文件說這是最常見的摩擦點,尤其在 SSH 或 tmux 裡,那正好是「終端機那一層」堆最多工具的地方。

以前的選取像貼在玻璃外側的便利貼,誰路過都撕得走。現在它貼在玻璃內側。

補償措施是一個修飾鍵。按住它拖,就是一次性的原生選取:

終端機 按住
Terminal.app Fn
iTerm2 Option
VS Code、Cursor、Devin Desktop Shift(macOS 開了 terminal.integrated.macOptionClickForcesSelection 的話也可用 Option
其他多數終端機 Shift

不想每次都按,可以兩段式關掉。第一段直接退出滑鼠捕捉:

1
CLAUDE_CODE_NO_FLICKER=1 CLAUDE_CODE_DISABLE_MOUSE=1 claude   # 完全退出滑鼠捕捉

關掉之後保留的是不閃爍算繪與平坦記憶體,鍵盤捲動(PgUpPgDnCtrl+HomeCtrl+End)照樣能用,終端機原生選取恢復。

失去的有四樣:點擊定位游標、點擊展開 tool output、點 URL,以及 Claude Code 裡的滾輪捲動。四樣一起收,沒得挑。

第二段溫和一點:

1
CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1    # 保留滾輪,只關掉 click / drag / hover(需 v2.1.195+)

兩個變數都設的時候 CLAUDE_CODE_DISABLE_MOUSE 優先。

還有一件事很少人會事先想到:複製這個動作現在有很多條路。macOS 走 pbcopy;Linux 在 Wayland 走 wl-copy、X11 走 xclipxsel(會同時寫 clipboard 與 PRIMARY selection,所以中鍵貼上有效);Windows 與 WSL 走 PowerShell 的 Set-Clipboard;在 tmux 裡另外寫一份 tmux paste buffer;走 SSH 的時候退回 OSC 52 escape sequence。每複製一次,Claude Code 會印一個 toast 告訴你剛剛走的是哪一條。

那個 toast 的存在本身就是答案。一個功能如果需要每次做完都回報自己走了哪條路,代表它的路不只一條,而且哪條會通不是你能事先知道的。以前不需要任何路:你放開滑鼠,字就在剪貼簿裡了,因為那件事根本不是程式做的。

OSC 52 這條路還有個現成的坑:iTerm2 預設把它擋掉,要到 Settings → General → Selection 打開「Applications in terminal may access clipboard」。在 iTerm2 裡跑 /terminal-setup 會幫你打開。

它有把東西還回去的動作

Ctrl+o 進 transcript mode,那裡是一套 less 式操作:/ 開搜尋、nN 跳下一個上一個(關掉搜尋列之後仍然有效)、jk 捲一行、gG 跳頂跳底、{} 在 prompt 之間跳、Ctrl+uCtrl+d 捲半頁。

真正重要的是兩個把主權交還的鍵。按 [,它把完整對話(所有 tool output 都展開)寫進終端機的原生 scrollback,寫完之後 Cmd+f、tmux copy mode 全部又吃得到了。長 session 會頓一下。這個狀態持續到你用 Escq 離開 transcript mode 為止,下次 Ctrl+o 得重來一次。按 v 則是寫到暫存檔,用 $VISUAL$EDITOR 開起來。

順著這條還有一件我沒預期的事:壓縮過之後,你仍然捲得回 session 最開頭。Claude 是從壓縮摘要繼續工作的,但 Claude Code 會跨多次壓縮,把每一則更早的訊息留在全螢幕的 scrollback 裡。這兩件事是分開的。模型記得什麼,跟你翻得到什麼,在這裡不是同一回事。

三條走不通的路

第一條在 MacBook 鍵盤上。它沒有獨立的 PgUpPgDnHomeEnd,要壓 Fn 配方向鍵(Fn+↑=PgUp、Fn+↓=PgDn、Fn+←=Home、Fn+→=End)。而 Ctrl+Fn+→ 在 macOS 上送不到 Claude Code,所以 MacBook 鍵盤預設沒有可用的「跳到底部」組合鍵。文件給三個替代:點 jump-to-bottom 按鈕、用滾輪捲到底、或者把 scroll:bottom 重新綁到你鍵盤送得出來的組合。

文件沒有把這段跟前面那段放在一起講,但疊起來看很明顯:前兩個替代都要滑鼠。你要是照上一節把 CLAUDE_CODE_DISABLE_MOUSE 開了,在 MacBook 上就只剩重綁鍵這一條路。

第二條在 JetBrains 的終端機。/scroll-speed 在那裡不可用,而且它會直接忽略 CLAUDE_CODE_SCROLL_SPEED,原因是它送滑鼠事件的速率比其他模擬器高很多。想調速度的話,其他地方是 export CLAUDE_CODE_SCROLL_SPEED=3(3 等於 vim 的預設,接受 0 到 20 的正值,可以寫 0.25 這種小數),或者跑 /scroll-speed 拉那把尺,兩者寫的是同一個值、持久化到 ~/.claude/settings.json。要注意對話框的上限是 10:環境變數設更高時對話框顯示 10,從對話框存檔就會被存成 10。

第三條是 iTerm2 的 tmux 整合模式。文件明講:不要在 tmux -CC 的 session 開全螢幕算繪。滾輪無效,雙擊還可能把終端狀態搞壞。在 iTerm2 裡跑一般 tmux(不加 -CC)沒問題。另外 tmux 本身要開 mouse mode(~/.tmux.confset -g mouse on 再重載),不然滾輪事件會被 tmux 吃掉;偵測到沒開的時候,Claude Code 啟動會提示一次。

滑鼠能點的東西是一版一版長出來的

v2.1.187

select menu 的選項可以點。

v2.1.208

multi-select 可以點。

v2.1.257

! 開頭的 shell 指令,輸出可以點開。

v2.1.271

/config 面板可以直接點值改設定,設定清單可以用滾輪捲。

開起來卻不是全螢幕的話

有一種狀況會讓你以為自己設錯了。Claude Code 對「全螢幕成功啟動」的定義是:畫出第一幀之後,再撐 10 秒,或者你用 /exit、Ctrl+C、Ctrl+D 結束它。

失敗一次,它印 Claude Code's fullscreen renderer didn't finish starting last time on this machine,下一個 session 仍然會再試。失敗兩次,它印 Claude Code's fullscreen renderer has repeatedly failed to start on this machine,然後一直用傳統 renderer,直到你更新 Claude Code 或跑一次 /tui fullscreen。而且之後不再印任何東西,你會安安靜靜地待在傳統模式裡。計數按版本分別算,一次成功就重設;設了 CLAUDE_CODE_NO_FLICKER=1 的 session 不計入。想確認自己是不是因為這個而在傳統模式,跑不帶參數的 /tuiCurrent renderer 那行會說明。

另一個會嚇到人的是畫面殘留舊字。全螢幕只送「兩幀之間改變的格子」,某些終端機(最常見是 Windows Terminal 與其他 ConPTY 後端)會把這些定位寫入合併錯,留下舊輸出的碎片,直到你改一次視窗大小。解法是 CLAUDE_CODE_ALT_SCREEN_FULL_REPAINT=1,每一幀重繪每一格。Windows 上背景 session 與 agent view 已經自動開了,只有你自己直接啟動的互動式全螢幕 session 才需要設。

兩邊的代價不對稱

先學那個修飾鍵,不要急著關滑鼠捕捉。

理由是兩邊的代價不對稱。修飾鍵的代價是你每次要原生選取時多按一顆鍵,而且只在那一次;CLAUDE_CODE_DISABLE_MOUSE 的代價是永久收掉四樣東西,其中「點擊展開 tool output」跟全螢幕的存在理由是綁在一起的——你當初就是為了畫面別跳、別閃才開它的,結果連帶把「看那一大坨輸出」的手段也關了。

會讓我改口的條件很具體,就藏在上面那張表的最後一列:「其他多數終端機」用 Shift。「多數」這兩個字是缺口。文件只逐一點名了四類終端機,你的那台要是把那個修飾鍵拿去做別的事了,或者它根本不在名單上、按下去沒反應,修飾鍵這條路就直接不成立。那種情況我會跳過整個第一段,直接上 CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1,保留滾輪,只關點擊,至少捲動還是自己的。

這篇裡每一條指令、環境變數、版本號都是從官方文件抄回來的,我只讀了文件,沒有實際跑過。開起來到底還閃不閃、[ 寫回 scrollback 那一下要頓多久、修飾鍵按著拖順不順手,我都說不準。文件自己標了這是 research preview,回報管道是 session 內的 /feedback,或者到 GitHub issues 開一則。文件要求附上終端機模擬器的名稱與版本,那個欄位看來不是隨便問的。

這條線每天都在往前推

回到那張判定表的第八列:會抓 feature flag、而且第一次用 Claude Code 在 2026-05-06 當天或之後的人,預設就是全螢幕。

這條規則只看「你什麼時候第一次用」,不看你現在怎麼想。意思是今天才開始用 Claude Code 的人,一進來就在白板上,很可能不知道自己在白板上,也不知道滑鼠已經交出去了——他不會覺得「拖不動」是被拿走的東西,他會以為終端機本來就這樣。等到哪天他 SSH 進一台機器想複製一段 log,那個修飾鍵才會變成他非學不可的東西。

至於那張表會不會有一天少掉幾列、/tui default 還留不留著,文件沒說。research preview 這個標籤的意思向來就是「還會改」。

資料來源:Fullscreen rendering — Claude Docs