<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>终端 | Feisky</title><link>https://feisky.xyz/tags/%E7%BB%88%E7%AB%AF/</link><description>极客时间专栏作者，专注于 Kubernetes、AI Infra、AI Agent 领域的深度技术分享，让 AI 成为你的第二大脑</description><generator>Hugo 0.165.0</generator><language>zh-CN</language><managingEditor>Pengfei Ni</managingEditor><webMaster>Pengfei Ni</webMaster><lastBuildDate>Fri, 14 Aug 2026 12:39:05 +0000</lastBuildDate><atom:link href="https://feisky.xyz/tags/%E7%BB%88%E7%AB%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code 终于不闪了：全屏渲染模式详解</title><link>https://feisky.xyz/posts/2026-04-07-claude-code%E7%BB%88%E4%BA%8E%E4%B8%8D%E9%97%AA%E4%BA%86%E5%85%A8%E5%B1%8F%E6%B8%B2%E6%9F%93%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3/</link><pubDate>Tue, 07 Apr 2026 20:00:00 +0800</pubDate><dc:creator>Pengfei Ni</dc:creator><category>AI</category><category>Claude Code</category><category>终端</category><category>开发体验</category><category>AI 编程</category><guid>https://feisky.xyz/posts/2026-04-07-claude-code%E7%BB%88%E4%BA%8E%E4%B8%8D%E9%97%AA%E4%BA%86%E5%85%A8%E5%B1%8F%E6%B8%B2%E6%9F%93%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3/</guid><description>&lt;p&gt;用 Claude Code 跑过长会话的人，应该都经历过这种场景：在 Claude Code 长会话中输入新消息后，终端在那疯狂刷屏，屏幕不停闪烁，你想看一眼前面的上下文，得等所有历史会话消息全部都刷一遍屏。&lt;/p&gt;</description><content:encoded>&lt;![CDATA[<p>用 Claude Code 跑过长会话的人，应该都经历过这种场景：在 Claude Code 长会话中输入新消息后，终端在那疯狂刷屏，屏幕不停闪烁，你想看一眼前面的上下文，得等所有历史会话消息全部都刷一遍屏。</p><p>我自己平时在 tmux 里跑 Claude Code，会话长了之后这个闪烁就很明显，但还能忍。真正让我受不了的是在 VSCode 集成终端或者 SSH 连接到服务器的时候，终端渲染本来就慢，再加上 Claude Code 每次输出都要刷新整个屏幕，长会话到后面很长时间都在等刷屏了。网络延迟再叠上渲染延迟，这体验简直了。</p><p>这个痛点社区里吐槽很久了，现在终于等来了修复。愚人节当天， Claude Code 负责人 Boris Cherny 宣布了全屏渲染模式，通过环境变量<code>CLAUDE_CODE_NO_FLICKER=1</code> 开启。</p><h2 id="一行配置立竿见影">一行配置，立竿见影</h2><p>开启方式很简单，启动时加个环境变量：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>CLAUDE_CODE_NO_FLICKER<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> claude</span></span></code></pre></div><p>不想每次都敲这一串的话，扔到 shell 配置文件里：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># 加到 ~/.zshrc 或 ~/.bashrc</span></span></span><span style="display:flex;"><span>export CLAUDE_CODE_NO_FLICKER<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span></span></span></code></pre></div><p>也可以写进 Claude Code 的<code>settings.json</code>：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{</span></span><span style="display:flex;"><span><span style="color:#f92672">"env"</span>: {</span></span><span style="display:flex;"><span><span style="color:#f92672">"CLAUDE_CODE_NO_FLICKER"</span>:<span style="color:#e6db74">"1"</span></span></span><span style="display:flex;"><span> }</span></span><span style="display:flex;"><span>}</span></span></code></pre></div><p>我加上之后第一感觉就是终于安静了。输入框固定在屏幕底部，Claude Code 的输出在上方平滑滚动，不再有那种整屏闪一下的刷新。整个体验和 vim、htop 这类全屏终端程序一样，Claude Code 接管了整个终端画面。</p><p><img src="/images/2026-04-07-Claude-Code-2026-04-07-no-flicker-layout.jpg" alt="全屏模式的整体布局：工具调用结果展开显示，输入框固定在底部，状态栏实时显示执行进度" loading="lazy" decoding="async"/></p><h2 id="为什么终端会闪">为什么终端会闪</h2><p>不闪了当然好，但我比较好奇的是：为什么以前一定会闪？这到底是 Claude Code 的 bug，还是终端本身的限制？翻了 Boris 的推文线程，发现答案是后者。</p><p>终端不是浏览器。浏览器有 DOM、有 CSS、有 GPU 加速的合成器，想更新页面某个区域，直接改那个区域就行。终端能用的只有 ANSI 转义码，一套上世纪 70 年代设计的指令集：移动光标到 (x, y)、在当前位置写一段文字、清除一行、清除整个屏幕。</p><p>关键问题在于，ANSI 转义码没有移动光标到屏幕外某一行的指令。也就是说，当 Claude Code 的输出已经超出屏幕之后，你没办法只更新那一行。想要重新渲染，唯一的办法就是清空整个屏幕然后重画。</p><p>这就是闪烁的根源。每次 Claude Code 输出新内容，传统渲染器都要：清屏 → 重绘所有可见内容 → 把光标移到正确位置。会话越长，需要重绘的内容越多，闪烁越严重，CPU 和内存占用也跟着线性增长。</p><h2 id="全屏模式怎么解决的">全屏模式怎么解决的</h2><p>那 Claude Code 团队是怎么绕过这个限制的呢？</p><p>思路其实不复杂，也就是换成了虚拟滚动。就像在前端设计中，一个长列表有一万条数据，你不会把一万个 DOM 节点全渲染出来，只需要渲染可见的那几十条。Claude Code 的全屏模式做的是同样的事，只不过对象从 DOM 节点变成了终端字符行。</p><p>具体来说，传统模式下 Claude Code 把所有内容都写到终端的主滚动缓冲区里，让终端自己处理滚动。新模式切换到终端的备用屏幕缓冲区，然后自己接管所有的滚动、鼠标和键盘事件。</p><p>这样做的好处是，渲染器只需要画当前终端可见的内容。一个 2 小时的长会话，可能积累了几百条消息，但屏幕上一次最多显示几十行。只渲染这几十行，CPU 和内存占用就变成了常量，不会随着会话长度增长。</p><p><img src="/images/2026-04-07-Claude-Code-2026-04-07-no-flicker-scroll.jpg" alt="向上滚动查看历史会话，视口只渲染当前可见内容" loading="lazy" decoding="async"/></p><p>这对慢速终端环境来说改善特别明显。VSCode 的集成终端、tmux、iTerm2 这些渲染吞吐量本来就是瓶颈的场景，以前长会话到后面明显卡顿。现在每帧需要发送给终端的数据大幅减少，这些环境下的体验提升是最大的。</p><h2 id="不只是不闪了">不只是不闪了</h2><p>全屏模式顺带解锁了一些之前终端里做不到的交互。</p><p>鼠标支持是让我比较意外的。开启后可以直接用鼠标点击输入框来移动光标，以前想在输入框里改个词，得按方向键一个字一个字挪过去，现在直接点一下就到位了。折叠的工具调用结果也可以点击展开，URL 和文件路径点了直接打开。</p><p>选择文字的体验也有改善。以前在终端里选 ClaudeCode 的输出，会连带选上行号和 UI 边框，粘贴出来会带上这些多余的字符。现在选择是在应用层处理的，只选到实际内容，松开鼠标直接复制到剪贴板。双击选词时文件路径会被当作一个完整单元选中。</p><p>滚动方面，用鼠标滚轮或者键盘快捷键都行：</p><table><thead><tr><th>快捷键</th><th>功能</th></tr></thead><tbody><tr><td><code>PgUp</code> /<code>PgDn</code></td><td>上下翻半屏</td></tr><tr><td><code>Ctrl+Home</code></td><td>跳到会话开头</td></tr><tr><td><code>Ctrl+End</code></td><td>跳到最新消息，恢复自动跟随</td></tr><tr><td>鼠标滚轮</td><td>逐行滚动</td></tr></tbody></table><p>MacBook 没有 PgUp/PgDn 键的话，用<code>Fn+↑</code> 和<code>Fn+↓</code> 代替。</p><p>往上滚动查看历史时，自动跟随会暂停，新输出不会把你拽回底部。想回去接着看最新进展，按<code>Ctrl+End</code> 或者滚到底部就行。以前最烦的就是想回头看看上面的代码，Claude Code 一输出新内容就把你弹回底部了，现在不会了。</p><h2 id="搜索怎么办">搜索怎么办</h2><p>全屏模式有一个变化需要适应：因为内容在备用屏幕缓冲区里，终端自带的<code>Cmd+F</code> 搜索和 tmux 的搜索功能都用不了了。不过全屏模式提供了替代方案。</p><p>按<code>Ctrl+O</code> 进入转录模式，支持一套 vim 风格的导航：</p><table><thead><tr><th>按键</th><th>功能</th></tr></thead><tbody><tr><td><code>/</code></td><td>打开搜索，输入关键词后回车确认</td></tr><tr><td><code>n</code> /<code>N</code></td><td>跳到下一个/上一个匹配</td></tr><tr><td><code>j</code> /<code>k</code></td><td>逐行滚动</td></tr><tr><td><code>g</code> /<code>G</code></td><td>跳到顶部/底部</td></tr><tr><td><code>q</code> 或<code>Esc</code></td><td>退出转录模式</td></tr></tbody></table><p>如果你就是想用终端原生的搜索功能，也有办法。在转录模式下按<code>[</code>，会把整个会话内容写回终端的主滚动缓冲区，这时候<code>Cmd+F</code> 和 tmux 的复制模式就都能用了。</p><h2 id="几个需要注意的地方">几个需要注意的地方</h2><p>这个模式目前还是 Research Preview 状态，我用下来碰到几个需要适应的地方。</p><p>复制粘贴的行为变了。选中文字后松开鼠标就自动复制到剪贴板，不需要再<code>Cmd+C</code>。如果你更喜欢手动控制，可以在<code>/config</code> 里关掉 Copy on select，改用<code>Ctrl+Shift+C</code>。</p><p>鼠标滚轮的速度在不同终端上差异挺大。VSCode 终端里滚轮每次只走一行，太慢了。调一下这个环境变量：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>export CLAUDE_CODE_SCROLL_SPEED<span style="color:#f92672">=</span><span style="color:#ae81ff">3</span></span></span></code></pre></div><p>值域 1 到 20，3 大概相当于 vim 的默认滚动速度。</p><p>在 tmux 里使用需要开启鼠标模式。如果你的<code>~/.tmux.conf</code> 里还没有这行，加一下：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>set -g mouse on</span></span></code></pre></div><p>不过要注意，iTerm2 的 tmux 集成模式（<code>tmux -CC</code>）和全屏渲染不兼容（普通的 tmux 没问题）。</p><p>如果你通过 SSH 使用，或者在 tmux 里选文字时遇到剪贴板的问题，可以关掉鼠标捕获，只保留无闪烁渲染：</p><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>CLAUDE_CODE_NO_FLICKER<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> CLAUDE_CODE_DISABLE_MOUSE<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span> claude</span></span></code></pre></div><p>这样键盘滚动、固定输入框、常量内存这些核心好处都还在，只是鼠标相关的功能回到了终端原生行为。</p><h2 id="写在最后">写在最后</h2><p>解决终端渲染性能问题有不同的思路。Warp 当年选择从底层重写终端模拟器，用 GPU 渲染。Claude Code 走的是另一条路：不改终端，在应用层做虚拟滚动，只渲染可见区域。Claude Code 的做法有个明显优势，它适用于任何终端，不管你是在 iTerm2、Ghostty 还是 WSL 默认的那个终端里，加个环境变量就都能用。</p><p>这个模式目前还是 Research Preview，滚动物理效果和选文字的边界判断偶尔还有点问题。但和以前的闪烁比起来这些都是小问题。如果你也在 VSCode 终端或者 SSH 环境里被刷屏折磨过，加个<code>CLAUDE_CODE_NO_FLICKER=1</code> 试试。</p><hr><p><strong>相关资源：</strong></p><ul><li>Claude Code Fullscreen 官方文档：<a href="https://code.claude.com/docs/en/fullscreen">https://code.claude.com/docs/en/fullscreen</a></li><li>Boris Cherny 发布推文：<a href="https://x.com/bcherny/status/2039421575422980329">https://x.com/bcherny/status/2039421575422980329</a></li></ul><hr><p>欢迎长按下面的二维码关注<strong>Feisky</strong> 公众号，了解更多云原生和 AI 知识。</p><p><img src="/images/mp.png" alt="Feisky 公众号二维码" loading="lazy" decoding="async"/></p>
]]></content:encoded><dc:extent>6 min read</dc:extent></item></channel></rss>