Vim 是一个高度可配置的文本编辑器,旨在实现高效的文本编辑。它是大多数 UNIX 系统中分发的 vi 编辑器的改进版本。

Vim 通常被称为“程序员的编辑器”,对于编程非常有用,以至于许多人认为它是一个完整的 IDE。但这不仅仅适用于程序员。Vim 非常适合各种文本编辑,从撰写电子邮件到编辑配置文件。

安装

你可以在Linux终端中输入下面的命令来查看是否安装了

vim --version

如果出现一大串版本信息,说明 Vim 已经在了。
如果提示 Command 'vim' not found,就安装一下:

sudo apt update && sudo apt install vim -y

安装完后再用 vim --version 确认即可。

基本操作

创建并打开文件

我们创建一个叫hello.txt的文件来练习:

vim hello.txt

回车后,你的终端会变成 Vim 的界面,大概长这样:

~
~
~
"hello.txt" [New File]

此刻你处于普通模式(Normal Mode),这是 Vim 的“默认状态”,所有按键都被理解成命令,而不是输入文字。

编辑文件

想往文件里写内容,必须先进入插入模式(Insert Mode)。按一下键盘上的 i 键(小写字母 i)。你会看到屏幕底部出现 -- INSERT -- 字样,说明现在可以像普通记事本一样打字了。试试输入下面这段文字(可以随意改内容):

Hello, Vim!
This is my first step.
I'm not afraid anymore.

随意换行,就像平常一样。写完内容后,按一下 Esc 键(键盘左上角那个键)。你会发现底部的 -- INSERT -- 消失了,这就回到了普通模式。在普通模式下,键盘上的字母又变回了命令。

核心认知:在 Vim 里,你要么在“打字模式”,要么在“命令模式”,大脑要时刻清楚自己在哪种模式里。这是新手最难适应但最重要的一点。

保存文件

然后需要保存文件。保存文件需要在普通模式下输入 : 进入“命令行模式”,然后输入 w(代表 write)并回车。

操作序列:

  1. 确认你已经在普通模式(看不到 --INSERT--)。

  2. : 键(冒号,需要组合 Shift + ;)。

  3. 屏幕底部会出现一个 : 提示符。

  4. 接着输入 w

  5. Enter 回车。

你会看到底部显示类似:

"hello.txt" [New] 3L, 60B written

这表示文件已保存(写入了 3 行,60 字节)。

退出文件

保存之后,我们想退出。还是在普通模式下:

  1. 输入 : (冒号)

  2. 输入 q (代表quit)

  3. Enter

Vim界面消失,回到终端提示符,说明你已经安全退出。输入

cat hello.txt

查看我们刚刚编辑的文件,如果看到刚刚输入的文字,说明编辑成功。

假设我们修改了文件内容,但是又不想保存,直接退出,再打开文件

vim hello.txt

这次按 i 进入插入模式,胡乱加一些内容,然后按 Esc 回到普通模式,输入 :q 回车。Vim会报错:

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

意思是文件被修改过,但没保存,我们输入 :q! 回车强制退出,不保存。你会直接退回终端,刚才的修改不会保存。

命令总结

我们可以在普通模式下输入 :wq 回车,意思是保存并离开

操作

命令

说明

从终端打开/创建文件

vim 文件名

进入 Vim

进入插入模式

i

屏幕底部出现 --INSERT--

退出插入模式

Esc

回到普通模式

保存

:w

冒号+w,回车

退出(无修改时)

:q

冒号+q,回车

强制退出不保存

:q!

放弃修改,直接退出

保存并退出

:wq:x

保存后离开

移动的艺术

请先用 vim 打开一个文件,我们边看边练:

vim practice.txt

然后按 i 进入插入模式,把下面这段示例文本一字不差地打进去(或复制粘贴也行,但要确认粘贴成功)。这段文本是我们全章的练习场:

The quick brown fox
jumps over the lazy dog.
It was the best of times,
it was the worst of times.
Hello, Vim World!

Esc 回到普通模式,我们开始移动。

常见移动方式

基础移动 h j k l

  • h —— 向左(←)

  • j —— 向下(↓)

  • k —— 向上(↑)

  • l —— 向右(→)

词间移动 w b e

  • w —— 跳到下一个单词的开头(word)

  • b —— 跳到上一个单词的开头(back)

  • e —— 跳到当前(或下一个)单词的末尾(end)

行内精准移动 0 ^ $

  • 0 —— 跳到这一行的绝对开头(第 0 列)

  • ^ —— 跳到这一行第一个非空白字符

  • $ —— 跳到这一行的末尾

文件级跳跃 gg G

  • gg —— 跳转到文件的第一行

  • G —— 跳转到文件的最后一行

数字 + G 可以跳到指定行,比如 3G 跳转到第 3 行。

屏幕级滚动 Ctrl-u Ctrl-d Ctrl-f Ctrl-b

  • Ctrl + u —— 向上翻半页(up)

  • Ctrl + d —— 向下翻半页(down)

  • Ctrl + f —— 向前翻一整页(forward)

  • Ctrl + b —— 向后翻一整页(backward)

为了验证效果,我们可以把刚刚的内容多复制几遍,尽量超过一页

命令总结

移动范围

命令

动作

字符

h / j / k / l

左 / 下 / 上 / 右

单词

w

下一个单词开头

单词

b

上一个单词开头

单词

e

当前/下一个单词末尾

行内

0

行首(绝对)

行内

^

行首(第一个非空字符)

行内

$

行尾

文件

gg

文件第一行

文件

G

文件最后一行

文件

数字G

跳到指定行号

屏幕

Ctrl+u / Ctrl+d

上半页 / 下半页

屏幕

Ctrl+f / Ctrl+b

下整页 / 上整页

