VSCodeVim:在 VS Code 里用 Vim 编辑
文章目录
- VSCodeVim:在 VS Code 里用 Vim 编辑
VSCodeVim:在 VS Code 里用 Vim 编辑
VSCodeVim 是一个 VS Code 扩展,把 Vim 的编辑方式带进了 VS Code。项目在 GitHub 上拿到了 15,000+ 的 Star。
很多人习惯 Vim 的操作方式,hjkl 移动光标、dd 删除行、yy 复制行,这些快捷键用久了就变成了肌肉记忆。但写代码又离不开 VS Code 的插件生态和调试功能。VSCodeVim 解决的就是这个问题:在 VS Code 里还原 Vim 的编辑体验。
支持的模式
VSCodeVim 支持 Vim 的主要编辑模式:
- Normal 模式:浏览和操作文本
- Insert 模式:输入文字
- Visual / VisualLine / VisualBlock 模式:选择文本
- Replace 模式:替换字符
- OperatorPending 模式:等待操作符的第二个按键
- EasyMotion 模式:快速跳转
切换方式和 Vim 一致,Insert 模式按 Esc 回到 Normal,Normal 模式按 i 进入 Insert。
按键重映射
VSCodeVim 允许自定义按键绑定。可以在 VS Code 的 settings.json 里配置,支持四种模式的绑定:
vim.insertModeKeyBindings 用于 Insert 模式,vim.normalModeKeyBindings 用于 Normal 模式,vim.visualModeKeyBindings 用于 Visual 模式,vim.operatorPendingModeKeyBindings 用于 OperatorPending 模式。
比如把 jj 映射为 Esc:
"vim.insertModeKeyBindings": [ { "before": ["j", "j"], "after": ["<Esc>"] } ]每个绑定可以设置 before(按键序列)、after(映射目标)、commands(执行的 VS Code 命令)、silent(是否静默)。
还有 NonRecursive 版本的绑定,避免递归映射导致死循环。比如交换 j 和 k 的方向:
"vim.normalModeKeyBindingsNonRecursive": [ { "before": ["j"], "after": ["k"] }, { "before": ["k"], "after": ["j"] } ]对于 Alt+key 或 Ctrl+Shift+key 这类组合键,需要在 VS Code 的 keybindings.json 里配置。
Neovim 集成
VSCodeVim 可以接入 Neovim,使用 Neovim 的 Ex 命令。需要先安装 Neovim,然后在设置里开启 vim.enableNeovim,并指定 Neovim 的路径。开启后可以用 Neovim 的 :normal 命令、g 命令,以及更快的搜索替换。
模拟插件
VSCodeVim 内置了多个常用 Vim 插件的模拟实现:
vim-surround:处理包围字符,比如引号、括号、XML 标签。cs"’ 把双引号换成单引号,ds" 删除引号,ysiw) 给当前单词加括号。
vim-commentary:注释切换。gc 切换行注释,gC 切换块注释。gcc 注释当前行,gc2j 注释当前行和下面两行。
vim-easymotion:快速跳转。开启后,按 leader leader w 会在所有单词起始位置显示标记,按对应字母跳转过去。leader leader f 加字符可以向前查找字符并跳转。
vim-sneak:双字符跳转。s 加两个字符向前跳到第一个匹配位置,S 向后跳。
vim-indent-object:把相同缩进层级的代码块作为文本对象。在 Python 这类不用大括号的语言里比较实用,ai 选中当前缩进块加上面一行,ii 选中当前缩进块。
CamelCaseMotion:按驼峰命名和下划线分隔的单词移动。
vim-airline:根据当前模式改变状态栏颜色。Normal 模式一种颜色,Insert 模式另一种,方便区分。
ReplaceWithRegister:用寄存器内容替换文本,不改变寄存器。
vim-textobj-entire:把整个文档作为文本对象,dae 删除整个文档内容。
vim-textobj-arguments:把函数参数作为文本对象,cia 修改当前参数,daa 删除当前参数包括逗号。
多光标
VSCodeVim 支持多光标编辑。在 Windows 上按 Ctrl+D 添加下一个匹配项的光标,或者用 gb 快捷键。每个光标有独立的剪贴板。在多光标 Visual 模式按 Esc 回到多光标 Normal 模式,再按一次回到普通 Normal 模式。
Vimrc 支持
可以加载 .vimrc 配置文件。设置 vim.vimrc.enable 为 true,配置 vim.vimrc.path 指向 .vimrc 文件路径。目前只支持 remap,还在实验阶段。
一些设置
vim.useSystemClipboard:设为 true 时,Vim 的默认寄存器使用系统剪贴板,复制的内容可以直接粘贴到其他应用。
vim.handleKeys:可以把某些按键交回 VS Code 处理。比如不想让 Ctrl+F 被 Vim 接管,设为 { “”: false }。
vim.leader:定义 leader 键,默认是反斜杠,可以改成空格或其他键。
vim.hlsearch:设为 true 时高亮所有搜索匹配项。
vim.incsearch:输入搜索模式时实时显示下一个匹配。
vim.inccommand:输入替换命令时实时预览替换效果。
性能优化
可以在 settings.json 里添加:
"extensions.experimental.affinity": { "vscodevim.vim": 1 }这会提升 VSCodeVim 的运行性能。
Mac 用户注意
Mac 上需要在终端执行一条命令启用按键重复,否则某些 Vim 操作会不正常:
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false执行后注销重新登录,再重启 VS Code。同时建议在系统设置里调高键盘的按键重复速度和延迟时间。
调试按键映射
如果自定义的按键映射不生效,可以把扩展的日志级别调到 Debug,查看 Output 面板里 Vim 的输出。日志会显示每个按键的处理过程,配置错误的映射会被忽略并记录。
ode。同时建议在系统设置里调高键盘的按键重复速度和延迟时间。
调试按键映射
如果自定义的按键映射不生效,可以把扩展的日志级别调到 Debug,查看 Output 面板里 Vim 的输出。日志会显示每个按键的处理过程,配置错误的映射会被忽略并记录。
