七个高效的文本编辑习惯(以Vim为例)
如果你花很多时间输入纯文本、写程序或HTML,那么通过高效地使用一个好的编辑器,你可以节省大部分时间。本文将提供指导和提示,让你更迅速地做这些工作,并且少犯错误。
本文用开源文本编辑器Vim(Vi IMproved)来演示如何高效编辑,本文方法同样适用于其他的编辑器。选择合适的编辑器,实际上是进行高效编辑的第一步。我们避免去讨论哪个编辑器最适合你,因为这个话题将占用太多篇幅。如果你不知道选用哪个编辑器,或者你对目前使用的编辑器不满意,那就试试Vim;你将不会失望。
第1部分:编辑一个文件
1.快速移动
大部分时间都花在阅读、检查错误和寻找正确的位置去工作,而不是插入新的文本或修改它。在文本内导航非常频繁,因此你应该学会如何迅速做到这一点。
很多时候,当你希望搜索一些已存在的文本,或在所有行里寻找某个用到的单词或短语时,你可以简单地使用搜索命令、模式去找到它。但是也有更智能的方法:
- 如果你看到一个特定的单词,并想搜索它出现的其他地方,就使用命令*。它会从光标下面定位找到这个单词,并且搜索下一个。
- 如果设置了“incsearch”选项,当你还在输入时,Vim将会显示第一个匹配模式的文本。这能迅速显示一个模式错误。
- 如果设置了“hlsearch”选项,Vim将用黄色背景高亮显示所有匹配的模式,让你对搜索命令的结果有个快速概览。它可以显示一个变量在程序代码哪个位置被使用。你甚至不需要移动光标去看匹配的文本。
在结构化的文本中还有更多可能性快速移动。Vim有针对C(以及类似语言,如C++和Java)程序的特定命令:
- 使用%从一个左括号跳转到与其配对的右括号,或从一个“#if”到配对的“#endif”。实际上%可以跳转到许多不同的匹配项目。它对检查if()和{}的结构完整性非常有用。
- 使用 [{ 跳回当前代码块起始的“{”。
- 使用 gd 从变量的调用跳转到它的局部声明。
当然还有更多的,重点是你需要知道这些命令。你也许认为不可能了解所有这些命令——有几百种不同的移动命令,有些简单,有些非常灵活——需要花费几个星期的训练去学会它们。然而,你不需要这样做。相反,你需要知道自己具体的编辑方式,并且只学习那些能让你的编辑更高效的命令。
三个基本步骤:
- 当你正在编辑时,留意那些重复的和(或者)花费相当多时间的动作。
- 寻找一个能更快完成这个动作的编辑器命令。你可以阅读文档,询问朋友,或者看看别人是怎么做的。
- 练习使用这个命令,直到无需思考你的手指就能输入。
让我们用例子来说明这是如何工作的:
- 你会发现,当编辑C程序文件时,你经常花时间寻找一个函数被定义的地方。目前你使用 * 命令去搜寻该函数名字出现的其他位置,但是最终会遍历许多函数被使用的匹配,而不是被定义的。你会想到必须得有一个更快的方法。
- 查阅快速参考,你会找到关于跳转到标签的注释。文档说明如何使用它去跳转到一个你在查找的函数定义。
- 你试验一下使用包含Vim的ctags程序去生成一个标签文件。学会使用 CTRL-] 命令后,你会发现节省了大量的时间。更容易的办法是在你的Makefile里添加几行,从而自动生成标签文件。
使用这三个步骤时需要注意的一些事:
- “我想把工作做好,我没有时间去翻阅文档寻找一些新命令。”如果你这样想,你将会停留在计算石器时代。有些人什么事都使用Notepad,然后惊讶于其他人使用一半的时间完成了工作。
- 过犹不及。如果你总是试图找到完美的命令去做每件小事情,你将没有时间去思考实际上要去做的工作。只要挑选出那些超出必要时间的动作,练习相关命令直到你在使用它们时不需要去想。然后你就可以集中精力在文本上了。
以下章节会建议一些大多数人需要去处理的动作。你可以从中受到启发,在你的工作中使用这三个基本步骤。
2.不要输入两次
我们输入的是一组有限的单词,甚至是有限的短语和句子,特别是在计算机程序中。显然,你不想把同样的东西输入两次。
很多时候,你想修改一个单词。如果是在整个文件中,你可以使用:s(substitute)命令。如果只是几个地方需要修改,一种快速的方法是使用 * 命令去找到下一个出现的单词,使用cw命令修改它。然后输入n去找到下一个单词,输入英文逗点 . 去重复cw命令。
. 命令重复上次的修改。修改在这里就是插入、删除或者替换文本。能够重复是一个非常强大的机制。如果你基于它来安排你的编辑,许多修改将变得只是敲.键。留意其间的其他修改,因为它会替代你原来要重复的修改。相反,你可以用m命令先标记这个位置,继续重复你的修改,稍后再返回到这个位置。
一些函数和变量名可以被笨拙的输入。你能快速输入“XpmCreatePixmapFromData”,不带一个错字,并且不用查询它么?Vim有一个完整的机制使它更容易。它在你正在编辑的文件里查询单词,这也包括#include文件。你可以输入“XpmCr”,然后按下CTRL-N,Vim会把它扩展为“XpmCreatePixmapFromData”。这不仅节省了输入时间,更能避免错字,并且避免稍后编译器报错时去修复它。
当你多次输入一个短语或句子时,这有一个更快捷的办法。Vim有一个录制宏的机制。你输入qa启动录制到寄存器“a”。然后像往常一样,你输入命令,最后再次按下q以终止录制。当你需要重复所录制的命令时,输入@a。一共有26个寄存器可用。
录制功能可以重复许多不同的动作,不只是插入文本。当你要重复一些东西时,记住这一点。
有一点需要注意,录制的命令将会完全按照你输入的回放。你必须知道移动的文本可能跟所重复的命令不同。左移四个字符也许适合你正在录制的文本,但是在你重复命令的地方可能需要五个字符。这往往需要使用命令移到文本对象(词,句子)或者移到一个特定的字符。
当你需要重复的命令越复杂,一次正确输入它们就越困难。不要去录制它们,相反,你应该写一个脚本或宏。这对制作你的部分代码的模板非常有用。例如,一个函数头。你可以把它做得如你所愿的灵活。
3. 错误要修正
输入时候出错很正常,没有人能够避免。关键是要迅速发现并纠正它们。编辑器应该能帮助你,但你得告诉它什么是错误的、什么是正确的。
往往你会一遍又一遍地犯同样的错误。你的手指输入的并不是你打算要做的。这可以被缩写纠正。举几个例子:
:abbr Lunix Linux
:abbr accross across
:abbr hte the
在你输入这些单词后,它们会被自动纠正。
使用相同的机制,你可以只输入几个字符来得到一个长单词。这对于那些很难输入的单词很有用,避免了输入错误。示例:
:abbr pn penguin
:abbr MS Mandrake Software
然而,当你不想扩展到完整的单词时,会觉得很困难在文本里插入“MS”。最好去使用没有字面意思的短的单词。
Vim有一个灵活的高亮显示机制在你的文本里发现错误。这实际上被用作程序的语法高亮显示,但他也可以捕获并高亮显示错误。
语法高亮用色彩显示注释。这听起来并不像一个重要的功能,然而一旦开始用它,你会发现它有很大帮助。你能够迅速发现本应该是注释却没有被高亮显示的文本(可能使你忘记了注释标记)。或者看到以行代码被高亮显示成注释(你忘记去插入一个“*/”)。这些错误很难在B&W文件里发现,并有可能浪费大量时间去调试代码。
语法高亮还可以捕获不匹配的括号。不匹配的“)”会以鲜红的高亮背景显示。你可以使用%命令去查看它们如何匹配,并在合适的位置插入一个“(”或“)”。
其他常见的错误也能被迅速发现,例如使用“#included <stdio.h>”而不是“#include <stdio.h>”,这在B&W文件里会被轻易错过的错误。但是你会很快发现“include”是高亮显示的,而“included”不会。
一个更复杂的例子:使用一个针对英语文本的、包含所有单词的长列表。不在此列内的任何单词可能是一个错字。你可以使用语法文件高亮显示所有没有包含在这个列表内的单词。你可以使用一些额外的宏来添加单词到词库,从而让它们不再被标记为错误。这就像你所期待的字处理器一样。它在Vim里用脚本实现,你可以进一步根据需要调整。例如,只去检查程序里注释的拼写错误。
第2部分:编辑多个文件
4.只有一个文件的情况很少
人们不只是工作在一个文件上,大多数情况会有许多相关文件,你一个接一个编辑它们,或者几个同时编辑。你应该能充分利用你的编辑器,使编辑几个文件更高效率。
之前提到的标签机制也适用于文件之间移动。通常的做法是为整个正在工作的项目生成一个标签文件。然后,你可以在项目里所有文件间寻找函数、机构、类型等的定义。相比较手动搜索,这节省的时间非常可观。创造一个标签文件是我浏览程序时要做的第一件事。
另一个强大的机制是在一组文件里使用:grep命令找到一个名字出现的所有位置。Vim建立一个所有匹配的列表,并跳转到第一个匹配。:cn命令带你依次到下一个匹配。如果你需要改变一个函数调用的参数数目,这会非常有用。
Include文件包含有用的信息,但是找到一个包含你需要看到的声明很花时间。Vim知道include文件并可以在它们中搜索你要找的单词。最常见的动作是查找一个函数的原型。把光标放在你的文件里的函数名上,输入[I:,Vim将显示一个包含所有在include文件里匹配该函数名的列表。如果需要看到更多上下文,你可以直接跳转到声明。一个类似的命令可用来检查你是否包含了正确的头文件。
Vim中,你可以把文本区分成几个区域编辑不同的文件。然后,你可以在两个或多个文件中比较内容,复制(粘贴)文本。有很多命令打开和关闭窗口,在它们之间跳转,临时隐藏文件等等。同样,你需要应用三个基本步骤来选择你打算学会使用的命令集。
多窗口有更多用途。预览标签机制是一个很好的例子,它会打开一个特殊的预览窗口,同时保持光标在你正在工作的文件中。在预览窗口中会显示文本,例如光标下的函数名所对应的函数声明。如果移动光标到另一个名字并停留一秒钟,预览窗口将会显示那个名字的定义。这也可以是一个在项目include文件里声明的结构或者函数的名字。
5.让我们共同努力
编辑器用于编辑文本,电子邮件程序发送和接收消息,操作系统运行程序。每个程序有它自己的任务,并擅长于它。这种力量源自程序协同工作。
一个简单的例子:你需要些一个不超过500字的总结。选择当前段落写入“wc”程序:vip:w!wc –w。外部命令“wc -w”用作计算单词数目。很简单,不是吗?
总会有一些你需要的功能没有包含在编辑器里。你可以从外部添加功能,使编辑器能使用另一个程序过滤文本。一直以来,Unix的精髓就是用不同的程序做好它们自己的工作,并协作执行一个更大的任务。不幸的是,大部分编辑器不能很好地同其它程序一起工作——例如,你不能用另一个编辑器去替换Netscape里的电子邮件编辑器。你会终止使用残缺的编辑器。另一个趋势是在编辑器里包含所有功能,Emacs是一个很好的例子来终止(有人称之为一个可被用来编辑文本的操作系统。)
Vim试图与其它程序集成,但这仍然是一个挑战。目前,它可被用作MS-Developer Studio和Sniff的编辑器。一些像Mutt的电子邮件程序支持外部编辑器,可以使用Vim。与Sun工作站的集成在进行中。总之,在不久的将来这是一个必须加强的领域。只有这样我们才能得到一个优于各部分简单相加的系统。
6.文本结构
你会经常遇到具有某种结构的文本,但是和现有命令所支持的不同。然后,你将不得不退回到编辑器的“积木”,创造你自己的宏和插件来处理这个文本。我们在这里接触更复杂的东西。
更简单的事情之一是加快编辑-编译-修复周期。Vim有:make命令,开始编译,捕捉它产生的错误,并让你跳转到错误位置来修复问题。如果你使用不同的编辑器,错误信息将无法识别。你应该调整“错误格式”选项,而不是重回到老的“把它写下”系统。这告诉Vim你的错误是什么样子,以及如何获取文件名和行号。它适用于复杂的gcc错误消息,因此你应该能使其与几乎任何编辑器工作。
有时调整到一种文件只是设置一些选项或写一些宏。例如,为了在手册页面跳转,你可以写一个宏去获取光标下的单词,清理缓冲区,然后从手册页面把那个单词读到缓冲区。这是一个简单高效的方式来查询交叉引用。
使用者2三个基本步骤,你可以更高效地处理任何结构形式的文件。试想下你想要对文件做的动作,找到可以做它的命令,并开始使用它们。正如你听到的,这真的很简单。你只需要去做它。
第3部分:磨刀不误砍柴工
7.形成习惯
学开车需要努力。那是你保持骑自行车的理由么?不,你认识到需要投入时间去学习一门技能。文本编辑不一样。你需要学习新命令,并把它们变成一种习惯。
另一方面,你不应该试图学习编辑器提供的所有命令。那将是彻底的浪费时间。大部分人只需为他们的工作学习10%到20%的命令。但对每个人来说这套命令是不同的。它需要你不时回过头来思考是否有一些重复性任务可以被自动化。如果你做的任务,只有一次,并不期望去再做一次,那就不要试图去优化它。但是你可能意识到你已经花了一个小时重复好几次做某事,那就在文档里搜索一个可以更快做它的命令。或者写一个宏来做到这一点。当它是一个更大的任务,例如选出一种特别的文本,你可以浏览下新闻组或互联网,看看是不是有人已经为你解决了这个问题。
必不可少的基本步骤是最后一条。你能想到一个重复性的任务,找到一个好的解决方案,过了周末忘记你是怎么做的。这不起作用。你必须重复它知道你的手指可以自动去这样做。只有这样你才能达到你需要的效率。一次不要学太多,同时做一些就好。把你不经常使用的技巧记录在表格里,以备日后查用。无论如何,如果你坚持目标,你会发现让你编辑越来越高效地办法。
最后一句提醒,当人们忽略上述所提会发生什么:我仍然看到人们在电脑屏幕(VDU)后花了半天时间,抬头看着屏幕,然后低头看两个手指输入,再抬头看着屏幕,等等。——然后他们奇怪为什么如此累……用十指输入!这不只是速度更快,也能减少无聊。每天使用一个小时计算机程序,只需要几个星期就能学会按指法输入。
结语
标题的想法来自斯蒂芬-科维所著的成功书籍《高效能人士的七个习惯》。我向需要解决个人和职业问题人们(谁没有?)推荐这本书。虽然有些人会宣称它来自斯科特-亚当斯所著的《迪尔伯特——高度有缺陷人士的7年》(同样推荐)。
布莱姆·米勒写于 2000年11月
关于作者
布莱姆·米勒(Bram Moolenaar)是Vim的主要作者。他写了Vim功能核心,并且选择包含其他人提交的代码。他以电脑技师的身份毕业于代尔夫特技术大学。现在,它主要从事软件工作,但仍然懂得如何使用烙铁。他是ICCF(荷兰)的创始人和财务主管,帮助乌干达的孤儿。他是一名从事系统架构师工作的自由职业者,但是实际上花费大部分时间在开发Vim上。