要跳过开头扯淡,往下拉直到看到分隔线。
我先给在座的各位说一句话:

玩笑归玩笑。但是 VIM 的高起手是出了名的。因为最早的 vi 是基于远古编辑器 ed 的。有多远古呢?就是,当时 Unix 还是运行在大型机,大家都用热敏纸终端连接到大型机上进行操作。什么是热敏纸终端?就是,想象一个打小票的机器,但是里面装的是 A4 宽度的纸而且还带个键盘,这就是热敏纸终端。
所以没法从终端上读取字符——你甚至只能指定在第几列打字。ed 因而就没有所谓「可视化界面」,其一切编辑方式都是按照如下的交互式命令执行的( 为了便于区分,用户输入以 |< 开头,程序输出以 |> 开头,-- 后面是注释):
|< a -- 进入追加模式
|< ed 是标准的 Unix 编辑器
|< 这一行是第 2 行
|< . -- 这个点结束输入模式,进入命令模式
|< 2i -- 这里的 2 表示移动到第 2 行, i 表示进入插入模式
|< -- 空白行就是空白行,会插入到文件中
|< . -- 这个点结束输入模式,进入命令模式
|< ,l -- 这里的逗号表示选择所有行, l 表示打印行
|> ed 是标准的 Unix 编辑器$ -- 行尾会由 $ 表示
|> $
|> 这一行是第二行$ -- 我们之前插入了一个空行
|< w file -- 写入到 file 文件中
|> 39 -- 写入的字节数
|< q -- 退出
哦对了,热敏纸终端的打印速度很慢,所以程序的提示也是尽可能的简短。ed 的错误提示只有一种:?.
所以你知道你面对的是谁了。尽管 vim 已经改良了 vi, 而 vi 又改良了 ed, 但是它仍旧是脱不开这样晦涩的命令模式的——但是命令模式确实又很强大,所以并不能算是遗毒。
不过,反正还有 nano. 这个编辑器就比较新手友好了。所以如果你觉得自己可能无法掌握 vim, 你还可以换用 nano.
对了,emacs 不是编辑器,这是一个什么都很好但就是缺一个好用的编辑器的操作系统(手动滑稽)。
注意:本文中的按键格式遵循序言与排版约定中提及的按键格式一致。由于本文的特殊性,将不按照指导书中的顺序介绍 vim 所提供的功能。此处列出步骤所对应的编辑功能,善用 [@Ctrl][f][%Any].
- 启动
vim - 查找与替换
- 查找与替换
- 查找与替换
- 查找与替换
- 查找与替换
- 查找与替换
-
:g命令 - 调用外部指令
- 从异常中恢复
安装 vim
vim 可以直接用包管理器安装。如果你不知道什么是包管理器的话,见扩展 1.4.
启动 vim
要启动 vim, 使用此命令:
$ vim <文件名?>
如果给定文件不存在,则会在保存时创建文件;如果给定的文件存在,则会打开该文件。
退出 vim
要退出 vim, 按 [Esc], 然后 [:][q][!][Enter]。如果你觉得 [Esc] 太远够不着,你也可以用 [^[ ], 这两个在大多数情况下是一致的。
这会丢弃对文件作出的任何更改,并退出编辑器。
理解 vim 的输入模式
在继续往下进行前,需要了解 vim 的三个主要模式。
vim 在启动时会进入命令模式(又称普通模式、正常模式、师范模式(误),英文为 Normal Mode)。在命令模式下不能打字,所有按键都会被视作命令输入。命令输入一般不会显示在屏幕上,除非是在冒号命令模式下(即先按 [:] 再打字的命令)。下文中提到的命令均为在该模式下输入的内容。
通过按下 [a], [i] 或 [o] 即可进入输入模式 (Insert Mode)。此时的输入将会视作对文件的修改。要回到命令模式,按 [Esc].
通过按下 [v] 即可进入可视模式 (或称光标模式,英文为 Visual Mode)。此时光标将进入高亮选中模式,可以通过方向键移动光标来选择文字。之后的输入将会视作对被选文字的操作命令。要回到命令模式,按 [Esc] 或者 [v]。
导航和编辑
保存更改和丢弃更改
要保存更改,在命令模式下键入 :w[Enter]. 如果你在启动 vim 没有指定文件名,则使用 :w <文件名>[Enter] 保存到给定文件名。
要丢弃更改,在命令模式下键入 :q![Enter].
移动光标
在编辑模式下,你可以使用方向键来移动光标;在命令模式下,你不仅可以用方向键移动光标,你还可以用[h], [j], [k], [l] 移动光标,这四个键分别对应「左」、「下」、「右」和「上」。
使用字母移动光标的功能可以和其他编辑指令结合,来进行批量编辑操作。
移动到行
要快速移动到给定一行而不是疯狂地按方向键,使用命令 :<行号><Enter> 即可到指定行;或者使用 [G] 命令:直接输入行号,再按 [G] 。当 [G] 命令没有指定行号时,则直接移动到文件尾部。
使用 [$] 命令可以将光标快速移动到行尾, [0] 或者 [|] 命令可以将光标快速移动到行首。
要快速移动到文件头部(第一行最左侧),使用 [g][g] 命令。
光标处插入、光标处追加、新行插入、替换模式
虽然按下 [a], [i], [o], [R] (以及你随机按键试出来的其他奇怪的按键)都可以进入编辑模式,但是其行为是不一致的。这里我们介绍一些常用的进入编辑模式的方式及其行为。
-
[i]- 在光标处插入。abc|de在[i]后,打字内容将进入c和d之间 -
[a]- 在光标之后插入。abc|de在[a]后,打字内容将进入d和e之间 -
[o]- 插入到新行。无论光标在哪个位置,在[o]后,均将在光标之下插入一行空行,并将光标移动到空行 -
[R]- 替换模式。在此模式下,打字将不会插入存在的内容而是覆盖内容,如在abc|de在[R]后,打字内容将会覆盖de
删除内容
可以使用 [d] 指令来删除内容。[d] 指令接受一个范围作为要删除的内容,其形式如下:
d<要删除的范围>
其中要删除的范围可以是如下形式:
-
[d]- 当前行 -
<数字>[G]- 删除从光标行到给定行 -
<数字?>[w]- 删除光标后的给定个单词,不指定数字则为 1 个单词 -
[Enter]- 当前行和下一行 -
<数字?>[j]- 当前行和下n行,不指定数字则为 1 行 -
<数字?>[k]- 当前行和上n行,不指定数字则为 1 行
删除的内容将进入内部剪贴板。
撤销编辑和重做编辑
按 [u] 可以撤销上一次编辑,反复按 [u] 可以撤销更早的编辑,直到上一次保存。
按 [@Ctrl][r][%Any] 可以重做下一次编辑,[@Ctrl] 再反复按 [r] 可以重做更晚的编辑,直到最晚作出的更改。
复制粘帖
在可视模式中,可以使用 [y] 复制高亮的内容。或者可以直接使用 [y] 命令,其格式如下:
y<要复制的范围>
这里要复制的范围的格式与要删除的范围的格式是一样的(见上文),此处不再赘述。
按 [p] 可以将内部剪贴板的内容粘帖到光标处。
查找与替换
要查找一个字符串或正则表达式,使用 [/] 命令。按下 [/] 后输入的内容即为需要查找的内容;要查找下一处,则输入 [/][Enter]. [/] 命令的查找方向是光标下一行以及之后的内容(向后查找),要查找光标上一行以及之前的内容(向前查找),则使用 [?] 命令,用法与 [/] 命令相同。
要高亮文件中所有匹配的项目,则使用此指令 :set hlsearch. 要关闭高亮,则使用 :nohlsearch.
要进行替换,则使用 [:][s] 命令。这个命令的语法如下:
:<范围选择子>s/<需要被替换的内容>/<替换内容>/<替换选项>
默认的范围选择子为当前行;需要被替换的内容则为一个正则表达式;替换内容是直白的;常用的替换选项如下:
-
g- 整行替换,而不只是替换第一个匹配内容 -
c- 替换前确认 -
i- 忽略大小写,当且仅当在非正则模式下可用 -
d- 删除匹配行
常用的范围选择子如下:
-
%- 整个文件 -
<数字>,<数字>- 从左侧数字开始到右侧数字,单位为行 -
'<.'>- 此处的尖括号不是参数,而是实际的尖括号,表示在可视模式下高亮的内容
注意到在查找与替换中,正则表达式的判别是自动的。这就意味着有些字符的判定是特殊的,具体而言包括 .[]()?*/\. 当要使用这些字符时,需要使用 \ 转义。
查找与替换命令均支持正则表达式。要了解正则表达式,见扩展 2.1. 虽然正则表达式是在实验指导书中明确要求的,但限于篇幅写入了扩展章节。
但是由于 vim 的限制,这里需要补充一点:如果要使用正儿八经的正则表达式进行匹配,则必须用 \v 开头(即启用超级魔法模式)之后跟表达式才可以正常使用。
:g 命令
[:][g] 命令具有十分多的功能。这里的 g 取自 grep, 其命令形式如下:
:<范围选择子>g/<要匹配的内容>/<要进行的操作>
此处范围选择子同查找与替换中提到的范围选择子,要匹配的内容支持正则表达式,要进行的操作有以下常用操作:
-
d- 删除匹配的行 -
m<数字?>- 移动匹配的行,如果不指定则默认为移动到文件尾部 -
t<剪贴板名?>- 复制匹配的行,如果不制定则为默认剪贴板 -
s/<子匹配内容>/<替换内容>- 在匹配的行内执行此替换指令
要进行反选,将 [g] 改为 [v] 即可对不匹配的行进行操作。
调用外部指令
[:][!] 命令可以调用外部指而不离开编辑器,其形式如下:
:!<要执行的命令>
这个命令将会在用户 Shell 中执行,工作目录继承 vim 的工作目录。
要将外部命令的输出插入文件,则可以使用 [:][r][e][a][d] 命令,其形式如下:
:read !<要执行的命令>
从异常中恢复
默认情况下,vim 会进行实时备份。如果编辑器或系统崩溃,未保存的工作不会完全丢失。
要从备份中恢复,启动 vim 时使用 -r 参数即可。vim 在启动时也会自动检查是否有尚未保存的工作,并提示是否恢复。
键盘功能图和常用功能参考
下图所示即为在命令模式下对应的各按键的功能。

参考资料
[1] Wikipedia. Learing the vi editor [EB/OL]. https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes