跳到主要内容

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 模式与进入:三种模式、切换按键、打开文件和输入文字

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​

Vim 保存退出与异常:w、q、wq、q!、E37 和 E325 恢复处理

先按 Esc 确保在普通模式,再输入:

命令作用
:w保存,不退出
:q退出。有未保存的修改时会拒绝退出
:wq保存并退出 (最常用)
:q!不保存,强制退出,放弃上次保存后尚未保存的修改

已经用 :w 保存到磁盘的内容,不会因为 :q! 自动还原。

:q 被拒绝时,底部会显示:

E37: No write since last change (add ! to override)

意思是「上次保存后你又改过东西,还没保存」。这时二选一:要保留修改就 :wq,不要就 :q!。

了解即可::x 和 :wq 效果基本一样 (区别是没改过时 :x 不会重新写文件)。

两条兜底规则​

  1. 不知道自己在什么模式,就先按 Esc (多按几下也没关系)。
  2. 改乱了想重来,就 Esc 再 :q!,然后重新打开。

记住这两条,就永远不会被困在 vim 里。


4. 普通模式常用命令​

Vim 普通模式编辑:移动、整行删除复制粘贴、撤销重做和按键实例

以下命令都在普通模式下直接按,不需要回车,左下角也不会显示出来。

移动​

按键作用
gg跳到文件第一行
G跳到文件最后一行 (大写 G,即 Shift+g)
方向键上下左右移动

了解即可:h j k l 分别是左、下、上、右,作用和方向键一样。打开 vim 后直接打字会乱,就是因为这些字母都被当成了命令。

删除、复制、粘贴​

按键作用
dd删除光标所在的整行 (删掉的内容会暂存起来,可以用 p 粘贴,相当于「剪切」)
yy复制光标所在的整行 (y 是 yank,复制的意思)
p把刚才删除或复制的内容粘贴到光标下一行

了解即可:前面加数字表示重复,3dd 一次删 3 行,5yy 一次复制 5 行。

例:要把 db_host=localhost 这一行挪到文件最后,光标移到这行,dd 剪切,G 跳到最后一行,p 粘贴到它下面。

撤销​

按键作用
u撤销上一步操作,可以连按多次一步步往回退

了解即可:撤销过头了,按 Ctrl+r 重做。


5. 命令行模式常用命令​

Vim 查找与配置:行号、定位、搜索、替换以及备份修改验证流程

按 : 或 / 后,命令会显示在最底下一行,输完按回车才执行。

跳到指定行、显示行号​

命令作用
: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 回车左边出现什么?
2G光标到第几行?
3gg光标到第几行?
4/port 回车光标停在哪一行?
5n又跳到哪一行? (提示:db_port 里也有 port)
6:3 回车回到 port=8080 这行
7i,用方向键移到 8080 末尾,退格删掉,输入 9090左下角显示什么?
8Esc左下角的提示还在吗?
9:q 回车能退出吗? 底部显示什么?
10/cache 回车,再 dd哪一行没了?
11u那一行回来了吗?
12:5 回车,yy,再 G,pdb_host=localhost 被复制到了哪里?
13:wq 回车保存并退出

退出后在终端里确认结果:

cat -n app.conf # 猜:第 3 行是什么? 一共几行? 最后一行是什么?

最后体验一次「改乱了放弃」:

vim app.conf

在 vim 里随便按 dd 删掉几行,然后 Esc,:q! 回车。

cat -n app.conf # 猜:刚才删掉的行还在吗?

8. 练习题​

题目在本文件夹的 题目解答.md 里。先执行文件开头「练习准备」里的命令,再做题。

vim 的操作是按键,没法直接贴成命令,所以本课的解答分两部分写:

  1. 按键记录:写在 text 代码块里,按顺序记下你按了什么,例如 /port 回车 → i → (改成 9090) → Esc → :wq 回车。
  2. 验证输出:退出 vim 后,在终端里用 cat -n、diff 等命令检查文件,把命令和输出贴进 bash 代码块。

做完告诉我,我来批改。


9. 课后​

  • 提交:01-环境准备-01-linux命令初识-第7课vim编辑器