实验 2 VIM 编辑器的使用

要跳过开头扯淡,往下拉直到看到分隔线。

我先给在座的各位说一句话:

你们这是自寻死路!

玩笑归玩笑。但是 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].

  1. 启动 vim
  2. 查找与替换
  3. 查找与替换
  4. 查找与替换
  5. 查找与替换
  6. 查找与替换
  7. 查找与替换
  8. :g 命令
  9. 调用外部指令
  10. 从异常中恢复

安装 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] 移动光标,这四个键分别对应「左」、「下」、「右」和「上」。

使用字母移动光标的功能可以和其他编辑指令结合,来进行批量编辑操作。

移动到行

要快速移动到给定一行而不是疯狂地按方向键,使用命令 :<行号> 即可到指定行;或者使用 [G] 命令:直接输入行号,再按 [G] 。当 [G] 命令没有指定行号时,则直接移动到文件尾部。

使用 [$] 命令可以将光标快速移动到行尾, [0] 或者 [|] 命令可以将光标快速移动到行首。

要快速移动到文件头部(第一行最左侧),使用 [g][g] 命令。

光标处插入、光标处追加、新行插入、替换模式

虽然按下 [a], [i], [o], [R] (以及你随机按键试出来的其他奇怪的按键)都可以进入编辑模式,但是其行为是不一致的。这里我们介绍一些常用的进入编辑模式的方式及其行为。

  • [i] - 在光标处插入。abc|de[i] 后,打字内容将进入 cd 之间
  • [a] - 在光标之后插入。abc|de[a] 后,打字内容将进入 de 之间
  • [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 在启动时也会自动检查是否有尚未保存的工作,并提示是否恢复。

键盘功能图和常用功能参考

下图所示即为在命令模式下对应的各按键的功能。

vim.png

常用功能参考

参考资料

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

你可能感兴趣的:(实验 2 VIM 编辑器的使用)