<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://zachvec.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://zachvec.github.io/" rel="alternate" type="text/html" /><updated>2026-05-03T09:17:37+00:00</updated><id>https://zachvec.github.io/feed.xml</id><title type="html">Zach’s Pages</title><subtitle>Personal blog and project docs</subtitle><entry><title type="html">修复 Neovim :terminal 中粘贴长文本丢失字符的问题</title><link href="https://zachvec.github.io/blog/2026/05/03/nvim-terminal-paste/" rel="alternate" type="text/html" title="修复 Neovim :terminal 中粘贴长文本丢失字符的问题" /><published>2026-05-03T00:00:00+00:00</published><updated>2026-05-03T00:00:00+00:00</updated><id>https://zachvec.github.io/blog/2026/05/03/nvim-terminal-paste</id><content type="html" xml:base="https://zachvec.github.io/blog/2026/05/03/nvim-terminal-paste/"><![CDATA[<p>在 Neovim 的 <code class="language-plaintext highlighter-rouge">:terminal</code> 中使用 Claude Code 等交互式 TUI 程序时，通过 <code class="language-plaintext highlighter-rouge">Shift+Insert</code> 粘贴文本会出现非确定性的<strong>字符丢失或损坏</strong>：中间片段消失、行首字符被替换，且每次结果不同。</p>

<h2 id="现象">现象</h2>

<p>在 Neovim 中打开 <code class="language-plaintext highlighter-rouge">:terminal</code>，启动 Claude Code，粘贴一段多行文本。期望看到完整内容，实际却出现：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Et -g default-terminal      # 首字符 's' 丢失且多出 'E'
et -g def                   # 后半段被截断
</code></pre></div></div>

<p>不同尝试之间结果不一致（非确定性）。这个问题的特殊之处在于：</p>

<ul>
  <li><strong>不经过 Neovim</strong> 直接粘贴到 Claude Code 正常</li>
  <li><strong>Vim 的 <code class="language-plaintext highlighter-rouge">:terminal</code></strong> 粘贴正常</li>
  <li><strong><code class="language-plaintext highlighter-rouge">nvim --clean</code></strong> 也能复现（排除配置/插件）</li>
  <li><strong>macOS 和 WSL2</strong> 均受影响</li>
</ul>

<h2 id="解决方案">解决方案</h2>

<h3 id="neovim--0122">Neovim ≥ 0.12.2</h3>

<p>升级即可，社区已在 <a href="https://github.com/neovim/neovim/pull/39152">#39152</a> 修复。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用你喜欢的包管理器升级</span>
brew upgrade neovim       <span class="c"># macOS</span>
winget upgrade Neovim     <span class="c"># Windows</span>
</code></pre></div></div>

<h3 id="neovim--0122-1">Neovim &lt; 0.12.2</h3>

<p>在不修改 Neovim 二进制的情况下，可以通过覆盖 <code class="language-plaintext highlighter-rouge">vim.paste</code> 来绕过有 bug 的 <code class="language-plaintext highlighter-rouge">terminal_paste()</code> 实现：</p>

