文章

Ctrl+G:用 JetBrains IDE 写 Claude Code 长提示词

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 环境变量决定用哪个编辑器。默认情况下它指向 nanovim,对不习惯终端编辑器的程序员来说,这跟没解决一样。

但你可以把它指向 JetBrains IDE。

让它用 JetBrains IDE 做输入框

下面的配置和路径均基于 macOS。Windows / Linux 的原理相同,只是命令行工具路径和 shell 配置文件不一样,需要自行查阅对应平台的文档。

JetBrains IDE 提供了一个命令行工具 idea(其他 IDE 类似,比如 pycharmwebstorm)。关键是它支持 --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"

两个考虑:

  1. JetBrains IDE 常驻 → 直接在当前窗口打开新标签页编辑,复用现有进程
  2. JetBrains IDE 不在 → 不用为了临时编辑启动重量级 IDE,用轻量的 VS Code

两边都支持 --wait,Claude Code 能正确等待。

这个机制跟编辑器无关——只要支持 --wait 或等效的阻塞模式就能用:

编辑器命令备注
VS Codecode --wait 
IntelliJ IDEAidea --wait其他 JetBrains IDE 同理
Sublime Textsubl --wait 
Zedzed --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。整个流程可以概括为:

  1. 写文件、启编辑器 — 把输入框当前内容写到临时 .md 文件,调用 $EDITOR(优先 $VISUAL)打开
  2. 交出终端控制权 — 暂停自己的界面渲染,把终端控制权交给编辑器
  3. 等退出、读回来 — 编辑器关闭后,读回文件内容,替换输入框,恢复 TUI

Claude Code 内部用一个简单的开关防止重复启动——编辑器打开期间再按 Ctrl+G 不会重复弹新窗口。临时文件以 .md 为后缀,编辑器会自动开启 Markdown 语法高亮。

总结

这套方案的价值不在于技术多深——源码读下来也就几百行。它的价值在于不改变你的心智模型

几条可以直接带走的:

  1. export EDITOR="idea --wait" 一行配置,Ctrl+G 就能在 JetBrains 里编辑 prompt
  2. GUI 编辑器必须加 --wait,否则 Claude Code 会在编辑器保存前就继续执行
  3. 动态选择脚本 让编辑器根据实际运行状态自动切换:JetBrains 常驻用 JetBrains,不在用轻量编辑器
  4. 开启”Show last response” 可以在编辑时对照 AI 上一条回复,方便写追问

对于不习惯终端编辑器的程序员来说,这可能是终端 AI 编程工具体验提升最明显的一个小配置。毕竟,没人规定终端工具就一定要在终端里写完所有东西。

觉得配置麻烦?直接把这篇文章丢给 Claude Code,让它帮你把 my_editor 脚本写好、环境变量设好、~/.zshrc 改好——
Ctrl+G 本身就是为了解决”长文本难编辑”的问题,用它自己来完成这个配置再合适不过。

不过话说回来,工具打通了只是放在那,真正用起来还得靠自己的习惯。
Ctrl+G 不难记,难的是在又一次下意识开始用方向键挪光标之前,想起来”哦,我可以按一下 Ctrl+G”。

参考

本文由作者按照 CC BY 4.0 进行授权