VSCode Vim插件不读取系统.vimrc,键映射需在settings.json中用vim.insertModeKeyBindings等数组配置,格式为{"before":["j","j"],"after":["<Esc>"]};.vimrc无法复用,须手动转换;<C-v>冲突可禁用Vim绑定;终端中hjkl无效因属shell控制,需shell侧启用vi模式。

VSCode 安装 Vim 插件后为什么 jj 不退出插入模式?
因为 VSCode Vim(vscodevim.vim)默认不读取系统 .vimrc,所有键映射必须在 VSCode 配置中显式声明。常见错误是直接把 inoremap jj <Esc> 粘贴进 settings.json,但格式不对,插件根本识别不了。
- 必须用插件定义的
vim.insertModeKeyBindings或vim.normalModeKeyBindings数组,不是 Vim 语法 - 键名要写成字符串形式:
"jj"而不是jj;动作写成{"before": ["<esc>"]}</esc>这种结构 - 如果想全局生效(比如所有语言),别加
vim.languageOverrides限制;加了却没配对语言,映射就静默失效
正确示例:
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
]
如何让 VSCode Vim 复用本地 .vimrc 的 map 和 set?
不能直接复用。VSCode Vim 插件只支持部分 set 选项(如 set number → "vim.showLineNumbers": true),且完全不解析 .vimrc 文件。所有配置得手动翻译。
-
set relativenumber→"vim.relativeNumber": true -
nnoremap <C-h> <C-w>h→ 加到vim.normalModeKeyBindings,写成{"before": ["<c-h>"], "commands": ["workbench.action.terminal.focusPreviousPane"]}</c-h>(注意:原 Vim 命令需转为 VSCode 命令 ID) -
autocmd FileType python setlocal expandtab→ 改用 VSCode 的"[python]": {"editor.insertSpaces": true},位置在editor.insertSpaces下的 language-specific 配置里
别试图用 vim.vimrc.enable(旧版遗留项),新版插件已移除该功能。
共享快捷键时,<C-v> 粘贴失效或触发 Visual 模式怎么办?
VSCode Vim 默认把 <C-v> 当作进入可视块模式的触发键,和系统粘贴冲突。这不是 bug,是插件按 Vim 逻辑设计的——但日常开发中绝大多数人需要先粘贴再编辑。
- 最简单方案:禁用
<C-v>的 Vim 绑定,让系统接管 —— 在vim.otherModesKeyBindingsNonRecursive中加一条空映射:{"before": ["<c-v>"], "commands": []}</c-v> - 如果仍想保留块选择,改用
<C-Shift-v>或g<C-v>(需额外配置) - 注意:Windows/Linux 下
<C-v>是粘贴,macOS 是<Cmd-v>),后者不受影响,不用动
为什么在终端(Terminal)里按 hjkl 不移动光标?
VSCode 内置终端(Integrated Terminal)和编辑器是两个独立上下文。Vim 插件只接管编辑器区域的按键,终端里的 shell 仍由 bash/zsh 等控制,hjkl 默认不工作。
- 终端里想用 Vim 风格移动,得在 shell 配置里启用:
set -o vi(bash/zsh)或bindkey -v(zsh) - VSCode 设置里开
terminal.integrated.commandsToSkipShell,把workbench.action.terminal.focusNextPane这类命令排除,避免干扰 - 别指望插件自动同步
.inputrc或~/.zshrc里的bind,那是 shell 层的事
编辑器和终端的 Vim 行为本质是两套系统,硬要“统一”反而容易两边都卡住。


















