mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-29 21:41:00 +08:00
135 lines
6.3 KiB
Markdown
135 lines
6.3 KiB
Markdown
|
如何在 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>来代表按下 RETURN 或者 ENTER 键,<SP> 代表按下空格键,CTRL-x 表示一起按下 Control 键和 x 键
|
|||
|
|
|||
|
使用 `map` 命令来进行按键的映射。第一个例子是 `write` 命令,通常你之前保存使用这样的命令:
|
|||
|
|
|||
|
```
|
|||
|
:w<RET>
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
虽然这里只有三个键,不过考虑到我用这个命令实在是太频繁了,我更想“一键”搞定它。在这里我选择逗号键,比如这样:
|
|||
|
```
|
|||
|
: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 设置:
|
|||
|
```
|
|||
|
Displays as
|
|||
|
|
|||
|
|
|||
|
|
|||
|
:map X :xCTRL-v<RET> :x^M
|
|||
|
|
|||
|
|
|||
|
|
|||
|
or
|
|||
|
|
|||
|
|
|||
|
|
|||
|
: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
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
将会显示,目前所有的缩写和键位映射。
|
|||
|
will show all the currently defined mappings and abbreviations.
|
|||
|
|
|||
|
希望上面的技巧能够更好地更高效地帮助你使用 vi。
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
via: https://opensource.com/article/18/5/shortcuts-vi-text-editor
|
|||
|
|
|||
|
作者:[Dan Sonnenschein][a]
|
|||
|
选题:[lujun9972](https://github.com/lujun9972)
|
|||
|
译者:[译者ID](https://github.com/sd886393)
|
|||
|
校对:[校对者ID](https://github.com/校对者ID)
|
|||
|
|
|||
|
本文由 [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/
|