vim插件提供了非常非常多的功能,要全记住并灵活运用很不容易。我对vim插件操作方法按程序员的思路进行了分类整理,归纳下来有以下几类:
- 操作函数:比如复制、删除、修改,以下简称函数。
- 快捷函数:就是预设了数量及参数的函数,快捷函数不再接受数量及参数,以下简称快捷。
- 高阶函数:就是使用函数作为参数的函数。例如:宏、寄存器、标注。
- 操作类型:比如字符、单词、行、段落、上半屏、下半屏、全文等等,以下简称参数。
- 操作数量:比如要复制3个字,这里的3就是操作数量,以下简称数量。
- 切换方法:仅用于切换状态,没有任何操作类型、操作数量。
操作数量
操作数量不能单独使用,必须配合操作类型、操作函数使用。操作数量在普通模式、视图模式均可使用。案例如下:
- 2b:往前跳转2个单词,单词开头
- 2e:往后跳转2个单词,单词尾部
- 3x:删除3个字符
- 2dd:删除2行
- d2j:删除光标所在行及下面2行
操作类型
字符
- h:光标左移
- j:光标下移
- k:光标上移
- l:光标右移
单词
-
w (word):到下一个单词开头,不忽略符号
-
W (word):到下一个单词开头,忽略符号
-
e (end):到本单词尾部或下一单词结尾,不忽略符号
-
E (end):到本单词尾部或下一单词结尾,忽略符号
-
b (begin):到上一个单词开头,不忽略符号
-
B (begin):到上一个单词开头,忽略符号
-
ge:到上一单词结尾
-
gE:到上一单词结尾,忽略符号
行
- 0:到行首
- ^:到行首第一个非空字符
- $:到行尾
- gg:到第一行
- G:到最后一行
- 数字G:跳转到指定数字行,如20G即跳到第20行
- 数字回车:向后跳转数字行
- f字符:快速定位到行内指定字符(向后找)
- F字符:快速定位到行内指定字符(向前找)
- -:向上移动一行
- +:向下移动一行
段落
- (:上一段落
- ):下一段落
页面
-
H:页头
-
L:页尾
-
M:页中
-
{:向上翻一屏(自定义)
"vim.normalModeKeyBindingsNonRecursive":
{ // 屏幕『向上』移动一页
"before": [
"{"
],
"after": [
"<C-b>"
]
},
- }:向下翻一屏(自定义)
"vim.normalModeKeyBindingsNonRecursive": [
{ // 屏幕『向下』移动一页
"before": [
"}"
],
"after": [
"<C-f>"
]
},
]
- [:向上翻半屏(自定义)。自定义设置如下:
"vim.normalModeKeyBindingsNonRecursive": [
{ // 屏幕『向上』移动半页
"before": [
"["
],
"after": [
"<C-u>"
]
},
]
- ]:向上翻半屏(自定义)。自定义设置如下:
"vim.normalModeKeyBindingsNonRecursive": [
{ // 屏幕『向上』移动半页
"before": [
"]"
],
"after": [
"<C-d>"
]
},
]
- zt:快捷,将光标所在行切换到页面的顶部
- zb:快捷,将光标所在行切换到页面的底部
- zz:快捷,将光标所在行移动到屏幕的中间
- zc:快捷,折叠代码块
- zo:快捷,打开代码块
- za:快捷,切换代码块状态
普通模式 --NORMAL–
函数
复制y:前参、后参
- 2yge,向左复制不含光标共2个词
- 2yh,向左复制不含光标共2个字
- 3yl,向右复制含光标共3个字
- y5l,复制含光标共5个字
- y1j,复制含光标行及下一行
- y2k,复制含光标行及上2行
- y3w,复制含光标单词及后续共3个单词
- y$,复制含光标到行尾
- y^,复制不含光标到行首
- yw:复制一个单词
- yaw:复制整个单词
- ye:复制光标后一个单词
- yb,复制光标前一个单词
- yj:复制下一行内容
- y2j:复制下2行内容
- yk:复制上一行内容
- y3k:复制上3行内容
- y$:复制到行尾,含光标处
- y^:向前复制至行首空字符处,不含光标
- y0:复制到行首,不含光标处
- y(:复制上一段落
- y):复制下一段落
- yG:复制到结尾
- ygg:复制到开头
大写Y:快捷,复制光标所在行。
删除块d:前参、后参
小写d:删除指定内容块。案例如下:
- 1dj,删除光标所在行及下一行
- d1j,删除光标所在行及下一行
- dd,删除光标所在行
- dw,删除光标处开始至单词结尾。例如:单词"password",光标停在w上按dw后剩下"pass"
- diw,删除光标处的整个单词。例如:单词"password",光标停在d上按diw后剩下""
- di符号,删除光标处符号范围内全部内容。例如"your password",光标停在r上按di"后剩下""
- da符号,删除光标处符号范围内连同符号。例如:input “your password”!,光标停在r输入da"剩下input!
大写D:快捷,删除光标至行尾内容块。
删除字符x:仅前参
小写x:向右删除字符,相当于del键。案例如下:
- x,删除光标所在的字符
- 3x,向右删除含光标共3个字符
大写X:向左删除字符,相当于Backspace键。案例如下:
- X,删除光标前面的字符
- 2X,删除光标前面2个字符
删除换行J
- J:快捷,删除当前行行尾的换行符
插入换行K
- K:快捷,在光标前插入换行符并进编辑模式。自定义设置如下:
// 普通模式下非递归绑定按键
"vim.normalModeKeyBindingsNonRecursive": [
{ // 断行并进入编辑状态
"before": [
"K"
],
"commands": [
"lineBreakInsert"
],
"silent": true
},
]
编辑块c:前参、后参
编辑c:删除指定内容块后进编辑模式。案例如下:
- ck:删除光标所在行及上一行
- cj:删除光标所在行及下一行
- cw:删除光标处开始的一个单词
- ce:删除光标处开始的一个单词
- ciw:删除光标处开始的整个单词
- caw:删除光标处开始的整个单词连外面的符号
- cb:删除光标前一个单词
- cc:删除整行
- 3cc:直接删3行
- c$:删除到行尾,含光标处
- C:删除至行尾
- c^:向前删除至行首空字符处,不含光标
- c0:删除到行首,不含光标处
- c(:删除上一段落
- c):删除下一段落
- cG:删除到结尾
- cgg:删除到开头
大写C:快捷,删除含光标至行尾内容块后进编辑模式。
编辑字符s:仅前参
小写s:删除含光标处字符进编辑模式。案例如下:
- s:删除光标处字符进编辑模式
- 5s:删除含光标处及之后共计5个字符进编辑模式
大写S:快捷,删除光标所在行后进编辑模式。
粘帖p:仅前参
小写p:在光标后粘贴内容。案例如下:
- p:将剪贴板中的最新内容复制一份到光标后面。
- 3p:将剪贴板中的最新内容复制三份到光标后面。
大写P:在光标前粘贴内容,用法和小写p一致。
替换r:仅前参
小写r:替换光标处字符。案例如下:
- r:将接下来一次的输入替换光标处的那个字符(中文输入一个词也算一次输入)。对“123”的1按r然后输入中文词“中国人”,结果是“中国人23”
- 2r:将接下来的一次输入替换含光标向右的2个字符(中文输入一个词也算一次输入)。对“123”的1按2r然后输入中文词“中国人”,结果是“中国人中国人3”
大写R:进入替换模式
撤销与反撤销u
- u:快捷,撤销最近一次修改
- 数字u:撤销最近数字次修改(自定义)
重复执行
- .:快捷,最后一次操作重复执行一次
- 数字.:最后一次操作重复执行数字次
字母大小写切换~
- ~:切换将光标所在位置的字符大小写互换(shift+1左边的符号)
- 3~:将光标开始的3个字符大小写互换(shift+1左边的符号)
- g~:切换当前行字母的大小写
- 3~:将光标开始的3个字符大小写互换(shift+1左边的符号)
- gUU:将当前行的字母换成大写
- gUaw(gUiw):将光标下的单词换成大写
- guaw(guiw):将光标下的单词换成小写
- 可视模式下,选中字母后,按U将其换成大写
- 可视模式下,选中字母后,按u将其换成小写
行内查找字符F
- f{char}:光标到下个{char}
- F{char}:光标到上个{char}
- ;:继续找
- ,:反向找
行内查找字符T
- t{char}:光标到下个{char}前
- T{char}:光标到上个{char}前
- ;:继续找
- ,:反向找
高阶函数
宏q
录制
q字母,然后操作键盘,操作结束后再按q即表示宏录制完毕。例如:
- qai123,再按esc,q
播放
@字母,重复宏记录的键盘操作。例如:
- @a,就可以执行输入i123,结果就是在光标处插入了123
寄存器"
存入
"小写字母<y、d、x>:将y或d或x的内容存入寄存器。例如:
- "ayk:将当前行及上1行内容存入a寄存器
取出
"字母<p或P>:将寄存器内容取出。例如:
- "ap:将a寄存器内容粘贴到光标后面
标注m
m字母,记录当前光标的位置。例如:
- 现在光标在第10行,按mc,记录下当前位置。
标注
标注位置后,进行翻页、跳转、移动光标,再按`字母,光标会迅速跳回到之前记录的位置。例如:
- 输入gg,光标回到第1行,再按`c,光标会回到第10行。
重复输入
- 先输数字再按i再按esc可以快速输入重复内容
- 先按5,再按i,再输入abc,再按esc,相当于快速输入5个abc
命令模式
全文查找
- /{string}:光标到下个{string}
- ?{string}:光标到上个{string}
- n:继续找
- N:反向找
全文替换
- :%s/word1/word2/g:全文直接将word1替换成word2
- :%s/word1/word2/gc:全文直接将word1替换成word2,替换前会询问
- :1,$s,从第一行到最后一行
- :10,20,从第10行到第20行
- 在 10 - 20 行添加 // 注释
:10,20s#^#//#g - 在 10 - 20 行删除 // 注释
:10,20s#^//##g - 在 10 - 20 行添加 # 注释
:10,20s/^/#/g - 在 10 - 20 行删除 # 注释
:10,20s/#//g
可视模式 --VISUAL–
进入可视模式后按v或esc键可还原到普通模式
- 字符选择模式,小写v
- 行选择模式,大写V
- 块选择模式,(自定义)
"vim.normalModeKeyBindingsNonRecursive": [
{ // 进入块选择模式
"before": [
"\\",
],
"commands": [
"extension.vim_ctrl+v"
]
},
]
模式切换
替换模式切换 --Replace–
- r:替换光标所在字符
- R:进入替换模式
插入模式切换 --INSERT–
insert
- i:在光标前插入
- I:在行首插入
append
- a:在光标后插入
- A:在行尾插入
oneLine
- o:在下一行插入
- O:在上一行插入
change
- c:删除字符后进插入模式
- C:删除光标处至行尾进编辑模式
vim插件设置
我禁止vim使用ctrl,因为vscode本身有大量快捷键用了ctrl。为此另外增加了许多leader快捷操作。
"vim.leader": "<space>", // 绑定vim前导键
"vim.easymotion": true, // 启用easymotion插件
"vim.incsearch": true,
"vim.useSystemClipboard": true, // 是否启用系统粘贴板作为vim寄存器
"vim.useCtrlKeys": false, // 是否由vim接管ctrl+any的按键
"vim.hlsearch": true, // 是否突出显示与当前搜索匹配的所有文本
"vim.highlightedyank.enable": true, // 被复制时是否高亮
"vim.highlightedyank.duration": 500, // 被复制时高亮持续时间:0.5秒
// 可视模式下的非递归按键绑定
"vim.operatorPendingModeKeyBindings": [],
// 插入模式下的非递归按键绑定
leader快捷键
- 空格+u:还原最近一次的撤销,这个和普通模式下u的逆操作。(等价于ctrl+z撤销,ctrl+shift+z取消撤销)
"vim.normalModeKeyBindingsNonRecursive": [
{ // 取消最近的撤销
"before": [
"<leader>",
"u"
],
"after": [
"<C-r>",
]
},
]
- 空格+/:当前页查找字符串跳转(原来是2个空格+/)
"vim.normalModeKeyBindingsNonRecursive": [
{ // 全屏查找字符串
"before": [
"<leader>",
"/"
],
"after": [
"<leader>",
"<leader>",
"/"
]
},
]
- 空格+s:当前页查找字符跳转(原来是2个空格+s)
"vim.normalModeKeyBindingsNonRecursive": [
{ // 全屏查找字符串
"before": [
"<leader>",
"s"
],
"after": [
"<leader>",
"<leader>",
"s"
]
},
]
- 空格+p:复制一行()
"vim.normalModeKeyBindingsNonRecursive": [
{ // 复制一行
"before": [
"<leader>",
"p"
],
"after": [
"y",
"y",
"p",
]
},
]
其他编程常用快捷操作
- gd:选中函数,进入其内部查看(goto definition)
- gh:显示悬停提示信息(goto hover)
- gt:切换标签页(goto tab),向后
- gT:切换标签页(goto tab),向前
- 2gt:跳到第2个标签页
- ctrl+tab:可以快速切换
- alt+数字:跳到指定标签
- ctrl+b:开关侧边栏
- ctrl+0:切换到侧边栏,选中文件按空格打开,再按l切换到文件
- ctrl+w:关闭当前工作区
- ctrl+数字:切换指定工作区
多光标
- ctrl+shift+up:向上加一个光标
- ctrl+shift+down:向下加一个光标
- ctrl+u:撤销上一次的多光标
内容互换
- alt+up:光标所在行内容向上移动一行
- alt+down:光标所在行内容向下移动一行
代码编辑
-
gcc:注释
ngcj:注释从本行和下方n行的代码
gcnj也可以用
ngck:注释从本行和上方n行的代码
gcnk也可以 -
zc:折叠代码
-
zo:取消折叠代码
-
za:切换代码折叠状态
-
gh:查看代码提示
-
gd:跳转到代码源码
-
diw:删除光标以后的单词(delete inner word)
-
daw:删除光标所在的整个单词(delete all word)
-
dit:删除Row标签内所有内容(delete inner tab)
-
dat:删除Row标签体全部内容(delete all tab)
-
di":删除符号内的所有内容,如"password!“,在"内部输入di"后剩下”"
-
da":删除符号内的所有内容,如a “password”!,在"内部输入da"后剩下a!
-
surrounds处理(对外围符号、标签的处理)
cs"‘:将test外面的双引号快速改变为单引号"test",输入cs"’
ds":将"test"外面的符号删除,输入ds"
cs"t:将"test"外面的内容更改为标签对,<<123>test</<123> -
多光标操作gb
选中标签对中的任意字符,按ctrl+d,再按c,就能同时修改标签对的内容。abcd
选中标签对中的任意字符,按gbc,就能同时修改标签对的内容。abcd
区域
- ctrl+b:开关侧边栏
- ctrl+0:切换到侧边栏
- ctrl+1:切换到工作区1
- ctrl+2:切换到工作区2
- …
- ctrl+n:新建文件
- gt(go to tab):跳到下一个标签页
- gT(go to tab):跳到上一个标签页
- ngt(go to tab):跳到第n个标签页