最近被要求改用vim写代码,感觉自己的一些操作非常笨拙,完全浪费了vim的强大功能,下定决心从头学习vim的各种操作和技巧,顺便把学到的内容整理出来,内容持续更新中,包括各种基础操作和一些提高生产力的小技巧,适合和我一样刚接触vim或者想要系统练习vim操作的友友们,一起成为vim高手!
(二)Vim 普通模式下的常用操作和技巧:移动,编辑,查找与替换
(三) Vim 可视模式下的常用操作和技巧:选择高亮区,批量快速的操作
(五)Vim插入模式下的快捷操作和多文件的窗口管理 :分割窗口,打开目录
......
更新中
1. Vim的常用模式
普通模式:默认状态,在此模式下,可以实现光标的快速移动和文本的快速编辑
插入模式:进行文本输入,类似普通编辑器
可视模式:对选择的区域高亮,并进行操作
选择模式:类似于文档编辑时的鼠标高亮选择,在选择模式下输入字符会直接代替高亮区域,并进入插入模式
命令行模式:在编辑器底部输入命令并执行
插入-普通模式:可以执行一个普通模式命令后返回插入模式
替换模式:替换光标所在位置的字符
1.1 常用模式之间的转换
Vim的初始状态是普通模式,其他模式下可以通过 Esc 或 Ctrl+[(等同于 Esc)回到普通模式,图中展示了Vim中各模式之间的转换关系,其中普通模式向插入模式和可视模式的转换比较常用,且方法比较多,所以放到后面单独介绍。
1.1.1 普通模式/插入模式 -> 替换模式
替换模式下,输入的字符将直接替换光标下的内容,可以实现字符的快速修改。在普通模式下,命令 R 可以进入替换模式下,在插入模式下也可以使用 Insert键 实现和替换模式下的相互转换。
1.1.2 插入-普通模式
在插入模式下,Ctrl+o 可以进入插入-普通模式,将在执行一个普通模式下的命令后自动回到插入模式。例如,可以使用 Ctrl+o 进入插入-普通模式后,使用命令 zz 重绘屏幕,把当前行显示在中间,然后返回插入模式继续编辑。
2. 普通模式下的操作
vim中的很多快速操作都是在普通模式下实现的,掌握好普通模式下的操作技巧非常重要。
2.1 光标移动
2.1.1 单个字符的移动
模式 | 按键 | 功能 |
普通模式 | h | 左移 |
j | 下移 | |
k | 上移 | |
l | 右移 |
此外,可以在命令前加上数字,代表重复执行。例如:4h – 向左移动4个字符。
2.1.2 在单行内移动
模式 | 按键 | 功能 |
普通模式 | 0 | 移到本行开头 |
$ | 移到本行结尾 | |
[num]| | 移到本行第[num]列的字符 | |
^ | 移动到本行第一个非空白字符 |
这一系列操作是对于实际行来进行的,而由于vim窗口的大小限制,实际的一行可能会被分成几行显示在屏幕上,如果想要针对于屏幕行进行移动,可以在命令前加g命令。
模式 | 按键 | 功能 |
普通模式 | g0 | 移到本行开头 |
g$ | 移到本行结尾 | |
g[num]| | 移到本行第[num]列的字符 | |
g^ | 移动到本行第一个非空白字符 |
这种按屏幕行移动的方法也适用于其他移动方法,比如h, j, k, l操作。
2.1.3 按文字区域移动
模式 | 按键 | 功能 |
普通模式 | w | 移动到下一单词开头 |
b | 移动到当前单词/上一单词开头 | |
e | 移动到下一单词结尾 | |
ge | 移动到上一单词结尾 |
当使用大写字母时,可以基于字符串进行操作:
模式 | 按键 | 功能 |
普通模式 | W | 移动到下一字符串开头 |
B | 移动到当前字符串/上一字符串开头 | |
E | 移动到下一字符串结尾 | |
gE | 移动到上一字符串结尾 |
在按区域移动时,也可以通过数字进行多次移动。例如:2w - 移动到后面第二个单词开头。
使用g可以在行间进行移动:
模式 | 按键 | 功能 |
普通模式 | gg | 移动到文本开头 |
G | 移动到最后一行 | |
[num]G | 移动到第num行 | |
gf | 跳转到光标下的文件名 |
2.1.4 光标快速跳转
模式 | 按键 | 功能 |
普通模式 | % | 在开闭括号之间跳转 |
( 或 ) | 跳转至上一句/下一句开头 | |
{ 或 } | 跳转到上一段/下一段开头 | |
[[ 或 ]] | 跳转到本节/下一节开头 |
可以通过 m{char} 命令设定标志点进行跳转,也可以快速跳转至其他关键位置,跳转列表记录了此前的跳转操作:
模式 | 按键 | 功能 |
普通模式 | Ctrl+] | 跳转到光标下的关键词定义处 |
‘{char} | 跳转到标记处 | |
‘’ | 跳转回上次跳转之前的位置 | |
‘. | 跳转到上次修改的位置 | |
‘^ | 跳转回上次插入的位置 | |
‘[ | 上次修改复制的起始位置 | |
‘< | 上次高亮选区的起始位置 | |
Ctrl+o和Ctrl+l | 向前跳转和向后跳转 | |
:jumps | 查看跳转列表 | |
Ctrl+] | 跳转到光标下的关键词定义处 | |
‘{char} | 跳转到标记处 | |
‘’ | 跳转回上次跳转之前的位置 | |
‘. | 跳转到上次修改的位置 |
普通模式下可以实现快速翻页:
模式 | 按键 | 功能 |
普通模式 | Ctrl+F | 向前移动一个屏幕 |
Ctrl+B | 向后移动一个屏幕 | |
Ctrl+D | 向前移动半个屏幕 | |
Ctrl+U | 向后移动半个屏幕 |
也可以快速跳转光标到屏幕上的指定位置:
模式 | 按键 | 功能 |
普通模式 | zz/z. | 移动屏幕使光标处于屏幕中间 |
z+Enter | 移动屏幕使光标处于屏幕上方 | |
z- | 移动屏幕使光标处于屏幕底部 | |
H/M/L | 跳转到屏幕最上方/中间/最下方 |
2.2 基本编辑操作
2.2.1 删除操作
删除操作实际上是将内容剪切到无名寄存器,因此在使用时要注意寄存器的覆盖问题,在 d 命令前 “{register} 可以更改寄存器。普通模式下删除操作主要由 d 命令完成:
模式 | 按键 | 功能 |
普通模式 | dl/x | 删除当前光标下的内容 |
d[num]w | 删除当前光标到下个(第num个)单词开头的内容 | |
d[num]b | 删除当前光标到上个(第num个)单词开头的内容 | |
d[num]e | 删除当前光标到本单词/后一(第num个)单词结尾的内容 | |
d[num]ge | 删除当前光标到本单词/前一(第num个)单词结尾的内容 | |
daw | 删除光标所在单词 |
同样的,大写字母命令可以基于字符串进行操作:
模式 | 按键 | 功能 |
普通模式 | d[num]W | 删除当前光标到下个(第num个)字符串开头的内容 |
d[num]b | 删除当前光标到上个(第num个)字符串开头的内容 | |
d[num]E | 删除当前光标到本字符串/后一(第num个)字符串结尾的内容 | |
d[num]gE | 删除当前光标到本字符串/前一(第num个)字符串结尾的内容 | |
daW | 删除光标所在字符串 |
d 命令也可以对更大范围操作:
模式 | 按键 | 功能 |
普通模式 | [num]dd | 删除当前num行 |
d0 | 删除当前光标到本行开头 | |
d$/D | 删除当前光标到本行结尾 | |
dap | 删除当前段 | |
dt[char] | 删除到首个[char]前一个字符 | |
d+ | 删除下一行 | |
d[num]| | 删除本行第num列 | |
d{ | 删除上一段 | |
d/pattern | 删除到第一个pattern中间的内容 | |
dG | 删除到结尾 | |
d[num]G | 删除第num行 |
2.2.2 修改操作
与删除命令基本一致,且直接进入插入模式进行更改替换。普通模式下用 c 命令替换 d,可以参考删除操作进行更改操作。其中删除当前光标下内容可用 r 命令代替 cl 删除当前光标下的内容。
2.2.3 粘贴操作
模式 | 按键 | 功能 |
普通模式 | p | 将缓存中的内容放在光标后 |
P | 将缓存中的内容放在光标前 |
2.2.4 复制操作
复制操作和删除粘贴操作一样,可以与游标移动命令相结合,普通模式下用 y 命令替换 d,可以参考删除操作进行复制操作。例外是:Y 并不是复制到行尾而是复制整行。
2.2.5 其他常用操作
模式 | 按键 | 功能 |
普通模式 | i | 在游标所在位置插入文字 |
I | 在一行的开头插入文字 | |
a | 在游标后加入文字 | |
A | 在一行的最后加入文字 | |
o | 在游标下一行开启新行 | |
O | 在游标上一行开启新行 | |
s | 消除当前字元并代换文字 | |
S | 消除一行并代换文字 | |
J | 合并目前这一行与下一行 | |
~ | 切换目前字符的大小写 | |
. | 重复上一步操作 | |
u | 还原上一步动作 | |
U | 将一整行还原回原来的状态 |
2.3 查找与替换
模式 | 按键 | 功能 |
普通模式 | /patten | 向后开始寻找符合样式的内容 |
?patten | 向前开始寻找符合样式的内容 | |
n | 往同一方向重复搜索 | |
N | 反向重复搜索 |
查找行内的单个字符可以直接用 f/t 命令:
模式 | 按键 | 功能 |
普通模式 | f{char} | 移动光标到本行下一个{char} |
F{char} | 移动光标到本行上一个{char} | |
t{char} | 移动光标到本行下一个{char}的前一个字符 | |
T{char} | 移动光标到本行上一个{char}的后一个字符 | |
; | 重复寻找,方向相同 | |
, | 重复寻找,方向相反 |
在这些命令前加上数字 [num],则会搜寻字符第 [num] 次出现的地方。
总结:普通模式下的操作比较灵活多样,但其实都有规律可循。我的建议是先掌握光标移动的各种技巧,基本编辑操作实际上就是操作关键词 d(删除)、c(修改)、y(复制)和移动操作的灵活结合。多加练习后就可以熟练快速的对文本进行操作啦。