如何在 vi 中创建快捷键
======

> 那些常见编辑任务的快捷键可以使 Vi 编辑器更容易使用，更有效率。

![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/documentation-type-keys-yearbook.png?itok=Q-ELM2rn)

学习使用 [vi 文本编辑器][1] 确实得花点功夫，不过 vi 的老手们都知道，经过一小会儿的锻炼，就可以将基本的 vi 操作融汇贯通。我们都知道“肌肉记忆”，那么学习 vi 的过程可以称之为“手指记忆”。

当你抓住了基础的操作窍门之后，你就可以定制化地配置 vi 的快捷键，从而让其处理的功能更为强大、流畅。我希望下面描述的技术可以加速您的协作、编程和数据操作。

在开始之前，我想先感谢下 Chris Hermansen（是他雇佣我写了这篇文章）仔细地检查了我的另一篇关于使用 vi 增强版本 [Vim][2] 的文章。当然还有他那些我未采纳的建议。

首先，我们来说明下面几个惯例设定。我会使用符号 `<RET>` 来代表按下回车，`<SP>` 代表按下空格键，`CTRL-x` 表示一起按下 `Control` 键和 `x` 键（`x` 可以是需要的某个键）。

使用 `map` 命令来进行按键的映射。第一个例子是 `write` 命令，通常你之前保存使用这样的命令：

```
:w<RET>
```

虽然这里只有三个键，不过考虑到我用这个命令实在是太频繁了，我更想“一键”搞定它。在这里我选择逗号键，它不是标准的 vi 命令集的一部分。这样设置：

```
:map , :wCTRL-v<RET>
```

这里的 `CTRL-v` 事实上是对 `<RET>` 做了转义的操作，如果不加这个的话，默认 `<RET>` 会作为这条映射指令的结束信号，而非映射中的一个操作。  `CTRL-v` 后面所跟的操作会翻译为用户的实际操作，而非该按键平常的操作。

在上面的映射中，右边的部分会在屏幕中显示为 `:w^M`，其中 `^` 字符就是指代 `control`，完整的意思就是 `CTRL-m`，表示就是系统中一行的结尾。

目前来说，就很不错了。如果我编辑、创建了十二次文件，这个键位映射就可以省掉了 2*12 次按键。不过这里没有计算你建立这个键位映射所花费的 11 次按键（计算 `CTRL-v` 和 `:` 均为一次按键）。虽然这样已经省了很多次，但是每次打开 vi 都要重新建立这个映射也会觉得非常麻烦。

幸运的是，这里可以将这些键位映射放到 vi 的启动配置文件中，让其在每次启动的时候自动读取：文件为 `.exrc`，对于 vim 是 `.vimrc`。只需要将这些文件放在你的用户根目录中即可，并在文件中每行写入一个键位映射，之后就会在每次启动 vi 生效直到你删除对应的配置。

在继续说明 `map` 其他用法以及其他的缩写机制之前，这里在列举几个我常用提高文本处理效率的 map 设置：

| 映射  | 显示为 |
|------|-------|
| `:map X :xCTRL-v<RET>` | `:x^M` |
| `:map X ,:qCTRL-v<RET>` | `,:q^M` |

上面的 `map` 指令的意思是写入并关闭当前的编辑文件。其中 `:x` 是 vi 原本的命令，而下面的版本说明之前的 `map` 配置可以继续用作第二个 `map` 键位映射。

| 映射  | 显示为 |
|------|-------|
| `:map v :e<SP>` | `:e` |

上面的指令意思是在 vi 编辑器内部切换文件，使用这个时候，只需要按 `v` 并跟着输入文件名，之后按 `<RET>` 键。

| 映射  | 显示为 |
|------|-------|
| `:map CTRL-vCTRL-e :e<SP>#CTRL-v<RET>` | `:e #^M` |

`#` 在这里是 vi 中标准的符号，意思是最后使用的文件名。所以切换当前与上一个文件的方法就使用上面的映射。

| 映射  | 显示为 |
|------|-------|
| `map CTRL-vCTRL-r :!spell %>err &CTRL-v<RET>` | `:!spell %>err&^M` |

（注意：在两个例子中出现的第一个 `CRTL-v` 在某些 vi 的版本中是不需要的）其中，`:!` 用来运行一个外部的（非 vi 内部的）命令。在这个拼写检查的例子中，`%` 是 vi 中的符号用来指代目前的文件， `>` 用来重定向拼写检查中的输出到 `err` 文件中，之后跟上 `&` 说明该命令是一个后台运行的任务，这样可以保证在拼写检查的同时还可以进行编辑文件的工作。这里我可以键入 `verr<RET>`（使用我之前定义的快捷键 `v` 跟上 `err`），进入 `spell` 输出结果的文件，之后再输入 `CTRL-e` 来回到刚才编辑的文件中。这样我就可以在拼写检查之后，使用 `CTRL-r` 来查看检查的错误，再通过 `CTRL-e` 返回刚才编辑的文件。

还用很多字符串输入的缩写，也使用了各种 `map` 命令，比如：

```
:map! CTRL-o \fI
:map! CTRL-k \fP
```

这个映射允许你使用 `CTRL-o` 作为 `groff` 命令的缩写，从而让让接下来书写的单词有斜体的效果，并使用 `CTRL-k` 进行恢复。

还有两个类似的映射：

```
:map! rh rhinoceros
:map! hi hippopotamus
```

上面的也可以使用 `ab` 命令来替换，就像下面这样（如果想这么用的话，需要首先按顺序运行： 1、 `unmap! rh`，2、`umap! hi`）：

```
:ab rh rhinoceros
:ab hi hippopotamus
```

在上面 `map!` 的命令中，缩写会马上的展开成原有的单词，而在 `ab` 命令中，单词展开的操作会在输入了空格和标点之后才展开（不过在 Vim 和我的 vi 中，展开的形式与 `map!` 类似）。

想要取消刚才设定的按键映射，可以对应的输入 `:unmap`、 `unmap!` 或 `:unab`。

在我使用的 vi 版本中，比较好用的候选映射按键包括 `g`、`K`、`q`、 `v`、 `V`、 `Z`，控制字符包括：`CTRL-a`、`CTRL-c`、 `CTRL-k`、`CTRL-n`、`CTRL-p`、`CTRL-x`；还有一些其他的字符如 `#`、 `*`，当然你也可以使用那些已经在 vi 中有过定义但不经常使用的字符，比如本文选择 `X` 和 `I`，其中 `X` 表示删除左边的字符，并立刻左移当前字符。

最后，下面的命令

```
:map<RET>
:map!<RET>
:ab
```

将会显示，目前所有的缩写和键位映射。

希望上面的技巧能够更好地更高效地帮助你使用 vi。

--------------------------------------------------------------------------------

via: https://opensource.com/article/18/5/shortcuts-vi-text-editor

作者：[Dan Sonnenschein][a]  选题：[lujun9972](https://github.com/lujun9972)  译者：[sd886393](https://github.com/sd886393)  校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

[a]:https://opensource.com/users/dannyman
[1]:http://ex-vi.sourceforge.net/
[2]:https://www.vim.org/
