Vim教程
Vim 入门教程:从第一次打开到高效编辑代码
Vim 是 Linux、服务器、Git、Docker 等开发环境中常见的文本编辑器。
很多人第一次打开 Vim 时都会遇到同一个问题:
为什么我不能直接输入?又该怎么退出?
原因在于 Vim 和普通编辑器的设计思路不一样。
普通编辑器默认是“输入文字”,而 Vim 默认是“执行编辑命令”。
所以学习 Vim 的第一步是理解它的模式,背快捷键可以放在后面。
如果只是想先把 Vim 用起来,可以先记住下面四个操作:
1 | i 进入输入模式 |
仅靠这几个命令,就已经可以完成最基本的编辑工作。
1. 第一次使用 Vim
假设我们要创建一个 Python 文件:
1 | vim hello.py |
打开后,Vim 默认处于 Normal Mode(普通模式)。
此时按:
1 | i |
进入输入模式,然后输入:
1 | print("Hello Vim") |
输入完成后按:
1 | Esc |
回到普通模式。
接着输入:
1 | :wq |
按 Enter。
这样文件就保存并退出了。
完整过程可以记成:
1 | vim hello.py |
如果修改错了,不想保存:
1 | Esc |
这套流程是 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 | i |
就够用了。
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 | k |
也就是:
1 | h 左 |
一开始可以继续用方向键,不必强迫自己立刻适应。
等基本操作熟悉后,再逐渐换成 h j k l。
按单词移动
1 | w |
跳到下一个单词。
1 | b |
跳到上一个单词。
例如:
1 | hello world vim |
按一次:
1 | w |
光标会跳到:
1 | 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 | yy |
表示:
1 | 复制当前行 |
这一组命令建议优先熟悉:
1 | dd |
5. 撤销和重做
撤销:
1 | u |
重做:
1 | Ctrl + r |
例如误删了一行:
1 | dd |
马上按:
1 | u |
即可恢复。
有撤销兜底,学习阶段可以大胆尝试各种命令。
6. 理解 Vim 的命令组合
Vim 的效率主要来自命令的组合方式。
可以把很多 Vim 命令理解成:
1 | 操作符 + 范围 |
例如:
1 | d = delete |
组合:
1 | dw |
意思就是:
1 | 删除一个单词 |
再例如:
1 | y = yank |
组合:
1 | yw |
就是:
1 | 复制一个单词 |
类似命令还有:
1 | d$ 删除到行尾 |
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 | c = change |
也就是:
1 | change inner word |
修改引号内部
例如:
1 | name = "zhang" |
光标位于 zhang 内部。
输入:
1 | ci" |
然后输入:
1 | zenty |
最终变成:
1 | name = "zenty" |
类似操作还有:
1 | 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 | Esc |
如果想保存:
1 | Esc |
显示行号
显示行号:
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 | Ctrl+w h |
分别表示:
1 | 左 |
例如同时查看:
1 | 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 | Esc |
即可完成提交。
整个流程就是:
1 | i |
如果不想提交:
1 | Esc |
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 | i |
目标是:
1 | 能输入 |
第二阶段:学会移动
1 | h j k l |
目标是逐渐减少对方向键和鼠标的依赖。
第三阶段:掌握基本编辑
1 | dd |
目标是能够快速完成:
1 | 删除 |
第四阶段:掌握搜索和替换
1 | / |
修改配置文件、日志和源码时经常用到。
第五阶段:理解 Vim 的编辑语言
重点练习:
1 | dw |
这时不要再把它们看成孤立快捷键,而是理解为:
1 | 操作符 + 范围 |
或者:
1 | 操作符 + 文本对象 |
例如:
1 | d + w = 删除一个单词 |
总结
Vim 入门其实不需要掌握很多命令。
最开始记住:
1 | i |
就可以完成基本编辑。
之后逐渐加入:
1 | h j k l |
需要理解的是两件事。
第一件是:
1 | 模式 |
第二件是:
1 | 命令组合 |
命令组合的思路是用键盘描述“我要对哪一段文本执行什么操作”。理解了 dw、ciw、ci" 为什么这样组合,用起来就顺手了。