前言
之前一直听说vim开发,效率高,刚好学习记录一下VSCode中的vim使用
安装
vscode插件市场搜索 Vim
命令行执行(macOS)
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
Cmd+Shift+P输入
>open user settings
按回车配置settings.json
{
"vim.easymotion": true,
"vim.incsearch": true,
"vim.useSystemClipboard": true,
"vim.useCtrlKeys": true,
"vim.hlsearch": true,
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
],
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["<leader>", "d"],
"after": ["d", "d"]
},
{
"before": ["<C-n>"],
"commands": [":nohl"]
},
{
"before": ["K"],
"commands": ["lineBreakInsert"],
"silent": true
}
],
"vim.leader": "<space>",
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false
},
"// To improve performance",
"extensions.experimental.affinity": {
"vscodevim.vim": 1
}
}
模式
| 模式 | 名称 | 进入 |
|---|---|---|
| 普通 | NORMAL | 默认 |
| 可视 | VISUAL | v |
| 插入 | INSERT | i |
| 命令 | COMMAND | : |
模式切换
NORMAL => INSERT| 操作 | 按键 |
|---|---|
| 光标前 / 后 | i / a |
| 行首 / 尾 | I(大写i) / A |
| 下行 / 上行 | o / O |
INSERT => NORMAL
jj(推荐)或者ESC
VISUAL => NORMAL
v
光标移动
h j k l 一般我们右手食指放在j,对应就是下,右边k上,左右两边分别是h左,l右。这个多加练习自然能熟练
| 按键 | 操作 |
|---|---|
| w | 下个单词开头 |
| b | 上个单词开头 |
| e | 下个单词结尾 |
| ge | 上个单词结尾 |
| gg | 第一行 |
| G | 最后一行 |
| 0 | 行首 |
| ^ | 行首开始第一个非空 |
| $ | 行尾 |
| :n | 跳到第n行 |
| f{char} | 跳到下个{char}字符所在位置 |
| F{char} | 跳到上个{char}字符所在位置 |
| t{char} | 跳到下个{char}字符所在前一位置 |
| T{char} | 跳到上个{char}字符所在前一位置 |
| ; | 重复上次查找字符操作 |
| , | 重复上次查找字符反向操作 |
动作 motion
动作就是你选择怎么去操作,比如有一个字符"aaa",你按d操作符,是触发了删除操作,再按iw 就是删除""里面的单词,就是删除aaa三个字符,得到""
i是inner(内部)的简写,操作不包括符号,a是around(包含)的简写,操作包括符号
| 按键 | 操作 | 记忆 |
|---|---|---|
| iw / aw | 单词内部 / 外部 | |
| i( / a( / ib / ab | 小括号()内 / 外部 | b代表bracket |
| i{ / a{ / iB / aB | 花括号{}内 / 外部 | b代表Bracket |
| i" / a" | 双引号内 / 外部 | |
| i' / a' | 单引号内 / 外部 | |
| i< / a< | <>内 / 外部 | |
| i[ / a[ | []内 / 外部 | |
| it / at | html标签内 / 外部 | |
| is / as | 句子内 / 外部 | 一般是一大段文字,不包括空格 |
| ip / ap | 段落内 / 外部 | 一般是一大段文字,包括空格 |
操作符 operator
NORMAL模式进行
| 按键 | 操作 |
|---|---|
| d(delete) | 删除 |
| c(change) | 修改(删除并进入插入模式) |
| y(yank) | 复制 |
| v(visual) | 选中并进入 VISUAL模式 |
| u(un) | 取消 |
| e(entire) | 整个文件 |
常规操作
| 按键 | 操作 | 说明 |
|---|---|---|
| dd | 删除一行 | 一般双按是操作行 |
| ndd | 删除n行 | n是多个 |
| gd | 跳到方法定义 | go to definition |
| gh | 显示方法定义 | go to hierarchy |
| gb | 多光标模式 | 选中多个修改 |
| gt | 跳回 | |
| gT | 跳回上方标签页 | Cmd+Option+左/右 更简单 |
| Cmd+0/1/2 | 编辑跳文件目录/1分屏窗口/2分屏窗口 | 按jk 下上移动 l打开 |
切换大小写
| 按键 | 操作 | 补充 |
|---|---|---|
| ~ | 光标字母改变大小写 | |
| n~ | 光标开始n个字母改变大小写 | |
| g~~ | 改变当前行字母大小写 | 比如 g~$是当前光标到结尾全改变大小写 |
| gUU | 改变当前行字母大写 | |
| guu | 改变当前行字母小写 | |
| gUaw(gUiw) | 改变光标下单词大写 | |
| guaw(guiw) | 改变光标下单词小写 |
easymotion模式(插件)
leader代表是什么按键触发,比如 space按两下触发 再按 fn 查找(find)下一个n字符,会标红,按对应字母光标跳转过去
vim-surround(插件)
比如"abc" 我们按 cs"[ 就是调用 change surround 把 " 变成 [
结果变成 [abc]
settings.json 配置editor跳termnial
{
"before": ["<leader>", "t"],
"commands": ["workbench.action.terminal.focus"],
"silent": true
}
按 space + t 触发
settings.json 配置跳到下/上一个tab
settings.json 找到 vim.normalModeKeyBindingsNonRecursive
{
"before": ["t", "p"],
"commands": [":tabp"]
},
{
"before": ["t", "n"],
"commands": [":tabn"]
}
按 tp跳到上一个标签页(previous) tn跳到下一个标签页(next)