学习 vi 文本编辑器需要付出一些努力,但经验丰富的 vi 用户知道,一段时间后,使用基本命令会成为第二天性。这是一种所谓的肌肉记忆,在这种情况下,很可能被称为手指记忆。
在掌握了主要方法和基本命令之后,您可以通过使用其自定义选项创建快捷方式,使 vi 编辑更加强大和高效。我希望下面描述的技术将有助于您的写作、编程和数据处理。
在继续之前,我想感谢 Chris Hermansen(他邀请我撰写这篇文章)使用 Vim 检查了我的草稿,因为我使用另一个版本的 vi。我也感谢 Chris 的有益建议,我在此处进行了采纳。
首先,让我们回顾一些约定。我将使用 <RET> 来表示按下 RETURN 或 ENTER 键,<SP> 表示空格键。CTRL-x 表示同时按下 Control 键和 x 键(无论 x 是什么键)。
使用 map
命令设置您自己的命令缩写。我的第一个示例涉及 write
命令,该命令用于保存您正在处理的文件的当前状态
:w<RET>
这只有三个按键,但由于我经常这样做,我宁愿只用一个。我为此目的选择的键是逗号,它不是标准 vi 命令集的一部分。设置此命令的命令是
:map , :wCTRL-v<RET>
CTRL-v 是必不可少的,因为没有它,<RET> 将表示映射的结束,而我们希望将 <RET> 作为映射逗号的一部分包含在内。通常,CTRL-v 用于输入后续的按键(或控制字符),而不是按字面意思解释。
在上面的映射中,右侧部分将在屏幕上显示为 :w^M
。插入符号 (^
) 表示控制字符,在本例中为 CTRL-m,它是系统的 <RET> 形式。
到目前为止还不错——有点。如果我在创建和/或编辑当前文件时写入大约十几次,此映射可能会节省 2 x 12 个按键。但这并没有考虑到设置映射所需的按键,在上面的示例中是 11 个(将 CTRL-v 和 shift 字符 :
各计为一个按键)。即使有净节省,每次启动 vi 会话时设置映射也会很麻烦。
幸运的是,有一种方法可以将映射和其他缩写放在启动文件中,vi 每次调用时都会读取该文件:.exrc
文件, 或者在 Vim 中,.vimrc
文件。只需在您的主目录中创建此文件,其中包含映射列表,每行一个——不带冒号——缩写将为所有后续 vi 会话定义,直到您删除或更改它。
在继续讨论 map
命令的变体和另一种缩写方法之前,这里有更多我发现对简化文本编辑有用的映射示例
Displays as
:map X :xCTRL-v<RET> :x^M
or
:map X ,:qCTRL-v<RET> ,:q^M
上面的等效映射写入并退出文件。:x
是用于此操作的标准 vi 命令,第二个版本说明了先前定义的映射可以在后续映射中使用。
: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
(注意:在某些版本的 vi 中,上面两个示例中的第一个 CTRL-v 不是必需的。):!
是一种运行外部(非 vi)命令的方法。在本例中 (spell
),%
是表示当前文件的 vi 符号,>
将拼写检查的输出重定向到名为 err
的文件,&
表示在后台运行它,这样我就可以在 spell
完成其任务时继续编辑。然后我可以键入 verr<RET>
(使用我之前的快捷方式 v
,后跟 err
)转到由 spell
命令标记的潜在错误文件,然后使用 CTRL-e 返回到我正在处理的文件。第一次运行拼写检查后,我可以重复使用 CTRL-r 并仅使用 CTRL-e 返回到 err
文件。
map
命令的变体可用于在输入时缩写文本字符串。例如,
:map! CTRL-o \fI
:map! CTRL-k \fP
这将允许您使用 CTRL-o 作为快捷方式来输入 groff
命令以将后面的单词设置为斜体,这将允许您使用 CTRL-k 来使 groff
命令恢复为之前的字体。
这里是此技术的另外两个示例
:map! rh rhinoceros
:map! hi hippopotamus
上面的操作也可以使用 ab
命令完成,如下所示(如果您按顺序尝试这些操作,请先使用 unmap! rh
和 umap! hi
)
:ab rh rhinoceros
:ab hi hippopotamus
在上面的 map!
方法中,缩写在键入时(在 Vim 中)立即扩展为定义的单词,而在 ab
方法中,扩展发生在缩写后跟空格或标点符号时(在 Vim 和我的 vi 版本中,map!
方法的扩展也以这种方式工作)。
要在 vi 会话中反转任何 map
、map!
或 ab
,请使用 :unmap
、:unmap!
或 :unab
。
在我的 vi 版本中,适合映射的未定义字母包括 g、K、q、v、V 和 Z;未定义的控制字符是 CTRL-a、CTRL-c、CTRL-k、CTRL-n、CTRL-o、CTRL-p 和 CTRL-x;其他一些未定义的字符是 # 和 *。您还可以重新定义在 vi 中有意义但您认为晦涩且几乎无用的字符;例如,我在本文的两个示例中选择的 X 是一个内置的 vi 命令,用于删除当前字符左侧的字符(可以通过双键命令 hx 轻松完成)。
最后,命令
:map<RET>
:map!<RET>
:ab
将显示所有当前定义的映射和缩写。
我希望所有这些技巧都能帮助您自定义 vi,并使其更易于使用和更高效。
评论已关闭。