Vim 入门教程:从第一次打开到高效编辑代码

Vim 是 Linux、服务器、Git、Docker 等开发环境中常见的文本编辑器。

很多人第一次打开 Vim 时都会遇到同一个问题:

为什么我不能直接输入?又该怎么退出?

原因在于 Vim 和普通编辑器的设计思路不一样。

普通编辑器默认是“输入文字”,而 Vim 默认是“执行编辑命令”。
所以学习 Vim 的第一步是理解它的模式,背快捷键可以放在后面。

如果只是想先把 Vim 用起来,可以先记住下面四个操作:

1
2
3
4
i       进入输入模式
Esc 返回普通模式
:wq 保存并退出
:q! 不保存强制退出

仅靠这几个命令,就已经可以完成最基本的编辑工作。

1. 第一次使用 Vim

假设我们要创建一个 Python 文件:

1
vim hello.py

打开后,Vim 默认处于 Normal Mode(普通模式)。

此时按:

1
i

进入输入模式,然后输入:

1
print("Hello Vim")

输入完成后按:

1
Esc

回到普通模式。

接着输入:

1
:wq

按 Enter。

这样文件就保存并退出了。

完整过程可以记成:

1
2
3
4
5
6
7
8
9
10
11
vim hello.py
↓
i
↓
输入内容
↓
Esc
↓
:wq
↓
Enter

如果修改错了,不想保存:

1
2
3
Esc
:q!
Enter

这套流程是 Vim 最基本的“生存操作”。

2. Vim 的模式

初学阶段主要掌握四种模式即可:

模式 作用
Normal Mode 移动、删除、复制、粘贴、执行编辑命令
Insert Mode 输入文字
Visual Mode 选择文本
Command-line Mode 保存、退出、搜索替换、设置

Normal Mode

打开 Vim 后默认进入 Normal Mode。

这个模式下,键盘主要用来执行命令,而不是输入文字。

例如:

1
dd

删除当前行。

1
yy

复制当前行。

1
p

粘贴。

无论你当前在哪个模式,不确定怎么办时,都可以先按:

1
Esc

回到 Normal Mode。

Insert Mode

Normal Mode 下按:

1
i

进入 Insert Mode。

这时才可以正常输入文字。

常用的进入方式还有:

命令 作用
i 在当前光标前插入
a 在当前光标后插入
o 在下一行新建一行并输入
O 在上一行新建一行并输入
I 跳到行首并输入
A 跳到行尾并输入

刚开始只需要熟悉:

1
2
3
i
a
o

就够用了。

Visual Mode

Normal Mode 下按:

1
v

进入字符选择模式。

按:

1
V

进入整行选择模式。

选择内容后可以继续执行:

1
d

删除。

1
y

复制。

Command-line Mode

Normal Mode 下按:

1
:

进入命令行模式。

最常用的是:

1
:w

保存。

1
:q

退出。

1
:wq

保存并退出。

1
:q!

放弃修改并退出。

3. 光标移动

Vim 支持方向键,但更推荐使用:

1
h j k l

对应:

1
2
3
4
5
      k
↑
h ← → l
↓
j

也就是:

1
2
3
4
h    左
j 下
k 上
l 右

一开始可以继续用方向键,不必强迫自己立刻适应。
等基本操作熟悉后,再逐渐换成 h j k l。

按单词移动

1
w

跳到下一个单词。

1
b

跳到上一个单词。

例如:

1
2
hello world vim
^

按一次:

1
w

光标会跳到:

1
2
hello world vim
^

行内跳转

1
0

跳到当前行开头。

1
$

跳到当前行结尾。

文件内跳转

1
gg

跳到文件第一行。

1
G

跳到文件最后一行。

1
100G

跳到第 100 行。

如果程序报错:

1
server.py:916

可以直接:

1
vim +916 server.py

打开文件后直接定位到第 916 行。

4. 删除、复制和粘贴

删除

删除一个字符:

1
x

删除当前行:

1
dd

删除三行:

1
3dd

删除一个单词:

1
dw

删除到行尾:

1
d$

删除到行首:

1
d0

复制

Vim 中的复制叫 Yank。

复制当前行:

1
yy

复制三行:

1
3yy

复制一个单词:

1
yw

粘贴

1
p

例如:

1
2
yy
p

表示:

1
2
3
复制当前行
↓
粘贴到下一行

这一组命令建议优先熟悉:

1
2
3
dd
yy
p

5. 撤销和重做

撤销:

1
u

重做:

1
Ctrl + r

例如误删了一行:

1
dd

马上按:

1
u

即可恢复。

有撤销兜底,学习阶段可以大胆尝试各种命令。

6. 理解 Vim 的命令组合

Vim 的效率主要来自命令的组合方式。

可以把很多 Vim 命令理解成:

1
操作符 + 范围

例如:

1
2
d = delete
w = word

组合:

1
dw

意思就是:

1
删除一个单词

再例如:

1
2
y = yank
w = word

组合:

1
yw

就是:

1
复制一个单词

类似命令还有:

1
2
3
d$    删除到行尾
y$ 复制到行尾
cw 修改一个单词

Vim 还可以加入数量:

1
3dd

删除三行。

1
5j

向下移动五行。

1
2w

向后移动两个单词。

理解这个组合规则后,很多操作就不需要单独背诵。

7. 文本对象

写代码时,ciw 很常用。

假设代码为:

1
username = "zhang"

光标只要位于:

1
username

内部。

输入:

1
ciw

Vim 会删除整个单词,并自动进入 Insert Mode。

然后直接输入:

1
user_name

最终变成:

1
user_name = "zhang"

ciw 可以拆成:

