Bỏ qua để đến nội dung

Fullscreen rendering

Bài viết được dịch tự động từ bài viết gốc, chưa được kiểm tra lại bởi con người. Chỉ những bài viết có dấu tick xanh cạnh tiêu đề là đã được kiểm tra.

Fullscreen rendering là một cách render thay thế cho Claude Code CLI, loại bỏ nhấp nháy, giữ bộ nhớ ổn định trong cuộc trò chuyện dài, và thêm hỗ trợ chuột. Nó vẽ giao diện trên alternate screen buffer của terminal, giống vim hay htop, và chỉ render những tin nhắn đang hiển thị. Điều này giảm lượng dữ liệu gửi tới terminal mỗi lần cập nhật.

Khác biệt rõ nhất ở các terminal emulator nơi thông lượng render là nút thắt cổ chai, như VS Code integrated terminal, tmux, và iTerm2. Nếu vị trí scroll của terminal nhảy về đầu trong lúc Claude đang làm việc, hoặc màn hình chớp nháy khi tool output stream vào, chế độ này giải quyết đúng những vấn đề đó.

Chạy /tui fullscreen trong bất kỳ cuộc trò chuyện Claude Code nào. CLI lưu setting tui và khởi động lại vào fullscreen với cuộc trò chuyện nguyên vẹn, nên bạn có thể chuyển giữa chừng session mà không mất context. Chạy /tui default để quay lại renderer cổ điển, hoặc /tui không tham số để in renderer nào đang hoạt động.

Trong screen reader mode, Claude Code luôn dùng renderer cổ điển, trừ trong background session đã attach - các phiên đó vẫn render fullscreen. Nếu bạn chạy /tui fullscreen ở bất kỳ session nào khác, Claude Code in ra lời giải thích thay vì chuyển đổi, và không đổi setting tui đã lưu.

Session khởi động lại giữ nguyên cuộc trò chuyện đúng như nó hiển thị trên màn hình. Claude Code cũng mang theo model bạn chọn gần nhất bằng /model. Nếu bạn chạy /rewind trước đó trong session, session khởi động lại tiếp tục từ điểm rewind thay vì transcript dài hơn đã lưu trên đĩa. Nếu bạn rewind về trước tin nhắn đầu tiên, session khởi động lại bắt đầu trống.

Bạn cũng có thể đặt biến môi trường CLAUDE_CODE_NO_FLICKER trước khi khởi động Claude Code:

Terminal window
CLAUDE_CODE_NO_FLICKER=1 claude

Setting tui và biến môi trường này tương đương nhau. Lệnh /tui xoá CLAUDE_CODE_NO_FLICKER khỏi process khởi động lại, để setting nó ghi có hiệu lực.

Fullscreen rendering đổi cách CLI vẽ lên terminal. Ô input đứng cố định ở đáy màn hình thay vì di chuyển khi output stream vào - nếu ô input không di chuyển trong lúc Claude đang làm việc, fullscreen rendering đang hoạt động. Chỉ tin nhắn đang hiển thị được giữ trong render tree, nên bộ nhớ không đổi bất kể cuộc trò chuyện dài bao nhiêu.

Vì cuộc trò chuyện sống trong alternate screen buffer thay vì scrollback của terminal, vài thứ hoạt động khác đi:

