在vscode中使用vim

如何vscode中使用vim插件

前言

如何在vscode中使用vim模式进行输入,这是我在学习了vim之后就在想的问题。现在我了解到了vscode中的vim插件可以实现这个功能,但是需要对于vscode原有的快捷键进行大改,因为原来的快捷键和vim自带的快捷键是冲突的。所以我在网络上收集了一些vim模式下的快捷键的设置。记录如下。

安装

直接在vscode商店中搜索vim,第一个插件便是需要的插件。

配置

首先,我们需要在vscode中配置settings.json文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
// 绑定vim前导键
"vim.leader": "<space>",
// 启用easymotion插件
"vim.easymotion": true,
// 启用系统粘贴板作为vim寄存器
"vim.useSystemClipboard": true,
// 由vim接管ctrl+any的按键,而不是vscode
"vim.useCtrlKeys": true,
// 突出显示与当前搜索匹配的所有文本
"vim.hlsearch": true,
// 普通模式下的非递归按键绑定
"vim.normalModeKeyBindingsNonRecursive": [],
// 插入模式下的非递归按键绑定
"vim.insertModeKeyBindings": [],
// 命令模式下的非递归按键绑定
"vim.commandLineModeKeyBindingsNonRecursive": [],
// 可视模式下的非递归按键绑定
"vim.operatorPendingModeKeyBindings": [],
// 下面定义的按键将交由vscode进行处理,而不是vscode-vim插件
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false
}
}

其中的普通模式下的非递归按键绑定插入模式下的非递归按键绑定等等是什么含义?

其实就是可以在这个模式下使用的快捷键映射,如下所示:

一个简单的例子,在INSERT模式下使用jj退回到NORMAL模式:

1
2
3
4
5
6
7
8
9
10
11
"vim.insertModeKeyBindings": [
{
"before": [
"j",
"j"
],
"after": [
"<Esc>"
]
},
],

下面的示例将演示如何在NORMAL模式下按下快捷键执行COMMAND的命令,如按下后,取消高亮搜索:

1
2
3
4
5
6
7
8
9
10
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": [
"<C-n>"
],
"commands": [
":nohl"
]
},
],

除此之外,你也可以定义在按下一些按键后,调用vscode下的命令API,比如在NORMAL模式下按下gc后,调用vscode的全局命令:

1
2
3
4
5
6
7
8
9
10
11
12
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": [
"<leader>",
"g",
"c"
],
"commands": [
"workbench.action.showCommands"
]
}
],

注意!leader键只在代码编辑区域生效,它无法做到全vscode生效。

针对一些刚接触vscode不久的朋友,可能不知道怎么拿到vscode的热键映射命令,其实你可以从vsocde的键盘快捷键中复制命令ID获得。

复制所得的Copy Command ID就是上面的workbench.action.showCommands等等。

下面是网络上的快捷键设置方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 ctrl + g c : 显示命令面板
ctrl + g s : 打开设置页面
ctrl + g k : 打开热键映射
ctrl + g m : 打开一个目录
ctrl + g f : 打开一个文件
ctrl + g h : 打开最近记录
ctrl + g n : 新建vscode实例
ctrl + g q : 关闭vscode示例

ctrl + f n : 新建文件
ctrl + f o : 打开文件
ctrl + f e : 另存为文件
ctrl + f s : 保存文件
ctrl + f w : 保存所有文件
ctrl + f q : 关闭文件
ctrl + f a : 关闭所有文件

ctrl + n [ : 切换侧边栏显示状态
ctrl + n 1 : 显示文件资源管理器
ctrl + n 2 : 显示TODO Tree
ctrl + n 3 : 显示全局搜索
ctrl + n 4 : 显示debug
ctrl + n 5 : 显示版本控制
ctrl + n 6 : 显示SQL Tools
ctrl + n 7 : 显示Docker
ctrl + n 8 : 显示测试
ctrl + n 9 : 显示插件商店

ctrl + p ] : 切换面板显示状态
ctrl + p 1 : 显示问题
ctrl + p 2 : 显示输出
ctrl + p 3 : 显示终端
ctrl + p 4 : 显示调试控制台
ctrl + p 5 : 显示SQL CONSOLE
以下是编辑区域操作控制方案:

