如何在 vi 中创建快捷方式

这些用于常见编辑任务的快捷方式使使用 vi 文本编辑器更加容易和高效。
229 位读者喜欢这篇文章。
5 trends in open source documentation

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

学习 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! rhumap! hi

:ab rh rhinoceros
:ab hi hippopotamus

在上面的 map! 方法中,缩写在键入时(在 Vim 中)立即扩展为定义的单词,而在 ab 方法中,扩展发生在缩写后跟空格或标点符号时(在 Vim 和我的 vi 版本中,map! 方法的扩展也以这种方式工作)。

要在 vi 会话中反转任何 mapmap!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,并使其更易于使用和更高效。

User profile image.
Dan 自 1980 年代初以来一直在使用各种类型的 Unix 系统。他是《vi 指南:UNIX 系统上的可视化编辑》(Prentice-Hall,1987 年)的作者。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.