Linux 命令初识第 7 课:Vim 编辑器
目标:分清 vim 的三种模式并能来回切换;会打开、保存、退出 (包括「不保存强制退出」);掌握十几个最常用的命令,能在服务器上独立改完一个配置文件。 用时:约 35 分钟。全部在 Ubuntu 里敲。
第 2 课已经学过最低限度的流程:vim 文件 → i → 输入 → Esc → :wq。这一课把它补完整,但只学够用的部分:
- 平时写代码用 IDE,vim 是应急工具:连到服务器、进到 Docker 容器里,往往只有 vi/vim。
- 典型场景:改一个配置文件 (
nginx.conf、my.cnf、.env),翻一下日志,删几行、改几个值。 - 命令不用背全,本课的十几个够用。记不住就翻本讲义的第 6 节速查表,用多了自然就记住了。
0. 准备练习数据
mkdir -p ~/practice/lesson7 && cd ~/practice/lesson7
cat > app.conf <<'EOF'
# demo app config
app_name=demo
port=8080
mode=dev
db_host=localhost
db_port=3306
cache=off
EOF
vim --version | head -1
最后一行应该输出类似 VIM - Vi IMproved 9.x ...,说明 vim 已经装好。如果提示 command not found,执行 sudo apt install -y vim。
cat > 文件 <<'EOF' ... EOF是把中间几行原样写进文件,现在照抄即可。
1. 三种模式

vim 和记事本最大的不同:按键的含义取决于当前所在的模式。同样按一下 d,在一种模式里是输入字母 d,在另一种模式里是「删除」命令的开头。
| 模式 | 用来干什么 | 怎么认出来 | 按键效果 |
|---|---|---|---|
| 普通模式 (Normal) | 移动光标、删除、复制、粘贴、撤销 | 左下角什么都不显示 | 每个键都是命令,不会输入文字 |
| 插入模式 (Insert) | 打字 | 左下角显示 -- INSERT -- (中文环境是 -- 插入 --) | 和记事本一样,打什么就是什么 |
| 命令行模式 (Command-line) | 保存、退出、跳行、查找、设置 | 光标跳到最底下一行,前面是 : 或 / | 输入一整条命令,按回车执行 |
打开 vim 时默认在普通模式。
模式之间怎么切换
按 i 按 : 或 /
插入模式 ←────────── 普通模式 ──────────→ 命令行模式
──────────→ (打开时) ←──────────
按 Esc 回车执行完 / 按 Esc 取消
- 普通模式 → 插入模式:按
i(insert,在光标前开始输入) - 插入模式 → 普通模式:按
Esc - 普通模式 → 命令行模式:按
:(输入命令) 或/(查找) - 命令行模式 → 普通模式:按回车执行命令后自动回去;输到一半不想执行了,按
Esc取消
⚠️ 插入模式和命令行模式之间不能直接切换,必须经过普通模式。在插入模式里打 :wq,只会往文件里写进 :wq 这三个字符。所以要保存,先 Esc,再 :wq。
了解即可:进入插入模式还有
a(在光标后输入)、o(在下一行新开一行输入),本课只用i就够了。
插入模式里怎么改字
插入模式下就和普通编辑器一样:方向键移动光标,退格键 (Backspace) 删字,回车换行。要把 port=8080 改成 port=9090,进入插入模式后用方向键移到 8080 后面,退格删掉,再输入 9090 即可。
2. 进入 vim
vim app.conf # 打开已有文件
vim new.txt # 文件不存在时打开一个空文件,保存 (:w) 之后才会真正创建
vim +5 app.conf # 打开并直接跳到第 5 行 (了解即可)
常见坑:交换文件警告 (E325)
vim 编辑时会生成一个隐藏的交换文件 .文件名.swp,正常退出时自动删除。如果上次没正常退出 (直接关了终端、SSH 断了),或者另一个终端正开着同一个文件,再打开时会看到:
E325: ATTENTION
Found a swap file by the name ".app.conf.swp"
...
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
| 情况 | 怎么做 |
|---|---|
| 另一个终端正开着这个文件 | 按 Q 退出,回那个终端去改,避免两边互相覆盖 |
| 上次是意外断开,确认原会话已结束 | 有未保存内容要保留时,先按 R 恢复并检查;只有确认交换文件不再需要时,才考虑删除 |
了解即可:也可在终端执行
vim -r app.conf尝试恢复,在 Vim 内用:w app.conf.recovered另存一份核对。不要未检查就删除交换文件,具体见 Vim 官方恢复手册。
3. 退出 vim

先按 Esc 确保在普通模式,再输入:
| 命令 | 作用 |
|---|---|
:w | 保存,不退出 |
:q | 退出。有未保存的修改时会拒绝退出 |
:wq | 保存并退出 (最常用) |
:q! | 不保存,强制退出,放弃上次保存后尚未保存的修改 |
已经用
:w保存到磁盘的内容,不会因为:q!自动还原。
:q 被拒绝时,底部会显示:
E37: No write since last change (add ! to override)
意思是「上次保存后你又改过东西,还没保存」。这时二选一:要保留修改就 :wq,不要就 :q!。
了解即可:
:x和:wq效果基本一样 (区别是没改过时:x不会重新写文件)。
两条兜底规则
- 不知道自己在什么模式,就先按
Esc(多按几下也没关系)。 - 改乱了想重来,就
Esc再:q!,然后重新打开。
记住这两条,就永远不会被困在 vim 里。
4. 普通模式常用命令