ctrl + q :关闭当前选项卡或分屏
ctrl + e :聚焦在第一个选项卡中
ctrl + , :切换到上一个选项卡
ctrl + . :切换到下一个选项卡

ctrl + w s :拆分一个上下分屏
ctrl + w v :拆分一个左右分屏

ctrl + w k :将光标向上移动1屏
ctrl + w j :将光标向下移动1屏

ctrl + w h :将光标向左移动1屏
ctrl + w l :将光标向右移动1屏

代码控制区域:

ctrl + h : 触发帮助提示
ctrl + j : 触发参数提示
ctrl + k : 触发建议提示
ctrl + n : 移动到下一个建议
ctrl + p : 移动到上一个建议
tab : 选择下一个建议
enter : 选择当前建议

ctrl + alt + l : 格式化代码(个人习惯)

ctrl + = : 放大字体
ctrl + - : 缩小字体

常用的快捷键

之前我常用的vscode快捷键变化:

ctrl p => ctrl+g p

ctrl b => ctrl+n [

ctrl f => ctrl+f f

ctrl shift p => ctrl+g c

ctrl w => ctrl q

ctrl shift e 将光标切换至右边的文件栏

ctrl n [ 打开右边的文件栏
此外该插件还提供了一些便捷热键:

1
2
3
gd : 跳转到函数定义或引用处,搭配cmd+i/cmd+o查看源码很方便
gh : 触发帮助提示
gb : 开启多光标模式,选中和当前单词相同的单词gd : 跳转到函数定义或引用处,搭配cmd+i/cmd+o查看源码很方便

自带插件

这个vim插件除开有vim模式还有一些其他的插件功能。

vim-esaymotion插件

vim-esaymotion插件使用它之前你必须在settings.json中加入下面这一行:

"vim.easymotion": true,它的作用是通过以下的按键组合,你可以快速的定位到任何你想修改的行中:

<leader><leader>s<char>

详细教程

vim-surround插件

vim-surround插件,如果你想修改、或者删除单引号和双引号,它带给你的体验将是无与伦比的,以下是它的语法:

1
2
ds<existing>
cs<existing><desired>

示例如下:

1
2
3
4
5
# 删除以下的[]
[1, 2, 3] -> ds[

# 将以下的[]修改为()
[1, 2, 3] -> cs[(

详细教程

vim-commentary插件

vim-commentary插件,该插件能够快速的利用键盘进行行或者块的注释,它内部其实是调用了vscode的注释API:

1
2
gcc :行注释
gCC :块注释

自动进行输入法转换

如果你在INSERT模式下使用中文输入法进行编辑,当ESC到NORMAL模式下后,它将依然保持中文输入法,这会使我们需要频繁的使用ctrl+shift或者cmd+space进行输入法切换,非常麻烦。

我们可以下载一个im-select插件,其帮助我们自动转换。经过我的使用,只有这个页面下的exe可以用于Windows系统,另外一个wim-mspy无法使用。

使用方法

首先将输入法切换至纯英文模式,然后在powershell中执行./im-select得出英文模式下的句柄我的是1033。然后将下面的代码添加至vim插件的settings.json文件中。

1
2
3
4
5

"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "1033",
"vim.autoSwitchInputMethod.obtainIMCmd": "F:\\app\\shurufa-switch\\im-select.exe",
"vim.autoSwitchInputMethod.switchIMCmd": "F:\\app\\shurufa-switch\\im-select.exe {im}",

至此完成

参考资料

https://zhuanlan.zhihu.com/p/430603620


在vscode中使用vim
https://ysc2.github.io/ysc2.github.io/2024/02/17/在vscode中使用vim/
作者
Ysc
发布于
2024年2月17日
许可协议