“工欲善其事,必先利其器”。用Emacs三年,略知其中滋味,希望与更多的程序员分享,也算为开源社区做点贡献吧。
学了Emacs才知道,输入(以及修改)程序也是有很多学问的。记得当初关于“软件蓝领”的争论焦点就是写程序是体力活还是脑力活,是否仅仅等于敲敲键盘。虽然到头来双方仍是自说自话,但似乎都同意“敲键盘是体力活”。大家对编辑器的期望无非也就是语法高亮、自动缩进,如果能有自动补全那就谢天谢地了。我周围的同事用的编辑器各种各样,有SourceInsight、SlickEdit、UltraEdit……,但用得最多的还是vi,甚至连新来的实习生都用vi,这让我很吃惊,我上学那会儿可都是用IDE的啊。即使这样,还是有很多同事对UltraEdit的列插入功能津津乐道,由此可见,很多编辑器对于编辑这个老本行做得还不够。大家使用SourceInsight和SlickEdit,也是用其代码浏览和定位功能,而其编辑功能并无出彩之处。
编辑是程序开发领域唯一的体力活吗?体力活意味着机械、单调、令人厌烦。我们选择干程序员这行,不就是想多动脑少动手吗?如果你把编辑当成体力活,那么肯定你的手指经常游走在方向键、Home、End、PageUp、PageDown、Delete和Backspace之间,偶尔(也许是很多时候)不得不借助鼠标,即使你也知道用鼠标对手腕的伤害要远远大于键盘。也许你觉得这没什么不好,难道不是每个程序员都这样吗?答案是:不是。Emacs用户将这种行为比喻为Cache Miss,可见其对效率的伤害程度。几乎每个人都会同意,输入速度取决于盲打的熟练程度,看键盘是非常忌讳的。然而,有多少人可以不看键盘就能找对上面提到的几个键呢?即使找对,恐怕手已移开半尺(鼠标就更远了),让食指回到”J”键上也不那么容易吧。当我们尚不清楚接下来该写什么的时候,这并不成问题,尽可以将每个动作做得轻松、优雅。但是当我们早已胸有成竹,只等下手时,还是这样编辑,不仅减缓速度,还会滋生急躁、甚至烦躁的情绪。试想以下操作我们通常是如何完成的:
- 删除一个长达三屏(甚至更长)的函数;
- 重新格式化一段没有做好缩进的代码;
- 只在一个函数(或一块文本)里做字符串替换;
- 选好一块很长(数屏)的文本后发现结尾处选对了,可是开头处要做一些调整。
我曾经为这些问题郁闷得不行,尤其是最后一个,简直暴跳如雷,因为除了重来,还能怎样呢?直到用了Emacs才发现,原来生活可以如此简单,写程序可以如此快乐。所以,尽管过了三年,我仍然为每一次击键兴奋不已,我所在的组共6人(包括我),经过我的鼓吹,有3名同事开始使用Emacs。
使用Emacs的好处有很多,我会在后续的blog里面重点介绍,但我认为最重要的是,它彻底改变了我对编辑的认识,从此以更严肃的态度对待它。正如高级语言取代汇编语言一样,那些只能区分单个字符的编辑器也该被丢弃,只有提供更高的抽象,以及基于这些抽象的操作,才能使开发过程更加高效。
我个人认为Emacs的强大之处可以在下面几个方面得到体现:
- 对编辑操作的支持极其丰富,使得输入过程非常流畅,比如支持正反双向以一个字符、单词、句子、甚至段落为粒度移动光标,将光标快速定位到函数头尾、该行第一个非空格字符,双向调节选中区域,注释掉选中区域或去掉选中区域的注释(对于只支持行注释的语言,如Perl等,非常方便),等等,数不胜数;
- 可定制性。每个人都有自己的偏好,有人喜欢语法高亮,有人不喜欢;有人喜欢4格缩进,有人喜欢GNU风格,还有人不希望缩进有tab键,只能用空格,等等。Emacs为此提供了极其灵活的定制功能,使其满足不同口味的人群。
- 可扩展性。Emacs由两种语言实现——C和Emacs Lisp,除了少数基本操作和一部分对性能要求较高的函数外,绝大多数功能都是由Emacs Lisp实现,而Emacs本身就可以看作是一个Emacs Lisp程序运行环境,因此,任何人都可以使用Emacs Lisp实现自己所需的功能。同样是编辑,写程序和写文章的需求是不一样的,正是由于Emacs的这种开放性,使其可以满足绝大多数编辑需求,即使是那些非常古怪的要求,因为你总是可以写一段程序来完成它。不要因为看到Lisp就畏缩不前,它有很多美妙的语法特性是你在其它语言中看不到的,它让你惊呼,原来程序也可以这么写。
- 在线帮助。没有比找不到帮助更让你泄气的了,而Emacs永远不会让这种事情发生。所以,你很难在市面上见到讲Emacs或Emacs Lisp的书,而网站只需http://www.emacswiki.org/一个足矣。
- 与环境完美集成。这个环境当然是指GNU/Linux环境,在Windows上可以选择Cygwin。与版本控制系统的无缝连接,编译、调试、搜索,收发电子邮件,订阅新闻组,查看其它GNU/Linux系统命令帮助,等等。一种夸张的说法是有人就生活在Emacs里。:-)
学习Emacs的唯一难处是开始很难。原来一个美国同事说他从vi转到Emacs时有6个月啥也不能干。我想可能是夸张了点,一些基本操作还是很快就能上手,毕竟,你还是可以像使用notepad一样使用它。难的是改掉陋习,和记住多如牛毛的快捷键。需要彻底地洗脑,这是一个漫长的过程,要吾日三省吾身,多学习多温习多看帮助多练习。
我知道,仅凭一篇文章很难带来足够的动力,我会继续写几篇,展示Emacs的迷人之处,也希望它能成为每个中国程序员手中的利器。
我们UNIX平台的开发都是在终端进行的,没有X界面,怎么使用emacs?
当然可以啦:-)
你可以先直接输入emacs试试,不行的话就用emacs -nw,这个肯定行的。
偶现在正从vim转向emacs.开发gnu的东西emacs是最合适的。emacs22非常好用.
nod.
我现在也主要在用cvs版本。
支持一下,很想看看emacs在实际的编程中是怎么使用的,:)
不过让我放弃vim,转到emacs可能没那个勇气.太复杂了.
写得很精彩,如果可以,我想转个链接。
我从 vi 转到 emacs 尝试了两次,从 mutt 转到 Gnus 也是两次。 🙂
我现在已经能比较熟练的使用emacs,感觉编辑功能确实不错,但编程时感觉自动补全这些功能似乎并不太好用,可能是我的配置不好。请问关于编程方面楼主是否有好的建议?谢谢
我现在已经能比较熟练的使用emacs,感觉编辑功能确实不错,但编程时感觉自动补全这些功能似乎并不太好用,可能是我的配置不好。请问关于编程方面楼主是否有好的建议?谢谢
我基本不用自动补全,你可以参看跟tag有关的手册。
一直用vim,开始用emacs一段时间.
其实基本的编辑操作vim要比emacs灵活得多。比如[count][command][count][motion].
而emacs定制性扩展行要比vim好得多.可以做得很优雅.