1
2
3
c = change
i = inner
w = word

也就是:

1
change inner word

修改引号内部

例如:

1
name = "zhang"

光标位于 zhang 内部。

输入:

1
ci"

然后输入:

1
zenty

最终变成:

1
name = "zenty"

类似操作还有:

1
2
3
4
ci'     修改单引号内部
ci( 修改括号内部
ci[ 修改中括号内部
ci{ 修改大括号内部

例如:

1
print("Hello World")

把光标放在括号内部:

1
ci(

即可直接修改整个括号中的内容。

对于写代码来说,这类操作通常比鼠标选择再删除快很多。

8. 搜索和替换

搜索

Normal Mode 下输入:

1
/关键词

例如:

1
/user

按 Enter。

然后:

1
n

跳到下一个结果。

1
N

跳到上一个结果。

例如想查找所有函数定义:

1
/def

然后不断按:

1
n

即可向后查找。

替换

替换当前行第一个匹配项:

1
:s/hello/world/

替换当前行所有匹配项:

1
:s/hello/world/g

替换整个文件:

1
:%s/hello/world/g

例如把整个文件中的:

1
localhost

替换成:

1
127.0.0.1

执行:

1
:%s/localhost/127.0.0.1/g

如果想在替换前逐个确认,可以使用:

1
:%s/hello/world/gc

其中:

1
c

表示 confirm。

这样 Vim 会逐个询问是否替换,更适合修改代码中的变量名或配置项。

9. 保存、退出和显示行号

保存和退出

1
:w

保存。

1
:q

退出。

1
:wq

保存并退出。

1
:q!

不保存强制退出。

保存为另外一个文件:

1
:w test2.txt

如果不知道怎么离开 Vim:

1
2
3
Esc
:q!
Enter

如果想保存:

1
2
3
Esc
:wq
Enter

显示行号

显示行号:

1
:set number

简写:

1
:set nu

关闭:

1
:set nonumber

简写:

1
:set nonu

10. 分屏编辑

Vim 可以同时打开多个窗口。

上下分屏

1
:split

简写:

1
:sp

例如:

1
:sp test.py

左右分屏

1
:vsplit

简写:

1
:vsp

例如:

1
:vsp main.py

切换窗口

1
2
3
4
Ctrl+w h
Ctrl+w j
Ctrl+w k
Ctrl+w l

分别表示:

1
2
3
4
左
下
上
右

例如同时查看:

1
2
main.py
test_main.py

就可以使用左右分屏:

1
:vsp test_main.py

一边看源码,一边看测试代码。

11. Git 中突然进入 Vim 怎么办

执行:

1
git commit

有时候 Git 会打开 Vim,让你填写 Commit Message。

这时候不要慌。

按:

1
i

进入 Insert Mode。

输入:

1
feat: add RAG API

然后:

1
2
3
Esc
:wq
Enter

即可完成提交。

整个流程就是:

1
2
3
4
5
6
7
8
9
i
↓
输入 Commit Message
↓
Esc
↓
:wq
↓
Enter

如果不想提交:

1
2
3
Esc
:q!
Enter

12. 高频命令速查

命令 作用
i 进入 Insert Mode
a 在光标后插入
o 下一行新建并输入
Esc 返回 Normal Mode
h 左移
j 下移
k 上移
l 右移
w 下一个单词
b 上一个单词
0 行首
$ 行尾
gg 文件开头
G 文件末尾
100G 跳到第 100 行
x 删除一个字符
dd 删除一行
3dd 删除三行
dw 删除一个单词
yy 复制一行
3yy 复制三行
p 粘贴
u 撤销
Ctrl+r 重做
/xxx 搜索
n 下一个结果
N 上一个结果
v 字符选择
V 整行选择
ciw 修改当前单词
ci" 修改双引号内部
ci( 修改括号内部
:%s/a/b/g 全局替换
:set nu 显示行号
:w 保存
:wq 保存并退出
:q! 不保存退出

13. 推荐练习顺序

不建议第一次学习 Vim 就去研究插件、宏和寄存器。

先按照下面的顺序练习即可。

第一阶段:能够正常使用

先掌握:

1
2
3
4
5
6
i
Esc
:w
:q
:wq
:q!

目标是:

1
2
3
能输入
能保存
能退出

第二阶段:学会移动

1
2
3
4
h j k l
w b
0 $
gg G

目标是逐渐减少对方向键和鼠标的依赖。

第三阶段:掌握基本编辑

1
2
3
4
5
dd
yy
p
u
Ctrl+r

目标是能够快速完成:

1
2
3
4
5
删除
复制
粘贴
撤销
重做

第四阶段:掌握搜索和替换

1
2
3
4
/
n
N
:%s

修改配置文件、日志和源码时经常用到。

第五阶段:理解 Vim 的编辑语言

重点练习:

1
2
3
4
5
6
7
dw
cw
ciw
ci"
ci(
ci[
ci{

这时不要再把它们看成孤立快捷键,而是理解为:

1
操作符 + 范围

或者:

1
操作符 + 文本对象

例如:

1
2
3
d + w   = 删除一个单词
c + iw = 修改当前单词
c + i" = 修改引号内部

总结

Vim 入门其实不需要掌握很多命令。

最开始记住:

1
2
3
4
i
Esc
:wq
:q!

就可以完成基本编辑。

之后逐渐加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
h j k l
w b
gg G

dd
yy
p
u

/
n

ciw
ci"
ci(

需要理解的是两件事。

第一件是:

1
模式

第二件是:

1
命令组合

命令组合的思路是用键盘描述“我要对哪一段文本执行什么操作”。理解了 dw、ciw、ci" 为什么这样组合,用起来就顺手了。