操作符与动作组合

操作符 (Operator) 是“做啥”:d 删除,c 修改,y 复制

动作 (Motion) 是“对哪做”:w 一个词,$ 到行尾,gg 到文件头

把它们组合起来,就是一句话。比如 “删除一个单词” 就是 d + w = dw

常见操作

删除操作符 d

  • dw —— 删除一个单词

  • d$ —— 删除到行尾

  • dd —— 删除整行

  • dG —— 删除到文件尾

修改操作符 c—— 删除并进入插入模式

cd 的动作范围一模一样,但它多做了一个动作:删完后自动按了 i,让你进入插入模式开始写新东西。

  • cw —— 修改一个单词(从当前位置删除一个词,并进入插入模式)

  • c$ —— 修改到行尾(从当前位置一直删除到行尾,并进入插入模式)

  • cc —— 修改整行(删除整行并进入插入模式)

复制操作符 y

  • yw —— 复制一个单词

  • yiw —— 复制光标下整个词,iw 是个文本对象,代表 “inner word”,它会精准选中光标下的整个单词,不论光标在词的首尾还是中间。

  • yy —— 复制整行

  • y$ —— 复制到行尾

粘贴操作符 p / P

  • p —— 粘贴到光标后(下方)

  • P —— 粘贴到光标前(上方)

撤销操作符 u

  • u —— 撤回上一步

搜索、替换与撤销

创建一个练习文件:

vim chapter4.txt

进入插入模式,输入以下文本:

The quick brown fox.
jumping jackrabbits jump joyfully.
This fox is very fast.
The fox and the dog are friends.
Foxes are everywhere.
A quick fox jumps over the quick fox.
The QUICK brown Fox.
quick quick QUICK QuIcK

搜索

在 Vim 里搜索不需要先按冒号,在普通模式直接按 /? 即可。

  • / —— 正向搜索(从光标位置向文件尾方向找)

  • ? —— 反向搜索(从光标位置向文件头方向找)

gg 回到文件开头。按 /,你会看到屏幕左下角出现一个 / 提示符。输入 fox,然后按 Enter 回车。光标立刻跳到第一个 fox 上。现在按 n —— 跳到下一个匹配项(next)。再按 n 几次,一直跳到文件末尾的 fox。现在按 N(大写,即 Shift+n)—— 跳回上一个匹配项。用 nN 在匹配项之间来回穿梭几趟。

?,输入 fox,回车。Vim 会从光标位置向上搜索。按 nN 的跳跃方向也会随之反转。

Vim 默认是区分大小写的。搜索 /fox 不会匹配到 Fox。如果你想忽略大小写搜索,可以临时加 \c,比如 /fox\c 会匹配 fox、Fox、FOX 等。\C 则强制区分大小写。

搜索完后,所有匹配的词可能都被高亮了。如果这些高亮干扰了阅读,可以暂时关掉:输入 :nohlsearch 或简写 :noh,回车。高亮就消失了。下次你再搜索时,高亮会自动恢复。

替换

Vim 的替换命令是经典的 :s 命令,格式为:

:[range]s/pattern/replacement/[flags]

替换当前行第一个匹配项

  1. 把光标移动到第二行 Jumping jackrabbits jump joyfully.

  2. 输入 :s/jump/leap/ 然后回车。

  3. 你会发现这行里第一个 jump 变成了 leap,但后面的 jump 没变。

替换当前行所有匹配项

  1. u 撤销上一步。

  2. 输入 :s/jump/leap/g 然后回车。

  3. 这次整行里所有的 jump 都变成了 leap。末尾的 g 是 global 的意思,代表整行范围。

指定行的替换

如果你想对第 3 行到第 6 行做替换:输入 :3,6s/fox/cat/g 回车。观察文件:只有第 3 行到第 6 行的 fox 变成了 cat,其他行不受影响。

全文件替换

输入 :%s/fox/cat/g 回车。% 代表整个文件,这条命令会把文件里所有的 fox 替换成 cat。做完后请按 u 撤销回来,我们还要练下面的。

确认式替换

批量替换有时很危险,你不想全自动改,而是想看一个、决定一个。加 c 确认标志即可。输入 :%s/fox/cat/gc 回车。光标会跳到第一个 fox,底部出现提示:

replace with cat (y/n/a/q/l/^E/^Y)?
  • y —— 改这一个

  • n —— 不改,跳到下一个

  • a —— 全改(all),放弃确认

  • q —— 不改了,直接退出替换

  • l —— 改完这一个就直接退出

撤销与重做

  • u —— 撤销(undo)

  • Ctrl + r —— 重做(redo)

Vim 的撤销不像普通编辑器那样“Ctrl+Z 再 Ctrl+Y 就没了”,它有一个撤销树,我们暂时只感受线性部分:

  1. 任意删除一行(dd)。

  2. 修改一个词(cw 输入新词后 Esc)。

  3. 粘贴一行(p)。

  4. 现在连续按 u 几次,观察文件一步步退回之前的状态。

  5. 再连续按 Ctrl + r,一步一步把撤销掉的操作重新“做”回来。

命令总结

操作

命令

说明

正向搜索

/关键词

n / N 跳下一个/上一个

反向搜索

?关键词

方向与 / 相反

关闭高亮

:noh

暂时关闭搜索结果高亮

当前行替换

:s/old/new/

只替换该行第一个匹配项

当前行全局替换

:s/old/new/g

替换该行所有匹配项

指定行范围替换

:3,6s/old/new/g

对第3到第6行进行全局替换

全文替换

:%s/old/new/g

替换整个文件

确认式替换

:%s/old/new/gc

每个匹配项都询问是否替换

撤销

u

撤销上一步操作

重做

Ctrl+r

重做被撤销的操作