以下命令都在普通模式下直接按,不需要回车,左下角也不会显示出来。
移动
| 按键 | 作用 |
|---|---|
gg | 跳到文件第一行 |
G | 跳到文件最后一行 (大写 G,即 Shift+g) |
| 方向键 | 上下左右移动 |
了解即可:
hjkl分别是左、下、上、右,作用和方向键一样。打开 vim 后直接打字会乱,就是因为这些字母都被当成了命令。
删除、复制、粘贴
| 按键 | 作用 |
|---|---|
dd | 删除光标所在的整行 (删掉的内容会暂存起来,可以用 p 粘贴,相当于「剪切」) |
yy | 复制光标所在的整行 (y 是 yank,复制的意思) |
p | 把刚才删除或复制的内容粘贴到光标下一行 |
了解即可:前面加数字表示重复,
3dd一次删 3 行,5yy一次复制 5 行。
例:要把 db_host=localhost 这一行挪到文件最后,光标移到这行,dd 剪切,G 跳到最后一行,p 粘贴到它下面。
撤销
| 按键 | 作用 |
|---|---|
u | 撤销上一步操作,可以连按多次一步步往回退 |
了解即可:撤销过头了,按
Ctrl+r重做。
5. 命令行模式常用命令

按 : 或 / 后,命令会显示在最底下一行,输完按回车才执行。
跳到指定行、显示行号
| 命令 | 作用 |
|---|---|
:set nu | 显示行号 (nu 是 number 的缩写)。只对当前这次打开有效 |
:行号 | 跳到指定行,如 :5 跳到第 5 行 |
后端场景:报错信息里写着 app.conf line 137: unknown key,打开文件后 :137 直接跳过去。
了解即可:取消行号用
:set nonu。
查找
| 命令 | 作用 |
|---|---|
/关键字 | 从光标处往下查找,如 /port |
n | 跳到下一个匹配 (在普通模式按,不用回车) |
N | 跳到上一个匹配 (大写 N) |
找到文件末尾后会自动从头开始找,底部提示 search hit BOTTOM, continuing at TOP。
后端场景:一个几百行的 nginx.conf,要改 listen 那一行,/listen 回车直接定位,不用一页页翻。
了解即可:批量替换用
:%s/旧/新/g,比如:%s/8080/9090/g把全文的 8080 换成 9090。
6. 速查表
| 场景 | 操作 |
|---|---|
| 打开 | vim 文件 |
| 进入编辑 | i 进入插入模式,Esc 回到普通模式 |
| 保存退出 | :w 保存,:wq 保存并退出,:q 退出,:q! 不保存强制退出 |
| 移动 | gg 到开头,G 到末尾,:行号 跳到指定行 |
| 删除 / 复制 / 粘贴 | dd 删除一行,yy 复制一行,p 粘贴到下一行 |
| 撤销 | u |
| 查找 | /关键字 往下找,n 下一个,N 上一个 |
| 显示行号 | :set nu |
| 兜底 | 先 Esc;改乱了 :q! |
了解即可:有些命令 (比如
git commit不带-m、crontab -e) 会自动打开一个编辑器,具体是 vim 还是 nano 取决于系统配置。打开的如果是 vim,就按本课的方法写完、:wq保存退出。
7. 跟着敲一遍
这一节主要是按键,不是 shell 命令。每一步先猜会发生什么,再按下去看对不对。
cd ~/practice/lesson7
vim app.conf
进入 vim 后,依次操作:
| 步骤 | 按键 | 先猜:会发生什么? |
|---|---|---|
| 1 | :set nu 回车 | 左边出现什么? |
| 2 | G | 光标到第几行? |
| 3 | gg | 光标到第几行? |
| 4 | /port 回车 | 光标停在哪一行? |
| 5 | n | 又跳到哪一行? (提示:db_port 里也有 port) |
| 6 | :3 回车 | 回到 port=8080 这行 |
| 7 | i,用方向键移到 8080 末尾,退格删掉,输入 9090 | 左下角显示什么? |
| 8 | Esc | 左下角的提示还在吗? |
| 9 | :q 回车 | 能退出吗? 底部显示什么? |
| 10 | /cache 回车,再 dd | 哪一行没了? |
| 11 | u | 那一行回来了吗? |
| 12 | :5 回车,yy,再 G,p | db_host=localhost 被复制到了哪里? |
| 13 | :wq 回车 | 保存并退出 |
退出后在终端里确认结果:
cat -n app.conf # 猜:第 3 行是什么? 一共几行? 最后一行是什么?
最后体验一次「改乱了放弃」:
vim app.conf
在 vim 里随便按 dd 删掉几行,然后 Esc,:q! 回车。
cat -n app.conf # 猜:刚才删掉的行还在吗?
8. 练习题
题目在本文件夹的 题目解答.md 里。先执行文件开头「练习准备」里的命令,再做题。
vim 的操作是按键,没法直接贴成命令,所以本课的解答分两部分写:
- 按键记录:写在
text代码块里,按顺序记下你按了什么,例如/port 回车 → i → (改成 9090) → Esc → :wq 回车。 - 验证输出:退出 vim 后,在终端里用
cat -n、diff等命令检查文件,把命令和输出贴进bash代码块。
做完告诉我,我来批改。
9. 课后
- 提交:
01-环境准备-01-linux命令初识-第7课vim编辑器