Vim 编辑器模式
在 Claude Code 交互模式下开启 Vim 键位绑定,用 hjkl、dd、yy 等熟悉的 Vim 命令快速编辑长 prompt,附非 Vim 用户速成路径。
写长 prompt 时频繁用方向键挪光标、用 backspace 一字一字删,效率很低。如果你是 Vim 用户,开启 Vim 模式后,编辑 prompt 像编辑代码一样高效——dd 删一行、yy 复制一行、/ 搜索、ciw 改一个词,肌肉记忆全部能用。
不是 Vim 用户也别走,这篇文章后半段有一个最小化的速成路径,掌握 5 个键就能受益。
怎么开启 Vim 模式
Claude Code 提供 /vim 斜杠命令一键切换:
$ claude
> /vim
[已开启 Vim 模式,提示符可能变化,比如多个 [I] 或 [N] 标志]
> /vim
[再次输入则关闭 Vim 模式]
也可以通过设置文件持久化:
# ~/.claude/settings.json
{
"editor": {
"mode": "vim"
}
}
设置之后,每次启动 Claude Code 自动进入 Vim 模式。
怎么知道当前在不在 Vim 模式
不同版本表现略有差异,常见提示:
- 提示符前出现
[N](normal)或[I](insert)标志 - 光标形状变化:normal 模式是块状,insert 模式是细线
- 有些版本会在状态栏显示当前模式
如果你看不出来,按 Esc 然后试试输入 :——如果出现命令行提示符,就是 Vim 模式开着。
Normal vs Insert:两个模式的本质
刚开 Vim 模式的 Vim 新手最容易撞墙的是”按了字母键怎么没反应/反应很怪”。原因是 Vim 有两种模式,作用完全不同:
| 模式 | 状态 | 字母键的作用 |
|---|---|---|
| Insert(插入) | 像普通输入框 | 输入文字 |
| Normal(普通) | 编辑模式 | 触发命令(hjkl 移动、dd 删行…) |
默认进入哪种模式? 开启 Vim 模式后,默认是 Normal 模式。所以你按 a、b、c 不会输入字母,而会触发命令。
快速切换
Normal → Insert
i 在光标当前位置插入
a 在光标后一位插入(append)
I 在行首插入
A 在行尾插入
o 在下一行新建并插入
O 在上一行新建并插入
Insert → Normal
Esc (最经典)
Ctrl+[ (等价于 Esc,更顺手)
Ctrl+C (某些配置下也能用)
Vim 的核心心法:你大部分时间应该在 Normal 模式,只有真在打字的时候才切到 Insert,打完立刻 Esc 回 Normal。
Normal 模式下的常用按键
下面分类列出最高频的按键,每个都附 Claude Code 里的实战例子。
光标移动
h 左
j 下
k 上
l 右
w 跳到下一个单词的开头
b 跳到上一个单词的开头
e 跳到当前/下一个单词的结尾
0 跳到行首
^ 跳到行首第一个非空字符
$ 跳到行尾
gg 跳到 prompt 最开头
G 跳到 prompt 最末尾
nG 跳到第 n 行(比如 5G 跳到第 5 行)
{ 跳到上一段(空行分隔)
} 跳到下一段
实战:写到一半发现开头要改,按 gg 一键到顶。
删除
x 删一个字符(光标位置)
X 删一个字符(光标前)
dw 删一个单词(从光标到下一个单词开头)
db 删一个单词(往前删)
dd 删整行
ndd 删 n 行(比如 3dd 删 3 行)
d$ 删到行尾
d0 删到行首
D 等价于 d$(删到行尾)
diw 删一个 word(不管光标在 word 哪里)
di" 删两个引号之间的内容
di( 删两个括号之间的内容
实战:发现一段写歪了,光标随便放在那段,按 dap 删整段。
复制粘贴
yy / Y 复制整行
nyy 复制 n 行
yw 复制一个单词
y$ 复制到行尾
yiw 复制一个 word(光标在单词内任意位置)
p 在光标后粘贴
P 在光标前粘贴
Vim 的”复制”叫 yank(y 是首字母),“粘贴”叫 put(p)。
修改(Change):删完立即进入 Insert
cw 改一个单词(删 + 进入 Insert)
ciw 改一个 word(不管光标位置)
ci" 改两个引号之间
ci( 改两个括号之间
cc 改整行
C 改到行尾(等价于 c$)
s 删一个字符并进入 Insert
S 删整行并进入 Insert
实战:要把 prompt 里 "src/parser.ts" 改成 "src/lexer.ts",把光标移到引号附近,按 ci" 直接进入 Insert 准备打新内容。
撤销和重做
u 撤销
Ctrl+R 重做
. 重复上一次的修改命令(强大!)
实战:按错把整行删了,按 u 一键撤销。
搜索和替换
/keyword 向后搜索 "keyword"
?keyword 向前搜索
n 跳到下一个匹配
N 跳到上一个匹配
:s/old/new/ 替换当前行第一个 old 为 new
:s/old/new/g 替换当前行所有 old
:%s/old/new/g 替换整段所有 old
:%s/old/new/gc 同上,每次替换前确认
实战:写完 prompt 发现把 “TypeScript” 全打成了 “Typescript”,按 :%s/Typescript/TypeScript/g 一键全改。
退出和保存(输入框场景)
:wq "保存并提交" - 在 Claude Code 里通常等价于 Enter 提交
:q! "强制退出不保存" - 通常等价于清空输入框
不同版本对 :wq 的解读不一样,有的 Claude Code 版本里 :wq 直接提交 prompt,有的不支持。建议试一下你的版本。
完整工作流示例
假设你要写这样一条 prompt:
请帮我重构 src/utils/parser.ts,要求:
1. 改成函数式风格
2. 添加 TypeScript 类型标注
3. 保留原有的 JSDoc 注释
用 Vim 模式怎么写:
> /vim
[N]>
[N]> i # 进入 Insert
[I]> 请帮我重构 src/utils/parser.ts,要求:
[I]> [Enter]
[I]> 1. 改成函数式风格
[I]> [Enter]
[I]> 2. 添加 TypeScript 类型标注
[I]> [Enter]
[I]> 3. 保留原有的 JSDoc 注释
[I]> [Esc] # 回 Normal
[N]>
发现要改:把 “src/utils/parser.ts” 改成 “src/utils/lexer.ts”。
[N]> /parser # 搜索 parser
[N]> ciw # 改这个单词
[I]> lexer
[I]> [Esc]
[N]>
要在第 2 项后面插一项 “代码复用尽量多用高阶函数”:
[N]> /函数式 # 搜索 "函数式"
[N]> $ # 行尾
[N]> A # 行尾插入并进入 Insert
[I]> [Enter]
[I]> 2.5 多用高阶函数
[I]> [Esc]
确认无误,提交:
[N]> :wq # 提交(如果支持)
# 或者
[N]> i # 进 Insert
[I]> [Enter] # 直接 Enter 提交
与系统 Vim 配置的关系
Claude Code 的 Vim 模式不是真的跑了一个 vim 进程,而是模拟了 Vim 的 normal/insert 键位。它不会自动加载你的 .vimrc。
哪些 Vim 设置不会生效
~/.vimrc里的所有自定义键位绑定(map、imap)- 颜色主题、语法高亮
- 插件(NerdTree、fzf、etc)
- 自动命令(autocmd)
- 函数和复杂的脚本
set number,set relativenumber等显示设置
哪些行为相对一致
- 基础的 hjkl、wbe、0$、yy/dd/p
- 搜索 / ?
- 简单的 :s 替换
- u/Ctrl+R 撤销/重做
- 模式切换(Esc, i, a, o)
如果你严重依赖 .vimrc,Claude Code 内置 Vim 模式肯定不够用。这种情况下:
方案 A:用外部编辑器写 prompt
# 配置 EDITOR 环境变量
export EDITOR=vim
# 或
export EDITOR='code -w'
# 在 Claude 对话里按 Ctrl+X Ctrl+E(如果支持)调出 $EDITOR
# 或者用文件输入
> claude < prompt.md
方案 B:在 vim 里写好 prompt,复制粘贴进 Claude
# 一个 terminal
$ vim prompt.md
# 写好 :wq
# 另一个 terminal
$ cat prompt.md | xclip -sel clip # Linux
$ pbcopy < prompt.md # macOS
$ cat prompt.md | clip # Windows
# Claude 里粘贴
不熟 Vim 的人:5 键速成
如果你完全没用过 Vim,下面这 5 个键能让你立刻受益,不用学全套:
1. Esc - 回到 Normal 模式
要点:随时按,永远不会出错。按了之后字母键开始触发命令。
2. i 和 a - 进入 Insert 开始打字
i 在光标位置插入
a 在光标后插入
要点:进了 Insert 就是普通输入框,正常打字。
3. dd - 删一行
Normal 模式下连按两次 d,删除当前行。比按 Home + Shift+End + Delete 快多了。
4. u - 撤销
按错了任何东西都按 u。安全网。
5. :wq 或 Esc + Enter - 提交
要点:写完 prompt,按 Esc 退到 Normal,再 Enter 提交。
就这 5 个。把这些用顺了之后再学 hjkl 和 yy/p。
与 Emacs 模式对比
Claude Code 默认用的就是 Emacs 风格的 readline 键位(Ctrl+A、Ctrl+E、Ctrl+W 等)。Vim 模式是替代方案。两者怎么选?
| 维度 | Emacs 模式(默认) | Vim 模式 |
|---|---|---|
| 学习曲线 | 平缓,常见 Ctrl 组合 | 陡峭,要适应 normal/insert |
| 编辑长内容 | 一般 | 很强(hjkl、dd、yy、ciw) |
| 编辑短内容 | 顺手 | 模式切换显得繁琐 |
| 常用快捷键 | Ctrl+A/E/W/U/K | Esc 回 Normal 后大量单字母命令 |
| 与 shell 一致 | 是(bash readline 默认) | 不是(要 set -o vi) |
| 心智负担 | 低 | 高(要时刻意识到当前模式) |
什么时候推荐 Vim 模式
- 你日常 Vim 重度用户,肌肉记忆已经在 Vim 上
- 经常写超长 prompt(300 字以上)
- 喜欢”少打字、多用命令”的工作风格
什么时候用默认 Emacs 模式
- 不熟 Vim
- 主要写短 prompt
- 经常切换不同终端工具,不想记多套键位
常见坑
坑 1:开了 Vim 模式但下意识在 Normal 里打字
最典型的初学者陷阱:开了 Vim 模式,看到提示符,开始打 “hello”,发现:
[N]> hello
# 屏幕只动了几下,光标乱跳
# 实际发生的:
# h - 光标左移(什么都没动,因为本来就在开头)
# e - 光标移到当前单词结尾(同上)
# l - 光标右移
# l - 又一次右移
# o - 在下一行打开新行并进入 Insert(终于开始能打字了)
要诀:开了 Vim 模式后,第一件事永远是 i 进入 Insert,再开始打。
坑 2:进入 Insert 后忘了 Esc,开始执行命令
[I]> 写完 prompt 想搜索
[I]> /keyword # 这是字面量 "/keyword",不是搜索
要诀:写完 prompt → Esc → 才能用 / 搜索。
坑 3:误触 :q! 把内容全删了
:q! 在某些版本里会清空输入框内容。如果不小心按了,立刻 u 撤销试试。
坑 4:Caps Lock 没关
Vim 命令大小写敏感。Y 和 y 行为不同,G 和 g 也不同。Caps Lock 开着会让你按出来的命令完全不是你想要的。
坑 5:终端把某个键拦截了
比如 tmux 的 prefix 是 Ctrl+B,可能会和 Vim 的 Ctrl+B(向后翻页)冲突。检查 tmux 配置,把 prefix 换成不冲突的(比如 Ctrl+A)。
进阶:配合外部编辑器写超长 prompt
Claude Code 的 Vim 模式终究是简化版。写真正的长内容,调用 $EDITOR 最舒服。
在 Claude 输入框里调用外部编辑器
某些 readline 配置支持 Ctrl+X Ctrl+E:按这个组合会打开 $EDITOR,让你在真正的 vim/code/nano 里写,写完保存退出,内容自动回到 Claude 输入框。
# 在 ~/.bashrc 或 ~/.zshrc
export EDITOR=vim
# 启动 Claude
$ claude
# 输入框里
> [Ctrl+X][Ctrl+E]
# vim 启动,写一大段
:wq
# 自动回到 Claude,内容已填入输入框
[Enter] # 提交
如果 Ctrl+X Ctrl+E 没反应,看看 ~/.inputrc:
# 加上这行
set editing-mode vi
"\C-x\C-e": edit-and-execute-command
常见问题
Q:我开了 Vim 模式但 hjkl 不能动光标。
A:你大概率在 Insert 模式里。先按 Esc 切到 Normal。
Q:怎么知道当前在 Normal 还是 Insert?
A:看光标形状:块状 = Normal,细线 = Insert(大多数终端)。或者输入一个字母看反应。
Q:能用 Visual 模式吗(v、V、Ctrl+V)?
A:取决于版本。Claude Code 的 Vim 模式实现得比较精简,Visual 模式可能只支持 v 和 V,块选 Ctrl+V 不一定有。试一下就知道。
Q:能配置 leader key、自定义键位绑定吗?
A:Claude Code 的 Vim 模式不读 .vimrc,自定义能力有限。一些版本通过 ~/.claude/settings.json 暴露少数几个选项:
{
"editor": {
"mode": "vim",
"keybindings": {
"kj": "<Esc>"
}
}
}
但功能远不如真实 Vim。
Q:在 Vim 模式下 Ctrl+R 还能反向搜索历史吗?
A:Vim 模式占用 Ctrl+R 做”重做”。要搜索历史,先 Esc 然后用 /,或者切回 Emacs 模式(/vim 关闭)。
Q:我喜欢 Vim 但觉得 Claude 的实现不完整,怎么办?
A:用外部编辑器路线($EDITOR + Ctrl+X Ctrl+E,或者文件输入 claude < prompt.md)。这样你能用完整的 Vim 配置写 prompt。
快速参考
开/关 Vim 模式 /vim
进 Insert i / a / I / A / o / O
回 Normal Esc / Ctrl+[
光标
字符 h j k l
单词 w b e
行内 0 ^ $
跨行 gg G nG { }
删除
字符 x X
单词 dw db
行 dd ndd D d0
到匹配 dt) df) di"
复制 yank
行 yy nyy
单词 yw yiw
到行尾 y$
粘贴 p P
修改 change
单词 cw ciw
行 cc C
引号内 ci"
撤销 / 重做 u / Ctrl+R
重复上一次 .
搜索 /pattern ?pattern n N
替换 :%s/old/new/g
提交 :wq 或 Esc + Enter
清空 :q!(小心)
标记本节教程为已读
记录您的学习进度,方便后续查看。