Ctrl+G:用 JetBrains IDE 写 Claude Code 长提示词
用 Claude Code 这么久,最让我痛苦的不是模型幻觉,不是权限弹窗——是写长 prompt。
在终端里编辑长文本,就像拿筷子在豆腐上刻字。
方向键一行行挪、想选中一段挪到前面得靠想象力、粘贴大段代码后格式崩了只能重来。尤其是写需求文档式的 prompt,几百字下来,光排版就比写代码还累。
你可能想说:那我不长篇大论了,拆成一句一句的碎片化输入不就行了?
确实,短句在终端里敲很方便。但 Claude Code 的工作方式是 ReAct——每次你按 Enter 提交,都会触发一轮 LLM 推理。同样的需求,拆成十句话输入,等于让模型做十次推理、产生十次上下文累积。推理次数越多,上下文偏移越大,越容易出现”做着做着就跑偏”的情况。
换句话说,碎片化输入绕过了终端编辑的痛点,但引入了沟通偏差的代价。
后来发现 Claude Code 其实早就内置了一个机制解决这个问题。藏得不深,只是知道的人不多。
如果能把 prompt 搬到 IDE 里就好了
我知道有人会说”你用 vim 模式啊”——但我不想。我做后端开发的,日常就在 JetBrains IDE 里,肌肉记忆全是 IntelliJ 那套快捷键。让我为了写 prompt 专门切一套编辑器心智,ROI 太低了。
写后端代码的时候,我的屏幕通常是这样:左边一个 JetBrains IDE 窗口(常驻),右边一个终端窗口跑 Claude Code。
两个窗口各司其职:IDE 负责写代码,终端负责和 AI 对话。但每次写长 prompt,我就得在终端里挣扎——这明明是我在 IDE 里最擅长的事。
如果能把 prompt 内容”搬”到 IDE 里编辑就好了。IDE 里有熟悉的快捷键、代码补全、多光标、块选择——这些肌肉记忆不用重新练。
但怎么打通两个窗口?手动复制粘贴太麻烦,而且每次都要切换焦点。
Ctrl+G:一键把输入框”搬”进你喜欢的编辑器
Claude Code 给了一个优雅的解决方案:Ctrl+G。
在 Claude Code 的输入框按 Ctrl+G,当前正在编辑的 prompt 会写入一个临时 .md 文件,然后用你的系统默认编辑器打开。
编辑完、保存、关闭——内容自动回到 Claude Code 的输入框,光标在底部等你,按 Enter 提交。
整个过程就是这样:
sequenceDiagram
participant T as 终端 (Claude Code)
participant F as 临时 .md 文件
participant E as 外部编辑器
T->>T: 用户按 Ctrl+G
T->>F: 写入当前输入框内容
T->>E: 启动 $EDITOR 打开临时文件
Note over T: 暂停 TUI,等待编辑器退出
E->>F: 用户编辑并保存
E->>T: 编辑器关闭
T->>F: 读回文件内容
T->>T: 替换输入框,恢复 TUI
注意时序图里的”启动 $EDITOR 打开临时文件”——Claude Code 通过 $EDITOR 环境变量决定用哪个编辑器。默认情况下它指向 nano 或 vim,对不习惯终端编辑器的程序员来说,这跟没解决一样。
但你可以把它指向 JetBrains IDE。
让它用 JetBrains IDE 做输入框
下面的配置和路径均基于 macOS。Windows / Linux 的原理相同,只是命令行工具路径和 shell 配置文件不一样,需要自行查阅对应平台的文档。
JetBrains IDE 提供了一个命令行工具 idea(其他 IDE 类似,比如 pycharm、webstorm)。关键是它支持 --wait 参数:启动后阻塞,直到你关闭标签页才退出。
idea等 CLI 命令需要额外安装,并非随 IDE 自动可用。打开 IDE,菜单栏选择 Tools → Create Command-Line Launcher,按提示创建即可。创建后idea命令会被写入/usr/local/bin/,终端即可直接使用。
这恰好是 Claude Code 需要的行为。配置方法:
1
2
# 在 ~/.zshrc 中添加
export EDITOR="idea --wait"
为什么需要
--wait? 终端编辑器(vim/nvim)天然在前台运行,进程不退出 Claude Code 就不会继续。
但 GUI 编辑器的主进程启动后立刻返回,不加--wait的话,Claude Code 会在编辑器还没保存时就继续执行,读到的还是旧内容。
--wait让进程一直挂着,直到你关闭标签页才退出。
配好之后,按 Ctrl+G 就会在 IntelliJ IDEA 中打开临时文件。你可以在里面用熟悉的快捷键编辑——格式化、多光标、块移动——写完 Cmd+W 关掉,内容自动回到终端。
换句话说,长篇 prompt 走 IDE 写,输出走终端。两个窗口各司其职,但信息流被打通了。
进阶:动态选择编辑器
上面的一行配置已经够用了,但有个小问题:如果 JetBrains IDE 没开着呢?
每次按 Ctrl+G 都会启动一个完整的 IDE,太重了。我只是想临时编辑一段文字,没必要为此启动一个 2GB 的进程。
我的习惯是 JetBrains IDE 常驻,所以大多数时候 Ctrl+G 直接在 IDE 里打开。但偶尔 IDE 没开,我更希望用轻量的 VS Code。
于是写了个小脚本自动判断:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# ~/.local/bin/my_editor
set -e
for arg in "$@"; do
if [[ -d "$arg" ]]; then
echo "my_editor: 不支持目录,请指定文件路径: $arg" >&2
exit 1
fi
done
idea_bin="$HOME/Applications/IntelliJ IDEA.app/Contents/MacOS/idea"
if pgrep -q -f "IntelliJ IDEA" && [[ -x "$idea_bin" ]]; then
exec "$idea_bin" --wait "$@" > /dev/null 2>&1
else
exec code --wait "$@"
fi
保存后赋予执行权限:
1
chmod +x ~/.local/bin/my_editor
然后配置环境变量:
1
2
# 在 ~/.zshrc 中
export EDITOR="my_editor"
确保
~/.local/bin已在 PATH 中。大多数 macOS 的默认 shell 配置会自动添加,如果没有,在~/.zshrc中加一行export PATH="$HOME/.local/bin:$PATH"。
两个考虑:
- JetBrains IDE 常驻 → 直接在当前窗口打开新标签页编辑,复用现有进程
- JetBrains IDE 不在 → 不用为了临时编辑启动重量级 IDE,用轻量的 VS Code
两边都支持 --wait,Claude Code 能正确等待。
这个机制跟编辑器无关——只要支持 --wait 或等效的阻塞模式就能用:
| 编辑器 | 命令 | 备注 |
|---|---|---|
| VS Code | code --wait | |
| IntelliJ IDEA | idea --wait | 其他 JetBrains IDE 同理 |
| Sublime Text | subl --wait | |
| Zed | zed --wait | |
| vim / nvim / helix | 直接写命令名 | 终端编辑器天然阻塞,不需要 --wait |
额外技巧:引用上一条回复
在 Claude Code 中运行 /config,开启 “Show last response in external editor”(v2.1.110 引入)。
开启后,Ctrl+G 打开的临时文件顶部会以 # 注释形式带上 Claude 上一条回复。方便你对照着写追问,不用切回终端翻上下文。保存时注释自动被 strip 掉,不会提交给模型。
底层原理
用久了自然会好奇:Ctrl+G 是怎么做到的?
翻了翻源码,这套机制是 Claude Code 自己用 Rust 实现的,不依赖 readline。整个流程可以概括为:
- 写文件、启编辑器 — 把输入框当前内容写到临时
.md文件,调用$EDITOR(优先$VISUAL)打开 - 交出终端控制权 — 暂停自己的界面渲染,把终端控制权交给编辑器
- 等退出、读回来 — 编辑器关闭后,读回文件内容,替换输入框,恢复 TUI
Claude Code 内部用一个简单的开关防止重复启动——编辑器打开期间再按 Ctrl+G 不会重复弹新窗口。临时文件以 .md 为后缀,编辑器会自动开启 Markdown 语法高亮。
总结
这套方案的价值不在于技术多深——源码读下来也就几百行。它的价值在于不改变你的心智模型。
几条可以直接带走的:
export EDITOR="idea --wait"一行配置,Ctrl+G 就能在 JetBrains 里编辑 prompt- GUI 编辑器必须加
--wait,否则 Claude Code 会在编辑器保存前就继续执行 - 动态选择脚本 让编辑器根据实际运行状态自动切换:JetBrains 常驻用 JetBrains,不在用轻量编辑器
- 开启”Show last response” 可以在编辑时对照 AI 上一条回复,方便写追问
对于不习惯终端编辑器的程序员来说,这可能是终端 AI 编程工具体验提升最明显的一个小配置。毕竟,没人规定终端工具就一定要在终端里写完所有东西。
觉得配置麻烦?直接把这篇文章丢给 Claude Code,让它帮你把 my_editor 脚本写好、环境变量设好、~/.zshrc 改好——
Ctrl+G 本身就是为了解决”长文本难编辑”的问题,用它自己来完成这个配置再合适不过。
不过话说回来,工具打通了只是放在那,真正用起来还得靠自己的习惯。
Ctrl+G 不难记,难的是在又一次下意识开始用方向键挪光标之前,想起来”哦,我可以按一下 Ctrl+G”。