天天看点

【转】vi 技巧和诀窍:令人刮目相看的 10 个超酷命令

文章转自:http://www.ibm.com/developerworks/cn/aix/library/au-vitips.html

成为 vi 编辑专家

简介: 通过 vi 技巧和诀窍提高文件编辑效率,让您的朋友刮目相看。本文介绍 10 个不太为人所知的 vi 命令,所有真正的 vi 用户都应该掌握它们。

发布日期: 2010 年 10 月 18 日 

级别: 中级 

在使用 vi 编辑器时 — 无论是初次使用的用户,还是有经验的用户 — 大多数人往往只掌握核心命令集,这些命令可以执行最常用的功能:导航或保存文件;插入、更新、删除或搜索数据;退出但不保存修改。

但是,vi 编辑器极其强大,特性和功能非常丰富。即使在多年使用 vi 之后,您仍然可能会发现有不知道的新命令。本文讨论的命令就属于不太为人所知的命令,但是它们可以简化您目前采用的操作方法,让您的工作方式更高效,或者让您能够完成原来不知道可以用 vi 完成的操作。

vi 编辑器的许多选项可以控制编辑会话的外观和感觉。使用 <code>:set</code> 命令修改 vi 中的会话设置。按 Escape 键进入命令模式之后,可以使用 <code>:set all</code> 命令显示选项和设置的列表。

可以使用 <code>:set nonumber</code> 命令关闭行号。还可以使用这个命令和 <code>:set number</code> 命令的简写,即 <code>:set nu</code> 和 <code>:set nonu</code>。

如果需要快速计算要用 vi 函数处理的行数,显示行号会非常有帮助。当行数很多,可能跨多个屏幕时,行号尤其有用。另外,有时候您知道要处理的行范围,但是需要查明要在 vi 命令中使用的初始和结束行号。

如果希望每次进入 vi 会话时都显示行号,那么在主目录中的 .exrc 文件中添加 <code>set number</code> 行。

<a href="http://www.ibm.com/developerworks/cn/aix/library/au-vitips.html#ibm-pcon">回页首</a>

可以使用 <code>:set noautoindent</code> 命令关闭自动缩进。还可以使用这个命令和 <code>autoindent</code> 命令的简写,即 <code>:set ai</code> 和 <code>:set noai</code>。还可以使用 <code>:set ai sw=4</code> 在一个命令中打开缩进并设置缩进级别。

如果希望每次启动 vi 会话时都启用自动缩进并把缩进级别设置为四个空格,那么在主目录中的 .exrc 文件中添加 <code>set ai sw=4</code> 行。

如您所知,在 UNIX® 中执行搜索时,模式匹配是区分大小写的。但是,如果希望 vi 不区分大小写,那么可以使用 <code>:set ignorecase</code>命令。使用 <code>:set noignorecase</code> 恢复区分大小写。还可以使用简写(<code>:set ic</code> 和 <code>:set noic</code>)。

如果希望每次进入 vi 会话时都启用不区分大小写的搜索,那么在主目录中的 .exrc 文件中添加 <code>set ignorecase</code> 行。

复合搜索对于寻找代码中出现在另一个命令后面的某个命令尤其有用 — 例如,在设置某个变量之后调用函数的地方。

当在文件中搜索要替换的模式时,可以让 vi 把要匹配的任何模式保存在缓冲区中;然后,在执行替换时,可以用缓冲区引用号重放它们。方法是把模式放在 <code>\(</code> 和 <code>\)</code> 之间,这会指示 vi 把模式放在编号的缓冲区(1 到 9)中。在执行替换时,可以用缓冲区引用号 <code>\1</code> 到<code>\9</code> 引用这些缓冲区。

下面把这个命令分解开解释一下:

<code>:%s</code> — 指示 vi 执行替换。

<code>/</code> — 模式分隔符。

<code>^\(Martin\)</code> — 寻找以字符串 <code>Martin</code> 开头的行并把这个字符串保存在缓冲区 1 中。

<code>Mr \1 Wicks</code> — 把找到的字符串替换为字符串 <code>Mr</code>,加上缓冲区 1 中的内容,再加上字符串 <code>Wicks</code>。

<code>g</code> — 全局修改(即修改所有匹配的地方)。

在搜索和替换字符串中都可以使用缓冲区引用。

可以让 vi 在文件中的特定位置放上书签。方法是按 Escape 键,再按 M 键,然后输入另一个表示书签引用的字母表字符。因此,最多可以有 26 个书签,分别名为 a 到 z。要返回到上一书签,按 Escape 键,再按反撇号(<code>`</code>),然后输入书签引用字符。

例如,按 Escape 之后按 M 和 A 键,就会把当前游标位置保存在书签 a 中。在编辑会话中,以后希望返回到这个游标位置时,只需按 Escape,然后输入 <code>`A</code>。可以使用双反撇号(<code>``</code>)命令在当前书签和前一个书签之间切换。

在 vi 编辑器中,最有用的搜索/替换特性之一是查找与某个模式匹配的字符串,更新它,然后继续搜索下一个匹配的字符串,然后选择是否以相同方式更新它。这与 Microsoft® Word 中的查找下一个/替换功能很相似。

您可能已经知道可以在 vi 中搜索字符串模式,方法是进入命令模式,输入 <code>/search_pattern</code>(其中的 search_pattern 是字符串或正则表达式),然后按回车。这样做就会找到与指定的模式匹配的第一个字符串。在此之后,可以在找到的文本上执行任何操作。例如,按 Escape,再按 C 和 W 键,再输入更多文本,就会把找到的字符串替换为另一个单词。

要想快速地找到与模式匹配的下一个地方,应该按 Escape,然后按 N 键。在找到下一个匹配时,可以使用点号键(<code>.</code>)在这个位置重复最近的文本操作,比如前一个示例中使用的修改单词(<code>cw</code>)操作。然后,可以使用这些键继续寻找其他匹配(<code>n</code>)并选择重复文本操作(<code>.</code>),操作方式与使用 Word 中的查找下一个/替换功能很相似。

在 vi 中,可以切换游标下的字母字符的大小写,方法是按 Escape,然后按波浪号键(<code>~</code>)。这会在小写和大写之间来回切换。按着这个键,移动游标经过行中的每个字符,就会切换遇到的每个字母字符的大小写。可以在波浪号前面输入一个数字,表示希望改变多少个字母字符的大小写。

您可能知道,在 vi 中按 Escape,输入 <code>:!command</code>(其中的 command 是要执行的 UNIX 命令),然后按回车,就可以在 shell 中执行命令。例如,<code>:!pwd</code> 显示编辑会话当前的工作目录。

另外,还可以在 shell 命令前面加上从当前游标位置开始希望操作的行数。方法是按 Escape,然后输入指定行数的数字,然后输入两个惊叹号(<code>!!</code>),最后输入 UNIX 命令。

可以使用管道分隔符(<code>|</code>)把 UNIX 命令连接在一起,从而在 vi 会话中执行复杂强大的筛选。例如,假设要把当前 vi 会话的编辑缓冲区中的文件内容替换为每行的第一个空格分隔的字段,按升序排序并转换为大写,那么在按 Escape 之后输入:

vi 编辑器是一个极其强大的工具,本文提供了一些技巧和诀窍,希望能够帮助您更高效地编辑文件。请记住,vi 还有更多不太为人所知的特性。祝工作愉快!

学习

继续阅读