原载:http://blog.csdn.net/netcasper/article/details/364258
emacs是我开始系统学习的第一个自由软件,也是到目前为之我用得最熟的软件。
第一次听说emacs是在读研的时候,那篇文章的内容都忘光了,只记得仿佛是说emacs是专业程序员的必备工具之一。当时也就是留了个印象,没太当回事,上班后,因为项目要求源代码文件格式必须为unix文件格式,而且每个人给了一个SlickEdit的license,推荐使用。后来我发现项目元老们都是用emacs的,就尝试着学起来,哪知一发不可收拾,完全被emacs的世界给迷住了。
其实,emacs的学习曲线在开始阶段是很陡的,也就是说学了很多也不见什么效果,一位元老就跟我说过,当初他从vi转向emacs时有6个月时间什么也干不了(估计有夸张的成分)。所幸作为公司的新人,开头两个月处于学习阶段,没什么任务压下来,看文档看腻了就学学emacs,等后来接任务了就边干边学,直到后来越用越熟练,用到的功能越多,现在可以说完全离不开emacs了。
在用emacs之前我都是用Delphi或VC++自带的编辑器,那时对编辑的理解就是敲键盘,把程序一个字母一个字母地敲进去,从来没想过它还能提供其它功能。emacs非常重视编辑,认为编辑是程序员最频繁的工作之一,因此提供了丰富的操作供程序员使用。这些功能中有些是emacs独有的,有些也被其它编辑器——如vi等——支持,但往往都是Windows下的编辑器所缺少的。比如说以单词为粒度遍历程序或文档;可以按组合建(M-d)直接删除一个单词,就像用DEL删除一个字母一样快;又比如所有的剪切和复制内容都被保存起来,然后通过C-y粘贴最后一次剪切或复制的内容,通过M-y取出以前的内容,等等。一度让我赶到非常爽的命令是M-x comment-region和M-x uncomment-region,它们可以快速将大段代码注释起来或去掉注释,并能根据不同的语言选择不同的注释符号,如C++程序会用//,shell和Perl程序会用#。
编辑和浏览是emacs最基本的功能,在此基础上,配合emacs提供的丰富接口,使其成为非常强大的开发工具。难怪有人开玩笑说某些人甚至就生活在emacs中,因为在emacs里可以做任何事:-)。我现在用得最多的就是与cvs的接口和各种diff功能。emacs提供两个包调用version control工具,它们是VC和PCL-CVS,一般操作单个文件用VC,操作整个CVS tree的时候使用PCL-CVS。emacs之所以方便是因为它将cvs各种命令显示的信息放在buffer里,这样,不仅可以使用emacs提供的最基本的浏览和查找功能,而且emacs会做一些高亮处理,使得信息主次分明,利于浏览。如果是在shell下运行命令,像log或diff显示的信息都比较长,不利于查看,更没法查找,除非你把输出重定向到一个文件里,再用编辑器打开。另一个非常有用的命令是M-x vc-annotate,这个命令将当前文件里每一行的信息都显示出来,例如最后一次修改的日期、版本号和修改者,我一般在看代码有不懂的地方就运行一下这个命令,然后就可以找相应的人去问了。参加了大项目才知道,version control和diff对一个程序员意味着什么。
emacs在某种程度上也可以看做是个IDE,因为你可以在emacs里编译、调试程序。编译命令是M-x compile,然后你会看到缺省的命令是make -k。如果makefile不和当前源程序在同一个目录下,可以稍加修改,把make -k改成cd some/directory && make -k。编译信息会显示在一个单独的buffer里,如果编译出错,也可以通过点击出错信息直接定位到错误的源程序所在的行。如果程序是用gcc编译的话,也可以在emacs里调用gdb调试,因为我们的程序不是用gcc编的,所以没怎么用过调试的功能,尝试过一次,感觉和在命令行下调用gdb差不多,好处仍然是信息都显示在buffer里,可以使用emacs强大的查找和浏览功能,而且源文件显示在单独的buffer里,不像命令行下看到的内容有限,经常要调用显示命令。
emacs还有很多强大的功能,再介绍几种我用过的。Calendar/Diary功能、方便画字符图形的picture-mode、可以收mail看newsgroup的GNUS等等,甚至可以播放mp3!emacs之所以拥有如此众多的功能,是因为它带有一个解释器,可以解释执行Emacs Lisp程序,除了少数原语是用C实现的外,绝大多数功能都是用Emacs Lisp语言实现的,而当某人想要某种功能而emacs里又没有的话,他就可以自己实现,然后贡献出来,造福大家。你可以在http://www.emacswiki.org/找到很多有趣的东西。
其实,emacs调用了很多外部程序来实现功能,所以,在学习emacs的同时,我也学会了许多其它的自由软件,对我来讲,这是一个非常美妙的学习过程。过年回家的时候,我把Introduction to Emacs Lisp和The Emacs Lisp Reference Manual通读了一遍,虽然没有全部看懂,甚至有些内容都没记住(Lisp实在是一种非常不同的语言),但是至少可以看懂一些简单的程序了,希望在不久的将来能用上自己开发的功能。