<?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/"><channel><title>IntelliJ IDEA on Trevor's Blog</title><link>http://mings.in/tags/intellij-idea/</link><description>Recent content in IntelliJ IDEA on Trevor's Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 13:35:29 +0800</lastBuildDate><atom:link href="http://mings.in/tags/intellij-idea/index.xml" rel="self" type="application/rss+xml"/><item><title>JetBrains 终端换芯，AI agent 太能吃了</title><link>http://mings.in/posts/libghostty/</link><pubDate>Wed, 28 Oct 2026 13:35:29 +0800</pubDate><guid>http://mings.in/posts/libghostty/</guid><description>IDE 的终端换了引擎：用了 13 年的 JediTerm 让位给 Ghostty 的核心库，理由写在 AI agent 那行。我把新版安装包拆开，验了一遍。</description><content:encoded><![CDATA[<p>在 IDE 的终端里用 Claude Code 这类 CLI agent，大概都碰到过同一件事。敲了一句话，想按 Shift+Enter 换行再补两句，结果半句话直接发出去了，agent 已经开始按残缺的指令干活。</p>
<p>JetBrains 在 10 月 27 日的博客里把这件事写进了理由里。从 2026.3 开始，他们家 IDE 的内置终端不再用 JediTerm，改跑 libghostty，也就是 Ghostty 那个终端模拟器的核心库。</p>
<blockquote>
<p>Shift+Enter starts a new line in your prompt instead of sending a half-written message.</p>
</blockquote>
<p>一句「instead of sending a half-written message」，把过去十几年的默认行为说得很直白。</p>
<h2 id="一个终端库凭什么换掉用了-13-年的那个">一个终端库，凭什么换掉用了 13 年的那个</h2>
<p>JediTerm 是 JetBrains 自己的纯 Java 终端模拟器，2013 年 1 月开的仓库，一路维护到现在。它处理 SSH 和 PTY，够用，也很稳。</p>
<p>问题是它不支持后来那批现代终端协议。</p>
<p>官方给的判断是，TUI 应用越来越多地依赖 JediTerm 从来没支持过的协议，而这个缺口以前「感觉只是个小不便」，因为体验确实跟别的终端差点，但没差到值得报 bug 的程度。</p>
<p>变的是终端里跑的东西。Claude Code、Codex、Neovim、tmux、各种系统监控面板，这些工具压在终端上的强度，远不是一个 shell 提示符能比的。</p>
<p>libghostty 接过了解析和终端状态这两件事。IDE 那边继续管渲染，以及上层功能和集成。这个分工官方写得很清楚，不是整个终端重写。</p>
<p>顺带说一句 libghostty 自己的定位。它用 Zig 写，对外是 C ABI，Ghostty 的 macOS 版（Swift + AppKit）和 Linux 版（Zig + GTK4）都是它的消费者。Mitchell Hashimoto 在项目介绍里说得很坦白，这是他业余时间做的项目，不是任何人的全职工作。</p>
<h2 id="shiftenter-终于能换行以前为什么不灵">Shift+Enter 终于能换行，以前为什么不灵</h2>
<p>终端里键盘事件的老协议只区分得出「按了哪个键」，区分不出 Shift、Ctrl、Alt 的组合，也不告诉你按键是按下还是松开。</p>
<p>Kitty keyboard protocol 把这些补上了。终端应用现在能分辨 Enter、Shift+Enter、Ctrl+Enter，还能要求接收按键释放和连发事件。</p>
<p>Vim 用的是更老的 xterm modifyOtherKeys，这次也一起支持了。</p>
<p>对天天在终端里跟 agent 打交道的人来说，这带来两个变化。换行就是换行，不会半句话飞出去；Ctrl、Shift、Alt 跟别的键组合出来的快捷键，能原样送到应用手里。</p>
<p>官方还提了一句细节。以前那个让 Shift+Enter 发 <code>Esc</code> + <code>CR</code> 的旧设置不需要了，设了也会被忽略。</p>
<h2 id="切到-dark-模式终端里的工具为什么也跟着变">切到 Dark 模式，终端里的工具为什么也跟着变</h2>
<p>这件事的体验落差特别明显。</p>
<p>IDE 切到深色模式，终端里的程序是不知道的，它只能猜。猜错的结果就是深色背景配深色文字，或者在一个全黑的 IDE 里塞一块亮色终端。要修只能一个工具一个工具手工配。</p>
<p>现在终端会回答 dark/light 查询，也就是 <code>CSI ? 996 n</code>，答案来自当前 IDE 主题。切主题的时候，通过 mode 2031 发一条通知出去。</p>
<p>Claude Code、OpenCode、Pi、Neovim、tmux 都订阅了这类通知，所以大部分工具能跟着 IDE 一起切换，IDE 这边不用调任何设置。</p>
<p>调色板查询也扩了。JediTerm 只处理 OSC 10/11，新的终端还能回答 OSC 4 和 Kitty 的 OSC 21。程序可以用 OSC 4 设置 16 到 255 号扩展色，0 到 15 号仍归 IDE 主题管。</p>
<h2 id="那些乱七八糟的控制字符以前为什么显示成方块">那些乱七八糟的控制字符，以前为什么显示成方块</h2>
<p>官方说新的引擎处理了近 50 个 JediTerm 忽略或误读的控制序列。挑三个能对上日常体验的：</p>
<p>REP（<code>CSI Ps b</code>）是 ncurses 用来压缩连续重复字符的，7 个以上相同字符走这条。以前有些行渲染出来缺字，就是它没被处理。</p>
<p>冒号分隔的 SGR 颜色（<code>38:2::r:g:b</code>），旧终端直接把冒号打印出来，还把数字合并成了错误的属性。你看到过终端里冒出一串 <code>38:2::255:0:0</code> 这类东西，就是这里的问题。</p>
<p>未知的 APC、SOS、PM 字符串，以前会被当成普通文本打出来，现在静默丢弃。</p>
<p>还有一批边角能力，左右边距、保护区域、tab stop 控制、insert mode、XTSAVE/XTRESTORE、Kitty 的滚动清除、X10 鼠标上报。光标闪烁模式以前是不管设不设都一直闪，现在会听。</p>
<p><img loading="lazy" src="/images/libghostty/fig4-changes.png"></p>
<h2 id="我把这个库单独拽出来跑了一下">我把这个库单独拽出来，跑了一下</h2>
<p>上面那些是官方口径。下面这段是我在自己机器上验的。</p>
<p>先做新旧对照。本机装的是 IntelliJ IDEA 2026.2.3，<code>Contents/lib</code> 下能找到 <code>intellij.libraries.jediterm.core.jar</code>、<code>intellij.libraries.jediterm.ui.jar</code> 和 <code>pty4j</code>，用 <code>find</code> 搜 ghostty 一个文件都没有。</p>
<p><img loading="lazy" src="/images/libghostty/fig1-compare.png"></p>
<p>再从 JetBrains 的发布接口取了 2026.3 的 EAP 包，1510 MB，挂在磁盘镜像里不用装就能看。多出来的东西是这个：</p>
<pre tabindex="0"><code>Contents/plugins/terminal/libghostty-vt/macos-aarch64/libghostty-vt.dylib
-rw-r--r--  1.9M  Oct 23 13:10
Mach-O 64-bit dynamically linked shared library arm64
</code></pre><p>1.9 MB 的原生动态库，走的是 plugins 目录下的 terminal 插件，不在主 lib 里。有点意外的是 JediTerm 那两个 jar 在 2026.3 里仍然保留着，跟官方说的「可以关掉回退」对得上。</p>
<p>库里导出了 205 个 C 符号，全带 <code>ghostty_</code> 前缀。按模块粗分：terminal 31 个、render 22 个、key 21 个、mouse 17 个、kitty 16 个，往后是 snapshot、color、sgr、selection、search、osc 这些。</p>
<p>dylib 里面还内嵌了一份完整的 ABI 类型描述 JSON，开头写着 <code>&quot;library_version&quot;:&quot;0.1.0-dev&quot;</code>。</p>
<p><img loading="lazy" src="/images/libghostty/fig2-symbols.png"></p>
<p>然后我把这个 dylib 从 IDEA 里单独拿出来，写了个几十行的 C 程序 dlopen 进去，调 <code>ghostty_build_info</code>：</p>
<pre tabindex="0"><code>VERSION_STRING  rc=0 len=9  &#34;0.1.0-dev&#34;
VERSION_MAJOR/MINOR/PATCH  0.1.0
SIMD=on  KITTY_GRAPHICS=on
</code></pre><p>跑通了。这一点比它换没换内核更值得说。JetBrains 打包进去的是一个标准 C ABI 库，任何程序都能链，不依赖 JVM，不依赖 IntelliJ 平台。</p>
<p><img loading="lazy" src="/images/libghostty/fig3-probe.png"></p>
<p>官方说的回退开关我也顺手核了，从 terminal.jar 里解出来，<code>terminal.use.ghostty.emulator</code> 这个 key 确实在 <code>TerminalEmulatorType</code> 和 plugin.xml 里。位置是 Help → Find Action → Registry。</p>
<h2 id="这事跟写-kotlin-和-android-的人有什么关系">这事跟写 Kotlin 和 Android 的人有什么关系</h2>
<p>如果你的日常是 IDEA 里开一个终端跑 Claude Code，然后旁边开着 gradlew 和 adb，那这次换内核动的是你每天踩的那块地板。</p>
<p>三个能直接感觉到的：Shift+Enter 不再把半句话发出去；切 Dark 模式终端里的工具跟着变；那些以前显示成乱码的控制字符不再污染输出。</p>
<p>还有一批已经能解析、但 IDE 这边还没接的能力，官方自己列了：OSC 52 剪贴板、桌面通知、Conemu 进度条、Kitty graphics、带颜色和样式的下划线。意思是解析不再是瓶颈，剩下的都在 IDE 侧。</p>
<p>最实用的一条是桌面通知，终端里的程序跑完任务能弹通知，比如 Claude 处理完一个 prompt 在等你。这条现在还没通，官方说会来得比 JediTerm 时代快。</p>
<h2 id="我的一点看法">我的一点看法</h2>
<p>把 13 年的自研终端换成别人家的库，这个决定本身比技术细节更值得琢磨。</p>
<p>JetBrains 有能力继续改进 JediTerm，他们的选择是认账。现代终端协议这一层已经不是顺便能补上的东西，自己从零追不如直接站到一个专门做这件事的库上。</p>
<p>而且 libghostty 的定位本来就是给别人用。Ghostty 官方文档里写得很明确，架构上的目标就是让其他终端项目能基于共享核心构建，专注上层功能和界面，不用重新实现终端模拟。</p>
<p>JetBrains 在博客末尾挨个谢了 Mitchell Hashimoto 和 Tim Culverhouse，说这几个月里 libghostty 也补上了 JediTerm 用户依赖的那些能力，才让这次切换做得成。</p>
<p>这话反过来读也成立。一个被当成业余项目的库，为了接住一个大客户，把对方十几年的需求补进去了。</p>
<p>你现在的日常终端是 IDE 内置那个，还是单独开一个 Ghostty、iTerm、Warp？如果 IDE 的终端真能跟上独立终端的功能，你还会专门再开一个窗口吗？</p>
<h2 id="参考资料">参考资料</h2>
<ul>
<li>JetBrains 官方博客：The Terminal in JetBrains IDEs Now Runs on libghostty（2026-10-27）</li>
<li>Ghostty 官方文档 About：https://ghostty.org/docs/about</li>
<li>libghostty 生态列表：https://github.com/Uzaaft/awesome-libghostty</li>
<li>libghostty 的 build_info 头文件：https://github.com/ghostty-org/ghostty/blob/main/include/ghostty/vt/build_info.h</li>
</ul>
]]></content:encoded></item></channel></rss>