要跳过开头扯淡,往下拉直到看到分隔线。
我先给在座的各位说一句话:
玩笑归玩笑。但是 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