根本原因是插件未真正启用或被其他快捷键覆盖;需确认扩展已启用、重启VSCode、状态栏显示--NORMAL--,并禁用冲突插件。

VSCode里装Vim插件后,为什么hjkl不生效?
根本原因通常是插件没真正启用,或者被其他快捷键规则覆盖了。安装完 Vim 插件后必须重启 VSCode,否则模式识别逻辑不会加载。另外,某些终端模拟器(比如集成终端里按 Ctrl+` 打开的)默认不响应 Vim 键位,只在编辑器文本区域生效。
- 确认插件状态:打开扩展面板(
Ctrl+Shift+X),搜索Vim,检查是否已启用且无报错 - 验证当前模式:光标处左下角应显示
-- NORMAL --或-- INSERT --,没显示说明没进入 Vim 模式 - 排除干扰:禁用其他键盘映射类插件(如
Sublime Text Keymap),二者会冲突 - Mac 用户注意:
Cmd+K默认绑定为“清除终端”,若你在终端里按j没反应,不是 bug,是设计如此——Vim 模式只作用于编辑器文档
如何把 jj 映射成 Esc,又不破坏原有 j 键功能?
这是插入模式下的典型需求,关键在于用 vim.insertModeKeyBindings 并设置 before 为数组序列,而不是单个按键。VSCode Vim 扩展会等待按键输入流,只有连续、无间隔地按下 jj 才触发退出,单独按一次 j 仍保持原意(向下移动)。
- 配置位置:用户
settings.json(不是 keybindings.json) - 写法必须是:
"vim.insertModeKeyBindings": [ { "before": ["j", "j"], "after": ["<esc>"] } ]</esc> - 别写成
"before": "jj"—— 这会被当作文本字符串处理,不生效 - 如果想加延迟容错(比如允许 200ms 内完成双击),需额外配
"vim.insertModeKeyBindingsNonRecursive"和正则匹配,但多数人不需要
Ctrl+D 多选和 Vim 的 d 命令冲突怎么办?
VSCode 默认的 Ctrl+D(多光标选词)和 Vim 的 d(删除操作符)本身不冲突——前者只在普通模式外、编辑器有焦点时生效;后者只在普通模式下起作用。真出问题,往往是误按了 Ctrl+D 却没看到多选反馈,其实是触发了 Vim 的 Ctrl+D 屏幕滚动。
- 区分场景:
Ctrl+D在普通模式下 = 向下滚半页;在插入/选择状态下 = 多选下一个相同词 - 想保留多选但避免误滚:在
settings.json中设"vim.handleKeys": { "<c-d>": false }</c-d>,把Ctrl+D交还给 VSCode - 同理,
"<c-u>": false</c-u>可释放向上滚动,"<c-f>": false</c-f>释放查找等 - 注意:设为
false后,Vim 模式里就真不能用Ctrl+D滚屏了,得改用Ctrl+B/Ctrl+F或鼠标滚轮
为什么我配了键位,重启后又失效了?
最常见原因是改错了文件:VSCode 的 Vim 键位必须写在 settings.json 里,不是 keybindings.json。后者只管 VSCode 原生命令绑定,对 Vim 插件的内部模式无效。
- 正确路径:打开命令面板(
Ctrl+Shift+P),输入Preferences: Open Settings (JSON) - 不要去碰
keybindings.json,除非你是在覆盖非 Vim 相关的全局快捷键(比如Ctrl+P文件搜索) - 配置项名必须严格匹配:
vim.normalModeKeyBindings、vim.visualModeKeyBindings等,拼错一个字母就静默失败 - 改完保存后,不用重启,但要确保当前文件处于编辑器焦点中——有时新配置只对新开的标签页生效,老标签页需手动按
Esc再i切换一下模式
Vim 键位迁移最难的不是配置,而是肌肉记忆切换时的「条件反射延迟」——你明明知道该按 ciw,手却先伸向鼠标。这种延迟不会因配置完美而消失,只能靠每天强制自己忍住不碰鼠标撑过前 3–5 天。


















