Emacs——很漂亮很强大

Vim我用了5年有余,最近因为接触的项目非常大,大约10W行代码,而且该项目采用包括C和C++还有python的多种语言开发,突然让我觉得使用Vim有些应付不过来。我的主要任务并不是去查看系统细节,而是要在短时间内获得已有系统的情况——包括结构和功能上的信息,所以我需要一个比较强大的代码浏览程序。公司提供的软件库里面搜索了半天,找到十几款代码浏览工具竟然没有一款是我熟悉的。一狠心,我觉得尝试一下Emacs。或许Vim也能够胜任这个工作,但是我尝试拼凑了很久插件也没能找到符合工作需要的集合。总之,破釜沉舟,试一下Emacs。谁知道上手之后我竟然再也放不下Emacs了,彻底被这款编辑器的扩展性和强大功能征服。在使用了Emacs一个月以后,对于我的“重大发现”,我想还是留下一个记录比较好。

基础软件包


$ sudo apt-get install emacs-snapshot emacs-snapshot-common emacs-snapshot-bin-common emacs-snapshot-el emacs-goodies-el emacs-snapshot-gtk

漂亮的Emacs

我并不是个特别喜欢冒险的人,所以刚刚开始的时候,我选择了Emacs22。但是,后来发现,处理日语和中文的字体显示非常繁琐,索性放弃“保守派”的一贯作风,跃迁到还在开发中的Emacs23。在google上搜索得到Alexandre Vassalotti写的很流行的一篇博文Pretty Emacs,如法炮制,在Ubuntu 9.04上得到了一个让我基本满意的操作界面。这篇博文虽然有用但却非常简略,并没有详细说明CJK字体的反锯齿应该怎样处理。我尝试在~/.Xresource文件中使用包含日语和中文的字体,但是结果并不能让我满意,原因是日语和中文的汉字显示混在了一起,错别字太多。拜google所赐,最终还是找到了解决之法。证据在此。

在.emacs中需要使用字符集来将日语和中文的显示字符区别对待,代码如下:

;;;------------------------------------------------------------;;;
;;; VIEW
;;; No startup message
(setq inhibit-startup-message t)
;;; GUI font
(set-default-font "Bitstream Vera Sans Mono-12")
;;; JP fonts
(set-fontset-font (frame-parameter nil 'font)
		  'japanese-jisx0208
		  '("M+2VM+IPAG circle" . "unicode-bmp"))
;;; zh-CN fonts
(set-fontset-font (frame-parameter nil 'font)
		  'han
		  '("Vera Sans YuanTi Mono" . "unicode-bmp"))
;;;;===========================================================;;;;
;;; cjk-misc fonts
(set-fontset-font (frame-parameter nil 'font)
		  'cjk-misc
		  '("Vera Sans YuanTi Mono" . "unicode-bmp"))
;;; bopomofo fonts
(set-fontset-font (frame-parameter nil 'font)
		  'bopomofo
		  '("Vera Sans YuanTi Mono" . "unicode-bmp"))
;;; symbol fonts
(set-fontset-font (frame-parameter nil 'font)
		  'symbol
		  '("Vera Sans YuanTi Mono" . "unicode-bmp"))
;;;;=========================================================;;;;

“Vera Sans YuanTi”字体似乎涉嫌侵权,所以现在在互联网上已经难觅其踪,但是我还是非常喜欢这款合成字体,三四年前私自收藏了一直使用。在Ubuntu Jaunty上,读者可以尝试使用文泉驿等字体替代。或者,如果你拥有Windows的授权,使用微软雅黑也会有不错的效果。这里需要注意的是,Ubuntu 8.04或者更早版本上的emacs-snapshot提供的Emacs版本并不支持CJK字体的反锯齿显示。如果你使用比较早版本的Emacs23,可以尝试使用emacs.orebokech.com提供的WeeklyBuild。但是事先应该确认一下在Ubuntu的backport上有没有提供emacs-snapshot的软件包。下面是中文显示效果的截屏。

安装CEDET

CEDET是一整套开发环境的集合工具。包括工程管理,代码浏览和自动补全工具。但是,Ubuntu的软件频道中提供的版本并不能和Emacs23一起工作。详情可以看这个Debian的Bug#525613。我的解决办法是采用新的CEDET版本。

$ wget http://sourceforge.net/projects/cedet/files/cedet/cedet-1.0pre6.tar.gz/download
$ tar zxf cedet-1.0pre6.tar.gz
$ cd cedet-1.0pre6/
$ make
$ make install-info
$ cd ../ && cp -a cedet-1.0pre6 /usr/share/emacs-snapshot/site-lisp/cedet

这里需要注意的是,必须将编译好的cedet拷贝到/usr/share/emacs-snapshot/site-lisp中,而不能仅仅将这个文件放到load-path中了事。原因是Emacs在初始化的时候,会利用这个目录中的subdirs.el来保证整个目录都添加进入load-path之中。接下来在.emacs中添加下面这几行就基本可以使用了,但是上手之后应该多查看info的内容找到更多的信息。在Emacs中利用组合键Ctrl-h i可以打开info,按s查找CEDET。

;;;-----------------------------------------------------------------;;;
;;; CEDET
;;;-----------------------------------------------------------------;;;
;; Load CEDET.
;; See cedet/common/cedet.info for configuration details.
(require 'cedet)

;; Enable EDE (Project Management) features
(global-ede-mode 1)

;; Enable EDE for a pre-existing C++ project
;; (ede-cpp-root-project "NAME" :file "~/myproject/Makefile")

;; Enabling Semantic (code-parsing, smart completion) features
;; Select one of the following:

;; * This enables the database and idle reparse engines
(semantic-load-enable-minimum-features)

;; * This enables some tools useful for coding, such as summary mode
;;   imenu support, and the semantic navigator
(semantic-load-enable-code-helpers)

CEDET非常强大,以至于很难几句话将这个工具讲清楚,但是经常查看info和多多实践,马上就会用的非常顺手。

后记

最近一些日子,我一直在看Emacs相关的内容。Emacs可以说不仅仅是一款编辑器,而是一个集成并且可以扩展的工作环境。很多年轻的程序员,包括我自己,总是在各种各样的工具之间跳来跳去,一方面可以是因为自己不够坚定,但另一方面只能说很多工具都有自己的局限性,当程序员遇到新的情况的时候就可能很自然的抛弃旧工具。Emacs却不同,它更像一个framework,你可以将自己的技巧,使用习惯以及效率提升工具全部集成其上。如果它不够用了,你可以自己动手写lisp对它进行扩展。又想起那句话,人们往往高估自己短期的能力而低估自己长期的积累。Emacs正是给这种积累提供一种可能性。也许这正是对我来说最要命特性。我的.emacs文件在这里

4 thoughts on “Emacs——很漂亮很强大

  1. F1~12键都被邦定了。。。你记得住么。
    我只绑定了F7,F8, F7智能编译,C-F8, undo, M-F8, redo.
    F9,F10 给fvwm, 用来轮询screen, page和window.
    另外,用emacs读代码其实很郁闷,cedet比起SI来,慢,而且解析功能弱。

  2. ……买不起SI,所以只能用Emacs了。SI有它的好处,不然也不能卖那么贵。Emacs的优点在于将习惯变成工具之一点上,我那个.emacs很旧了,最近正准备更新。

发表评论