<div class="language-lua highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">-- 放到 init.lua 中</span>
<span class="k">if</span> <span class="n">vim</span><span class="p">.</span><span class="n">fn</span><span class="p">.</span><span class="n">has</span><span class="p">(</span><span class="s2">"nvim-0.12.2"</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">then</span>
  <span class="kd">local</span> <span class="n">paste_streaming</span> <span class="o">=</span> <span class="kc">false</span>

  <span class="n">vim</span><span class="p">.</span><span class="n">paste</span> <span class="o">=</span> <span class="p">(</span><span class="k">function</span><span class="p">(</span><span class="n">overridden</span><span class="p">)</span>
    <span class="k">return</span> <span class="k">function</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span> <span class="n">phase</span><span class="p">)</span>
      <span class="k">if</span> <span class="n">vim</span><span class="p">.</span><span class="n">bo</span><span class="p">.</span><span class="n">buftype</span> <span class="o">~=</span> <span class="s2">"terminal"</span> <span class="k">then</span>
        <span class="k">return</span> <span class="n">overridden</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span> <span class="n">phase</span><span class="p">)</span>
      <span class="k">end</span>
      <span class="kd">local</span> <span class="n">chan</span> <span class="o">=</span> <span class="n">vim</span><span class="p">.</span><span class="n">bo</span><span class="p">.</span><span class="n">channel</span>
      <span class="k">if</span> <span class="ow">not</span> <span class="n">chan</span> <span class="ow">or</span> <span class="n">chan</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">then</span>
        <span class="k">return</span> <span class="n">overridden</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span> <span class="n">phase</span><span class="p">)</span>
      <span class="k">end</span>

      <span class="kd">local</span> <span class="n">text</span> <span class="o">=</span> <span class="nb">table.concat</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
      <span class="kd">local</span> <span class="n">is_first</span> <span class="o">=</span> <span class="p">(</span><span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">phase</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
      <span class="kd">local</span> <span class="n">is_last</span> <span class="o">=</span> <span class="p">(</span><span class="n">phase</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">or</span> <span class="n">phase</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>

      <span class="k">if</span> <span class="n">is_first</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">paste_streaming</span> <span class="k">then</span>
        <span class="n">paste_streaming</span> <span class="o">=</span> <span class="kc">true</span>
        <span class="n">vim</span><span class="p">.</span><span class="n">api</span><span class="p">.</span><span class="n">nvim_chan_send</span><span class="p">(</span><span class="n">chan</span><span class="p">,</span> <span class="s2">"</span><span class="se">\27</span><span class="s2">[200~"</span><span class="p">)</span>
      <span class="k">end</span>
      <span class="n">vim</span><span class="p">.</span><span class="n">api</span><span class="p">.</span><span class="n">nvim_chan_send</span><span class="p">(</span><span class="n">chan</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
      <span class="k">if</span> <span class="n">is_last</span> <span class="k">then</span>
        <span class="n">vim</span><span class="p">.</span><span class="n">api</span><span class="p">.</span><span class="n">nvim_chan_send</span><span class="p">(</span><span class="n">chan</span><span class="p">,</span> <span class="s2">"</span><span class="se">\27</span><span class="s2">[201~"</span><span class="p">)</span>
        <span class="n">paste_streaming</span> <span class="o">=</span> <span class="kc">false</span>
      <span class="k">end</span>

      <span class="k">return</span> <span class="kc">true</span>
    <span class="k">end</span>
  <span class="k">end</span><span class="p">)(</span><span class="n">vim</span><span class="p">.</span><span class="n">paste</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>

<p>这个 workaround 只在 terminal buffer 中接管 paste 处理：直接用 <code class="language-plaintext highlighter-rouge">nvim_chan_send</code> 把文本发送到终端 job，并为整个 paste stream 只生成一对 bracketed paste 标记，而不是每 chunk 一对。</p>

<p>升级到 0.12.2 后，<code class="language-plaintext highlighter-rouge">vim.fn.has("nvim-0.12.2")</code> 检查自动跳过覆盖代码，不会干扰已修复的行为。</p>

<h3 id="workaround-的风险">Workaround 的风险</h3>

<p>这个 workaround 在大多数场景下工作正常，但有几个值得注意的局限：</p>

<ol>
  <li>
    <p><strong>dot-repeat 不工作</strong>：覆盖函数直接 <code class="language-plaintext highlighter-rouge">return true</code>，没有像原生 <code class="language-plaintext highlighter-rouge">vim.paste()</code> 那样调用 <code class="language-plaintext highlighter-rouge">paste_store()</code> 记录 paste 历史。在 terminal 中粘贴无法通过 <code class="language-plaintext highlighter-rouge">.</code> 重复。这是有意为之——terminal buffer 中的 dot-repeat 应该由终端 job 自己处理，Neovim 的粘贴重放本来就不适合 terminal mode。</p>
  </li>
  <li>
    <p><strong>绕过 <code class="language-plaintext highlighter-rouge">tpf_flags</code> 过滤</strong>：原生的 <code class="language-plaintext highlighter-rouge">terminal_paste()</code> 会根据 <code class="language-plaintext highlighter-rouge">tpf_flags</code>（<code class="language-plaintext highlighter-rouge">'paste'</code> 选项）过滤控制字符（如 ESC、退格等）。<code class="language-plaintext highlighter-rouge">nvim_chan_send</code> 不会做这个过滤。但现代终端程序（bash ≥ 4.4、Claude Code、vim 等）都已启用 bracketed paste，通过 <code class="language-plaintext highlighter-rouge">\e[200~</code> / <code class="language-plaintext highlighter-rouge">\e[201~</code> 标记来识别粘贴内容，对控制字符的处理更安全，因此这在实际使用中很少造成问题。</p>
  </li>
  <li>
    <p><strong>仅在 <code class="language-plaintext highlighter-rouge">buftype=terminal</code> 生效</strong>：覆盖函数在非 terminal buffer 中直接调用原生的 <code class="language-plaintext highlighter-rouge">overridden(lines, phase)</code>，不影响普通 buffer 的粘贴行为。</p>
  </li>
  <li>
    <p><strong>跨 chunk 状态用闭包变量管理</strong>：<code class="language-plaintext highlighter-rouge">paste_streaming</code> 是一个模块级闭包变量。如果两个 terminal 同时收到 streamed paste（极端边缘场景，同一个 Neovim 实例中不同 terminal 同时被粘贴），状态会冲突。实际使用中几乎不会遇到，但理论上存在。</p>
  </li>
</ol>

<h2 id="原因">原因</h2>

<p>Neovim TUI 层在处理外部 paste 时，通过 bracketed paste 判断 paste 的起止位置。Paste 内容被缓冲在 <strong>4096 字节</strong>（<code class="language-plaintext highlighter-rouge">KEY_BUFFER_SIZE = 0x1000</code>）的内置 buffer 中。当内容超过这个值时，会被分割成多个 chunk 发送：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Chunk 1 (phase=1): \e[200~ + 前4096字节 + \e[201~
Chunk 2 (phase=2): \e[200~ + 中间4096字节 + \e[201~   ← 不应出现
Chunk 3 (phase=3): \e[200~ + 剩余部分 + \e[201~       ← 不应出现
</code></pre></div></div>

<p>核心问题在于 <code class="language-plaintext highlighter-rouge">src/nvim/terminal.c</code> 中的 <code class="language-plaintext highlighter-rouge">terminal_paste()</code> 函数——每次调用都<strong>无条件</strong>添加一对 <code class="language-plaintext highlighter-rouge">vterm_keyboard_start_paste()</code> / <code class="language-plaintext highlighter-rouge">vterm_keyboard_end_paste()</code>。当 chunk 机制多次调用 <code class="language-plaintext highlighter-rouge">terminal_paste()</code> 时，每个 chunk 都被包装成了独立的 bracketed paste。子进程（Claude Code、vim 等）收到了多个被错误分割的 paste 事件。</p>

<p>对于 Claude Code 这类交互式 TUI 程序，每次收到”独立 paste”后都会立即处理并重新渲染界面。多个独立 paste 之间的 UI redraw 互相覆盖，最终只有部分内容被保留。</p>

<p>即使内容短于 4096 字节（单 chunk），<code class="language-plaintext highlighter-rouge">terminal_paste()</code> 内部的 <code class="language-plaintext highlighter-rouge">uv_write()</code> 异步写和 vterm 输出回调之间的时序也在特定系统上引入了竞态。这也解释了为什么 Vim 的 <code class="language-plaintext highlighter-rouge">:terminal</code> 没有此问题——Vim 使用同步 <code class="language-plaintext highlighter-rouge">write()</code> 而非 libuv 的异步 <code class="language-plaintext highlighter-rouge">uv_write()</code>。</p>

<p>修复的具体策略是将 bracketed paste 标记的生成从 <code class="language-plaintext highlighter-rouge">terminal_paste()</code> 提升到 <code class="language-plaintext highlighter-rouge">nvim_paste()</code> 层级，引入 <code class="language-plaintext highlighter-rouge">streamed_paste</code> 标记确保整个 paste stream 只有一对 <code class="language-plaintext highlighter-rouge">\e[200~</code> / <code class="language-plaintext highlighter-rouge">\e[201~</code>：</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// nvim_paste() — 修复后</span>
<span class="k">if</span> <span class="p">(</span><span class="n">phase</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">phase</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">terminal_set_streamed_paste</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="nb">true</span><span class="p">);</span>   <span class="c1">// 只在开始时输出 \e[200~</span>
<span class="c1">// … vim.paste() → do_put() → terminal_paste() — 内部不再加标记 …</span>
<span class="k">if</span> <span class="p">(</span><span class="n">phase</span> <span class="o">==</span> <span class="mi">3</span> <span class="o">||</span> <span class="n">phase</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">terminal_set_streamed_paste</span><span class="p">(</span><span class="n">term</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>  <span class="c1">// 只在结束时输出 \e[201~</span>
</code></pre></div></div>

<h2 id="相关资料">相关资料</h2>

<ul>
  <li><a href="https://github.com/neovim/neovim/pull/39152">neovim/neovim#39152</a> — 修复 PR：forward streamed bracketed paste properly</li>
  <li><a href="https://github.com/folke/sidekick.nvim/issues/207">folke/sidekick.nvim#207</a> — sidekick 用户报告的同一问题（已自动关闭）</li>
  <li><a href="https://github.com/coder/claudecode.nvim/issues/161">coder/claudecode.nvim#161</a> — claudecode.nvim 的同类问题报告</li>
  <li><a href="https://github.com/neovim/neovim/issues/3476">Neovim <code class="language-plaintext highlighter-rouge">:terminal</code> paste 早期讨论</a> — bracketed paste 在 <code class="language-plaintext highlighter-rouge">:terminal</code> 中的历史演进</li>
</ul>]]></content><author><name></name></author><category term="terminal" /><summary type="html"><![CDATA[在 Neovim 的 :terminal 中使用 Claude Code 等交互式 TUI 程序时，通过 Shift+Insert 粘贴文本会出现非确定性的字符丢失或损坏：中间片段消失、行首字符被替换，且每次结果不同。]]></summary></entry><entry><title type="html">修复 tmux 中斜体显示为高亮的问题</title><link href="https://zachvec.github.io/blog/2026/05/03/tmux-italic-standout/" rel="alternate" type="text/html" title="修复 tmux 中斜体显示为高亮的问题" /><published>2026-05-03T00:00:00+00:00</published><updated>2026-05-03T00:00:00+00:00</updated><id>https://zachvec.github.io/blog/2026/05/03/tmux-italic-standout</id><content type="html" xml:base="https://zachvec.github.io/blog/2026/05/03/tmux-italic-standout/"><![CDATA[<p>在 tmux 中使用 Vim 或 Neovim 时，你可能会遇到一个奇怪的现象：本该显示为<strong>斜体</strong>的文本（如注释、markdown 强调），却显示成了<strong>反色高亮</strong>（黑底白字变白底黑字）。反过来，某些主题的<strong>高亮/反色</strong>区域又变成了斜体。</p>

<h2 id="检查问题">检查问题</h2>

<p>先在 tmux 内运行下面这条命令，确认你是否有这个问题：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"</span><span class="se">\e</span><span class="s2">[3mitalic</span><span class="se">\e</span><span class="s2">[23m"</span>
</code></pre></div></div>

<p>如果看到的是<strong>反色高亮</strong>而不是斜体，说明中招了。</p>

<h2 id="修复步骤">修复步骤</h2>

<h3 id="一安装修正后的-terminfo">一、安装修正后的 terminfo</h3>

<p>通过 heredoc 直接传给 <code class="language-plaintext highlighter-rouge">tic</code> 编译安装，无需创建临时文件：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="sh">'</span><span class="no">EOF</span><span class="sh">' | tic -x -
tmux-256color|tmux with 256 colors,
  ritm=</span><span class="se">\E</span><span class="sh">[23m, rmso=</span><span class="se">\E</span><span class="sh">[27m, sitm=</span><span class="se">\E</span><span class="sh">[3m, smso=</span><span class="se">\E</span><span class="sh">[7m, Ms@,
  khome=</span><span class="se">\E</span><span class="sh">[1~, kend=</span><span class="se">\E</span><span class="sh">[4~,
  use=xterm-256color, use=screen-256color,
</span><span class="no">EOF
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">tic -x -</code> 中的 <code class="language-plaintext highlighter-rouge">-</code> 表示从 stdin 读取，<code class="language-plaintext highlighter-rouge">'EOF'</code> 加引号防止 shell 对 <code class="language-plaintext highlighter-rouge">\E</code> 做转义插值。</p>

<p><code class="language-plaintext highlighter-rouge">tic -x</code> 会将编译后的 terminfo 写入 <code class="language-plaintext highlighter-rouge">~/.terminfo/</code>，不需要 sudo。</p>

<h3 id="二修改-tmux-配置">二、修改 tmux 配置</h3>

<p>在 <code class="language-plaintext highlighter-rouge">~/.tmux.conf</code> 中添加：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>set -g default-terminal 'tmux-256color'
set -as terminal-overrides ',xterm*:Tc:sitm=\E[3m'
</code></pre></div></div>

<p>第一条把 tmux 的默认终端类型切换为刚安装的 <code class="language-plaintext highlighter-rouge">tmux-256color</code>。第二条为 xterm 类终端显式指定斜体序列，<code class="language-plaintext highlighter-rouge">Tc</code> 表示支持 true color。</p>

<h3 id="三重启-tmux">三、重启 tmux</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tmux kill-server <span class="o">&amp;&amp;</span> tmux
</code></pre></div></div>

<p>再次运行验证命令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"</span><span class="se">\e</span><span class="s2">[3mitalic</span><span class="se">\e</span><span class="s2">[23m"</span>
</code></pre></div></div>

<p>现在应该能看到正常的斜体文字了。</p>

<h2 id="原理">原理</h2>

<p>终端的文本属性（粗体、斜体、下划线、反色等）通过 ANSI 转义序列控制。terminfo 数据库为每种终端类型定义了这些序列的映射关系：</p>

<table>
  <thead>
    <tr>
      <th>terminfo 字段</th>
      <th>含义</th>
      <th>正确序列</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">sitm</code></td>
      <td>开启斜体</td>
      <td><code class="language-plaintext highlighter-rouge">\E[3m</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ritm</code></td>
      <td>关闭斜体</td>
      <td><code class="language-plaintext highlighter-rouge">\E[23m</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">smso</code></td>
      <td>开启反色高亮</td>
      <td><code class="language-plaintext highlighter-rouge">\E[7m</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">rmso</code></td>
      <td>关闭反色高亮</td>
      <td><code class="language-plaintext highlighter-rouge">\E[27m</code></td>
    </tr>
  </tbody>
</table>

<p>tmux 的默认 <code class="language-plaintext highlighter-rouge">$TERM</code> 是 <code class="language-plaintext highlighter-rouge">screen</code> 或 <code class="language-plaintext highlighter-rouge">screen-256color</code>。<code class="language-plaintext highlighter-rouge">screen</code> 终端本身不支持斜体，所以历史上它把 standout（smso）的序列映射到了 <code class="language-plaintext highlighter-rouge">\E[3m</code>（斜体），把斜体占为己有。tmux 继承了这个定义。</p>

<p>结果就是：在 tmux 内部，程序查 terminfo 得知要显示反色就发 <code class="language-plaintext highlighter-rouge">\E[3m</code>，但现代终端把 <code class="language-plaintext highlighter-rouge">\E[3m</code> 正确理解为斜体——于是反色高亮就变成了斜体。反过来，真正想显示斜体的程序发出来的序列又会被当成反色。</p>

<p>上面创建的 terminfo 文件关键就在于这两行：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>use=xterm-256color, use=screen-256color,
</code></pre></div></div>

<p>它以 <code class="language-plaintext highlighter-rouge">screen-256color</code> 为基础，再用 <code class="language-plaintext highlighter-rouge">xterm-256color</code> 覆盖（后者正确定义了斜体和反色），最后显式指定 <code class="language-plaintext highlighter-rouge">sitm=\E[3m</code> / <code class="language-plaintext highlighter-rouge">smso=\E[7m</code> 确保万无一失。<code class="language-plaintext highlighter-rouge">Ms@</code> 则禁用了 <code class="language-plaintext highlighter-rouge">screen</code> 对颜色切换的干扰行为。</p>

<h2 id="哪些系统会受影响">哪些系统会受影响</h2>

<p>这个问题本质上是历史遗留，主要出现在 <strong>2017 年之前</strong>的系统上。ncurses 在 2017 年才引入独立的 <code class="language-plaintext highlighter-rouge">tmux-256color</code> terminfo 条目，正确分离了斜体和反色。</p>

<p>以下场景仍可能遇到：</p>

<ul>
  <li><strong>老系统</strong>：CentOS 7、旧版 macOS 等自带的 ncurses 版本过老，没有 <code class="language-plaintext highlighter-rouge">tmux-256color</code></li>
  <li><strong>SSH 到旧服务器</strong>：本地 <code class="language-plaintext highlighter-rouge">$TERM</code> 可能被 propagate 为 <code class="language-plaintext highlighter-rouge">screen-256color</code>（尤其当跳板机或远端 tmux 配置陈旧时）</li>
  <li><strong>tmux 配置显式设了旧 TERM</strong>：如果 <code class="language-plaintext highlighter-rouge">~/.tmux.conf</code> 里有 <code class="language-plaintext highlighter-rouge">set -g default-terminal "screen-256color"</code>，问题会被重新引入</li>
</ul>

<p>现代发行版（Ubuntu 18.04+、Debian 10+、macOS 10.14+）的 ncurses 已自带 <code class="language-plaintext highlighter-rouge">tmux-256color</code>，一般不会有这个问题。</p>

<hr />

<p><em>参考：<a href="https://github.com/tmux/tmux/issues/1202">tmux/tmux#1202</a>，<a href="https://lists.gnu.org/archive/html/bug-ncurses/2017-11/msg00010.html">ncurses-bug 邮件列表</a></em></p>]]></content><author><name></name></author><category term="terminal" /><summary type="html"><![CDATA[在 tmux 中使用 Vim 或 Neovim 时，你可能会遇到一个奇怪的现象：本该显示为斜体的文本（如注释、markdown 强调），却显示成了反色高亮（黑底白字变白底黑字）。反过来，某些主题的高亮/反色区域又变成了斜体。]]></summary></entry></feed>