Vim最大的魅力在于高效的键位设置和灵活的按键组合,熟练使用Vim可以提升编辑效率。

基本光标移动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
i -> 在当前光标前插入字符

I -> 在当前行前插入字符

a -> 在当前光标位置处插入字符

A -> 在当前行首位置处插入字符

O -> 在当前行上方插入新行

o -> 在当前行下方插入新行

h -> 光标向左移动

j -> 光标向下移动

k -> 光标向上移动

l -> 光标向右移动

esc -> 退出当前模式,进入命令模式

高级光标移动和基本编辑

 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
r -> 替换当前光标处的字符

R -> 连续替换当前光标处的字符,直到按esc退出

w -> 移动到下一个单词的起始处(连续的字母和数字构成的序列组成一个单词)

W -> 移动到下一个单词的起始处(仅以空格作为单词的分隔符)

e -> 移动到下一个单词的尾部(与w类似)

E -> 移动到下一个单词的尾部(与W类似)

b -> 移动到上一个单词的起始处(与w类似)

B -> 移动到上一个单词的起始处(与W类似)

x -> 删除当前光标处的字符

X -> 删除当前光标前的字符

dd -> 删除当前行

d$ -> 删除当前光标到行尾的所有字符

dw -> 删除当前光标到下一个单词起始处前的所有字符

de -> 删除当前光标到下一个单词尾部的所有字符

cc -> 删除当前行的字符,并进入编辑模式

c$ -> 删除当前光标到行尾的所有字符,并进入编辑模式

cw -> 删除当前光标到下一个单词起始处的所有字符,并进入编辑模式

ce -> 删除当前光标到下一个单词尾部的所有字符,并进入编辑模式

注意使用c[x]组合命令时,若尾部是空格,不会删除空格。

复制与粘贴

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
yy -> 复制当前行

yw -> 复制当前光标到下一个单词起始处前的所有字符

ye -> 复制当前光标到下一个单词尾部的所有字符

y$ -> 复制当前光标到当前行尾部的所有字符

c[x], d[x]命令除了执行相应的编辑功能,还会把删除的内容复制到剪切板

p -> 在当前光标后粘贴

P -> 在当前光标前粘贴

组合命令与特殊命令

 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
0 -> 移动光标到当前行首

$ -> 移动光标到当前行尾

^ -> 移动光标到当前行第一个非空字符的位置

g_ -> 移动光标到当前行最后一个非空字符的位置

fa -> 移动光标到当前行当前光标后第一个字符'a'的位置

3fa -> 移动光标到当前行当前光标后第3个字符'a'的位置

F -> 与f类似,但是向前移动

3ta -> 移动光标到当前行当前光标后第3个字符'a'的位置前

T -> 与t类似,但是向前移动

G ->移动光标到文件末尾

gg -> 移动光标到文件起始处

[n]G -> 移动到第n行

:[n] -> 与[n]G相同

撤销与搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
u -> 撤销上一步

<C-r> -> Ctrl + r,反撤销

? -> 从当前光标处向文件起始处搜索(反向)

/ -> 从当前光标处向文件末尾处搜索(正向)

Enter -> 执行命令,得到结果

n -> 移动光标到下一个搜索结果

N -> 移动当前光标到上一个搜索结果

:noh -> 取消搜索结果高亮

如果搜索关键词中包含特殊字符,需要在特殊字符前使用转义字符'\'

其他高级指令

 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
ma -> 在当前光标处设置标签,书签标记为'a'

'a -> 移动光标到标签'a'处

% -> 以括号匹配的方式移动光标: (, [, {

* -> 移动光标到下一个与当前单词匹配的单词

# -> 移动光标到上一个与当前单词匹配的单词

> -> 增加缩进

< -> 减少缩进

= -> 自动缩进

~ -> 改变当前字母的大小写

zc -> 折叠

zC -> 对所在范围执行递归折叠

zo -> 展开折叠

zO -> 对所在范围执行递归展开

[z -> 到当前打开的折叠的开始处

]z -> 到当前打开的折叠的末尾处

zj -> 向下移动到下一个折叠的开始处,关闭的折叠也计入

zk -> 向上移动到上一个折叠的末尾处,关闭的折叠也计入

. -> 重复上一条编辑指令(不是光标移动指令)

N <'command'> -> 执行指令'command' N次, 例如10j向下移动10行

多文件与多窗口

 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
:w -> 保存修改

:q -> 退出当前文件

:e <path/to/file> -> 通过file的路径名打开该文件

:x -> 与:wq相同

:bn -> 在当前窗口中切换到下一个打开的文件

:bp -> 在当前窗口中切换到上一个打开的文件

:tabnew -> 创建一个新的tab

:tabclose -> 关闭当前tab

:tabn -> 切换到下一个tab

:tabp -> 切换到上一个tab

:split -> 将当前窗口按照水平方向分割为上下两个窗口

<C-w s> -> 等同于:split

:vsplit -> 将当前窗口按照垂直放心分割为左右两个窗口

<C-w v> -> 等同于:vsplit

<C-w (h, j, k, l)> -> 在窗口间移动

<C-w c> -> 关闭光标所在的窗口