TrướcBây giờChi tiết
Cmd+f hoặc tmux search để tìm textCtrl+o vào transcript mode, rồi / để search hoặc [ để ghi ra scrollbackTìm kiếm và xem lại cuộc trò chuyện
Click-and-drag native của terminal để chọn/copyChọn trong app, tự copy khi thả chuộtDùng chuột
Cmd-click để mở URLCmd-click trên macOS, Ctrl-click nơi khácDùng chuột

Nếu việc bắt sự kiện chuột gây vướng cho workflow của bạn, xem Giữ text selection native để tắt trong khi vẫn giữ render không nhấp nháy.

Fullscreen rendering bắt sự kiện chuột và xử lý bên trong Claude Code:

  • Click vào prompt input để đặt con trỏ ở bất kỳ đâu trong text đang gõ.
  • Click gợi ý trong danh sách lệnh / hoặc @ file để chấp nhận. Hover highlight hàng dưới con trỏ.
  • Click option trong select menu để chọn - bao gồm permission prompt, /model, /config, và các dialog liệt kê tuỳ chọn khác. Hover hiện con trỏ pointer trên hàng đó.
  • Click option trong multi-select menu để toggle, và click nút submit để xác nhận. Click một hàng nhập text tự do, như hàng Other trong câu hỏi nhiều lựa chọn, focus vào ô input để bạn gõ.
  • Click một kết quả tool đã thu gọn để mở rộng và xem toàn bộ output. Click lại để thu gọn. Tool call và kết quả của nó mở rộng cùng nhau. Chỉ tin nhắn có thêm nội dung mới click được.
  • Giữ Cmd trên macOS, hoặc Ctrl trên Linux/Windows, rồi click URL hoặc file path để mở. URL http:///https:// mở trong trình duyệt, file path trong tool output (như path in ra sau một lần Edit/Write) mở bằng ứng dụng mặc định. Click thường không kèm modifier sẽ không mở link, khớp hành vi native của terminal.
    • Claude Code render network path (UNC) như \\server\share\file.ts dạng plain text, không tạo link, vì mở network path có thể gửi credential Windows của bạn tới host được nêu.
    • Một số terminal macOS forward Cmd+click cho app đang chạy thay vì tự mở link, và mouse protocol của terminal không mã hoá được phím Cmd, nên Claude Code chỉ nhận một click thường. Ở Ghostty, và Warp trên macOS, Claude Code phát hiện việc này và cho phép click thường mở link, giữ Cmd vẫn hoạt động.
    • Trong VS Code integrated terminal và các terminal dựa trên xterm.js tương tự, Claude Code nhường cho link handler riêng của terminal, dùng cùng thao tác.
  • Click và kéo để chọn text ở bất kỳ đâu trong cuộc trò chuyện. Double-click chọn một từ, khớp ranh giới từ của iTerm2 nên một file path được chọn như một khối. Double-click một URL chọn cả URL, kể cả scheme. Triple-click chọn cả dòng.
  • Cuộn bằng bánh xe chuột để di chuyển qua cuộc trò chuyện.

Text được chọn tự copy vào clipboard khi thả chuột. Để tắt, chuyển “Copy on select” thành off trong /config.

Với Copy on select tắt, nhấn Ctrl+Shift+c để copy thủ công. Trên terminal hỗ trợ kitty keyboard protocol như kitty, WezTerm, Ghostty, và iTerm2, Cmd+c cũng dùng được. Nếu bạn đang có vùng chọn, Ctrl+c copy thay vì huỷ.

Với vùng chọn đang active, giữ Shift và nhấn phím mũi tên để mở rộng bằng bàn phím. Shift+↑/Shift+↓ cuộn viewport khi vùng chọn chạm mép trên/dưới. Shift+Home/Shift+End mở rộng tới đầu/cuối dòng hiện tại.

Fullscreen rendering xử lý scroll bên trong app. Dùng các shortcut sau để di chuyển:

ShortcutHành động
PgUp / PgDnCuộn lên/xuống nửa màn hình
Ctrl+HomeNhảy về đầu cuộc trò chuyện
Ctrl+EndNhảy về tin nhắn mới nhất và bật lại auto-follow
Bánh xe chuộtCuộn vài dòng mỗi lần

Bạn có thể cuộn ngược về đầu session kể cả sau compaction. Claude tiếp tục làm việc từ bản tóm tắt compaction, nhưng Claude Code vẫn giữ mọi tin nhắn cũ trong scrollback fullscreen qua nhiều lần compaction lặp lại.

Trên bàn phím không có phím PgUp, PgDn, Home, End riêng (như bàn phím MacBook), giữ Fn với phím mũi tên: Fn+↑ gửi PgUp, Fn+↓ gửi PgDn, Fn+← gửi Home, Fn+→ gửi End. Ctrl+Fn+→ không tới được Claude Code trên macOS, nên bàn phím MacBook mặc định không có tổ hợp nhảy-xuống-cuối nào hoạt động. Thay vào đó, dùng một trong các cách sau:

  • Click nút jump-to-bottom.
  • Cuộn xuống cuối bằng bánh xe chuột để tiếp tục theo dõi.
  • Rebind scroll:bottom sang một tổ hợp bàn phím bạn gõ được.

Các action này đều rebind được. Xem Scroll actions để biết danh sách đầy đủ tên action, gồm cả biến thể nửa trang/toàn trang chưa có binding mặc định.

Cuộn lên tạm dừng auto-follow để output mới không kéo bạn về cuối. Một nút Jump to bottom nổi ở mép dưới transcript khi bạn đang cuộn lên, và hiện số đếm như 3 new messages khi có output mới. Click nút đó, nhấn Ctrl+End, hoặc cuộn xuống cuối để tiếp tục theo dõi.

Trong lúc auto-follow tạm dừng, view cũng giữ nguyên vị trí bạn đã cuộn tới khi một phản hồi stream xong.

Gợi ý phím trên nút phản ánh đúng những gì bàn phím bạn gửi được. Trên macOS nút gợi ý click, hoặc Fn+↓ để cuộn, vì Ctrl+End không tới được Claude Code từ bàn phím Mac. Rebind scroll:bottom và nút sẽ hiện đúng tổ hợp phím của bạn trên mọi nền tảng.

Trên terminal quá hẹp để hiện đủ nhãn, nút rút gọn gợi ý thay vì wrap xuống hàng transcript bên dưới.

Để tắt hẳn auto-follow, sao cho view không bao giờ tự nhảy, mở /config và đặt Auto-scroll thành off. Với auto-scroll tắt, view không bao giờ tự nhảy xuống cuối. Permission prompt và các dialog cần phản hồi vẫn tự cuộn vào tầm nhìn bất kể setting này.

Cuộn bằng bánh xe chuột cần terminal của bạn forward mouse event cho Claude Code. Hầu hết terminal làm việc này bất cứ khi nào một ứng dụng yêu cầu. iTerm2 đặt nó thành setting theo từng profile: nếu bánh xe không có tác dụng gì nhưng PgUp/PgDn vẫn hoạt động, mở Settings → Profiles → Terminal và bật “Enable mouse reporting”. Cùng setting này cũng cần để click-to-expand và chọn text hoạt động.

Nếu cuộn bằng bánh xe chuột chậm, terminal của bạn có thể đang gửi một sự kiện scroll cho mỗi nấc vật lý mà không có hệ số nhân. Một số terminal, như Ghostty và iTerm2 với faster scrolling bật sẵn, đã tự khuếch đại wheel event. Một số khác, gồm VS Code integrated terminal, gửi đúng một event mỗi nấc. Claude Code không phát hiện được sự khác biệt này.

Đặt CLAUDE_CODE_SCROLL_SPEED để nhân khoảng cách cuộn cơ bản:

Terminal window
export CLAUDE_CODE_SCROLL_SPEED=3

Giá trị 3 khớp mặc định của vim và các ứng dụng tương tự. Setting chấp nhận bất kỳ giá trị dương nào tới 20, kể cả giá trị thập phân dưới 1 như 0.25 để làm chậm accelerated trackpad/wheel scrolling ở các terminal đã tự khuếch đại sẵn.

Để chỉnh tốc độ scroll tương tác, chạy /scroll-speed. Dialog hiện một thước đo bạn có thể cuộn thử trong lúc mở để cảm nhận thay đổi ngay lập tức. Nhấn / để chỉnh tốc độ, r để reset về mặc định tự phát hiện, Enter để lưu. Dialog nhảy theo số nguyên tới 10, và trên terminal hỗ trợ điều khiển tinh hơn còn có bước một-phần-tư xuống tới 0.25. Tối đa của dialog là 10: nếu bạn đặt giá trị cao hơn qua biến môi trường, dialog hiện 10, và lưu từ dialog sẽ ghi 10. Lệnh này không khả dụng trong terminal IDE JetBrains.

Ngoài tốc độ cơ bản, Claude Code tăng tốc độ cuộn khi bạn xoay bánh xe nhanh, nên một cú xoay nhanh đi được quãng xa hơn cùng số nấc chậm. Để tắt gia tốc và giữ tốc độ cố định mỗi nấc, đặt wheelScrollAccelerationEnabled thành false trong settings.json.

Trong terminal IDE JetBrains, Claude Code tự xử lý scroll riêng và bỏ qua CLAUDE_CODE_SCROLL_SPEED. Terminal này gửi scroll event ở tốc độ cao hơn hẳn các emulator khác, nên một hệ số nhân chỉnh cho nơi khác sẽ vọt quá đà ở đây.

Ở phiên bản 2025.2, terminal này còn có bug scroll-wheel gây ra phím mũi tên giả và event sai chiều. Claude Code phát hiện các bug này lúc runtime và tự khắc phục, nên trackpad/mouse wheel scroll hoạt động không cần cấu hình gì. Để có trải nghiệm scroll tốt nhất, nâng cấp lên 2025.3 trở lên. Claude Code hiện gợi ý ở lần cuộn đầu tiên nếu phát hiện bug này.

Ctrl+o chuyển đổi giữa prompt bình thường và transcript mode.

Để có view gọn hơn, chỉ hiện prompt cuối, tóm tắt một dòng các tool call kèm diffstat, và phản hồi cuối, chạy /focus. Setting này giữ lại qua các session. Chạy /focus lần nữa để tắt.

Transcript mode có điều hướng và search kiểu less:

PhímHành động
/Mở search. Gõ để tìm kết quả, Enter để chấp nhận, Esc để huỷ và khôi phục vị trí scroll
n / NNhảy tới kết quả tiếp/trước. Hoạt động sau khi bạn đã đóng thanh search
j / k hoặc / Cuộn một dòng
g / G hoặc Home / EndNhảy đầu/cuối
{ / }Nhảy tới prompt trước/sau
Ctrl+u / Ctrl+dCuộn nửa trang
Ctrl+b / Ctrl+f hoặc Space / bCuộn cả trang
Ctrl+o, Esc, hoặc qThoát transcript mode, quay lại prompt

Cmd+f và tmux search của terminal bạn không thấy được cuộc trò chuyện vì nó sống trong alternate screen buffer, không phải scrollback gốc. Để trả nội dung về cho terminal xử lý, nhấn Ctrl+o vào transcript mode trước, rồi:

  • [: ghi toàn bộ cuộc trò chuyện vào native scrollback của terminal, với mọi tool output đã mở rộng. Cuộc trò chuyện giờ là plain text bình thường trong terminal, nên Cmd+f, tmux copy mode, và bất kỳ tool native nào khác đều search/chọn được. Session dài có thể khựng lại một chút trong lúc này diễn ra. Trạng thái này kéo dài tới khi bạn thoát transcript mode bằng Esc hoặc q, quay lại fullscreen rendering. Lần Ctrl+o tiếp theo bắt đầu lại từ đầu.
  • v: ghi cuộc trò chuyện vào file tạm và mở bằng $VISUAL hoặc $EDITOR.

Nhấn Ctrl+L hai lần trong hai giây để chạy /clear và bắt đầu cuộc trò chuyện mới. Lần nhấn đầu redraw màn hình và hiện gợi ý; lần thứ hai xoá cuộc trò chuyện. Trên macOS, nhấn Cmd+K hai lần cũng chạy /clear.

Fullscreen rendering hoạt động trong tmux, với ba lưu ý.

Cuộn bằng bánh xe chuột cần chế độ mouse mode của tmux. Nếu ~/.tmux.conf chưa bật sẵn, thêm dòng này rồi reload cấu hình:

Terminal window
set -g mouse on

Không có mouse mode, wheel event đi tới tmux thay vì Claude Code. Cuộn bằng bàn phím với PgUp/PgDn vẫn hoạt động dù có hay không. Claude Code in một gợi ý một lần lúc khởi động nếu phát hiện tmux với mouse mode đang tắt.

Fullscreen rendering không tương thích với chế độ tmux integration của iTerm2, chế độ bạn vào bằng tmux -CC. Ở chế độ integration, iTerm2 render mỗi pane tmux thành một split native thay vì để tmux tự vẽ lên terminal. Alternate screen buffer và mouse tracking không hoạt động đúng ở đó: bánh xe chuột không có tác dụng, và double-click có thể làm hỏng trạng thái terminal. Đừng bật fullscreen rendering trong session tmux -CC. tmux thường bên trong iTerm2, không dùng -CC, hoạt động bình thường.

Các bản tmux đến 3.6 chưa hỗ trợ synchronized output, nên ở các phiên bản đó bạn có thể thấy nhấp nháy nhiều hơn khi redraw so với chạy Claude Code trực tiếp trong terminal. Claude Code dò terminal để tìm hỗ trợ synchronized output lúc khởi động và dùng khi terminal báo có hỗ trợ. Nếu bạn thấy nhấp nháy trong tmux, nâng cấp lên bản tmux mới nhất hoặc chạy Claude Code ở tab terminal riêng ngoài tmux.

Bắt sự kiện chuột là điểm gây vướng phổ biến nhất, nhất là qua SSH hoặc trong tmux. Khi Claude Code bắt sự kiện chuột, copy-on-select native của terminal bạn ngừng hoạt động. Vùng chọn bạn tạo bằng click-and-drag tồn tại bên trong Claude Code, không phải trong buffer selection của terminal, nên tmux copy mode, Kitty hints, và các tool tương tự không thấy được nó.

Claude Code ghi vùng chọn vào clipboard hệ thống, và đường đi phụ thuộc setup của bạn. Với session cục bộ, nó chạy một tool clipboard native:

  • macOS: pbcopy
  • Linux: wl-copy trên Wayland, hoặc xclip/xsel trên X11, tuỳ cái nào đã cài. Claude Code ghi cả clipboard lẫn PRIMARY selection, nên middle-click paste cũng hoạt động.
  • Windows và WSL: PowerShell Set-Clipboard

Trong tmux nó cũng ghi vào tmux paste buffer. Qua SSH nó fallback về OSC 52 escape sequence. Trong GNU screen, Claude Code cũng copy được vùng chọn dài vào clipboard. Trước v2.1.219, nếu bạn copy một vùng chọn dài hơn khoảng 570 ký tự, GNU screen in text base64 thẳng vào cửa sổ thay vì copy. Claude Code hiện toast sau mỗi lần copy cho biết đường nào vừa được dùng.

Một số terminal chặn OSC 52 mặc định. iTerm2 chặn cho tới khi bạn bật Settings → General → Selection → “Applications in terminal may access clipboard”; chạy /terminal-setup trong iTerm2 sẽ tự bật giúp bạn.

Để chọn text native một lần, phím cần dùng tuỳ terminal:

  • Terminal.app: Fn
  • iTerm2: Option
  • VS Code, Cursor, Devin Desktop: Shift, hoặc Option trên macOS nếu bật setting terminal.integrated.macOptionClickForcesSelection
  • Hầu hết terminal khác: Shift

Giữ phím đó trong khi click và kéo. Terminal của bạn tự xử lý vùng chọn thay vì chuyển cho Claude Code, nên shortcut copy như Cmd+C hoạt động đúng trên phần bạn chọn. Claude Code cũng hiện đúng phím trong gợi ý trên màn hình.

Qua SSH hoặc trong tmux, Claude Code không phải lúc nào cũng phát hiện được terminal bạn đang kết nối từ đó, nên gợi ý sẽ liệt kê các phím ứng viên thay vì một phím duy nhất.

Nếu bạn luôn muốn dùng text selection native, đặt CLAUDE_CODE_DISABLE_MOUSE=1 để tắt hẳn mouse capture, giữ render không nhấp nháy và bộ nhớ ổn định:

Terminal window
CLAUDE_CODE_NO_FLICKER=1 CLAUDE_CODE_DISABLE_MOUSE=1 claude

Với mouse capture tắt, cuộn bàn phím bằng PgUp, PgDn, Ctrl+Home, Ctrl+End vẫn hoạt động, và terminal xử lý vùng chọn native. Bạn mất click-to-position-cursor, click-to-expand tool output, click mở URL, và cuộn bánh xe bên trong Claude Code.

Để giữ cuộn bằng bánh xe nhưng tắt xử lý click/drag/hover, đặt CLAUDE_CODE_DISABLE_MOUSE_CLICKS=1 thay vào đó. CLAUDE_CODE_DISABLE_MOUSE được ưu tiên nếu cả hai biến cùng được đặt.

Với click tắt, Claude Code vẫn bắt chuột, nên bánh xe/trackpad vẫn cuộn được cuộc trò chuyện nhưng left click không có tác dụng gì bên trong Claude Code. Bạn vẫn cần giữ phím native selection của terminal để click-and-drag chọn text. Right-click và middle-click paste vẫn hoạt động trên terminal hỗ trợ.

Text bị kẹt hoặc lệch vị trí trên màn hình

Phần tiêu đề “Text bị kẹt hoặc lệch vị trí trên màn hình”

Fullscreen rendering chỉ gửi các ô đã thay đổi giữa các frame. Một số terminal, phổ biến nhất là Windows Terminal và các host dựa trên ConPTY khác, gộp các lệnh ghi định vị này sai và để lại mảnh output cũ trên màn hình cho tới khi bạn resize cửa sổ.

Đặt CLAUDE_CODE_ALT_SCREEN_FULL_REPAINT=1 để vẽ lại toàn bộ ô mỗi frame thay vì gửi cập nhật gia tăng.

Trên Windows PowerShell:

Terminal window
$env:CLAUDE_CODE_ALT_SCREEN_FULL_REPAINT = "1"
claude

Trên macOS hoặc Linux:

Terminal window
CLAUDE_CODE_ALT_SCREEN_FULL_REPAINT=1 claude

Trên Windows, Claude Code đã tự bật full repaint cho background session và agent view, nên bạn chỉ cần đặt biến này cho một session fullscreen tương tác bạn khởi chạy trực tiếp.

Fullscreen rendering là tính năng research preview. Nó đã được test trên các terminal emulator phổ biến, nhưng bạn có thể gặp vấn đề render trên terminal ít phổ biến hơn hoặc cấu hình khác thường.

Nếu gặp lỗi, chạy /feedback trong Claude Code để báo cáo, hoặc mở issue trên repo GitHub claude-code. Kèm theo tên và phiên bản terminal emulator của bạn.

Để tắt fullscreen rendering, chạy /tui default, hoặc unset CLAUDE_CODE_NO_FLICKER nếu bạn đã bật bằng cách đó. Khi bạn chuyển lại bằng /tui default, Claude Code có thể hiện một prompt feedback tuỳ chọn hỏi lý do bạn chuyển. Gõ lý do rồi nhấn Enter để gửi, hoặc nhấn Esc để bỏ qua. CLI khởi động lại vào renderer cổ điển dù bạn chọn gì. Để ép buộc renderer cổ điển bất kể setting tui đã lưu, đặt CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN=1. Renderer cổ điển giữ cuộc trò chuyện trong scrollback gốc của terminal, nên Cmd+f và tmux copy mode hoạt động như bình thường.

Background session mở từ agent view hoặc claude attach luôn dùng fullscreen rendering. Terminal đang attach vào alternate screen buffer để hiện session đó, và renderer cổ điển không có scrollback hay xử lý chuột ở đó, nên setting tuiCLAUDE_CODE_DISABLE_ALTERNATE_SCREEN không áp dụng cho các session này.