让 Emacs 飞起来

LiYanrui posted @ May 22, 2009 02:40:46 AM in GNU/Linux & Unix with tags DAEMON emacs 23 emacsclient , 5818 阅读

许多憎恨 emacs 的人往往不是因为它的功能太强大了,而是因为它启动太慢。我曾经玩过一个字符界面的游戏——Word War vi,内容就是讽刺 Emacs 是内存怪兽的。估计 emacs 忍气吞声已经很久了。终于有一天,emacs 实现了一个有些笨拙的服务器模式——使用 M-x server-start 启动服务器,然后使用 emacs-client 进行连接——让它的 fans 们和机器可以轻松那么一下了。然而,真正让 emacs fans 们扬眉吐气的是去年 9 月(也许是 8 月,也许是 10 月,反正我不是考古学家)实现的 daemon 进程,它让 emacs 飞起来了。如果你也与我一样对此后知后觉,那么不妨来看我写的这篇文章吧。

试飞

首先编译最新的 emacs 23 版本,不会编译就问 google。如果是 gentoo 用户,emerge 安装 emacs-cvs-23.0.93 即可(如果你高兴也可以用 9999 版本)。

有了 emacs 23 之后,在终端里执行:

$ emacs --daemon

这样就启动了 emacs 的守护进程。

然后,使用:

$ emacsclient -c [your-file-name]

可以在 emacs 的图形界面中打开你的文件。

使用:

$ emacsclient -t [your-file-name]

可以在 emacs 的终端界面中打开你的文件。

要关掉 emacs 的守护进程,可以 pk 它: 

$ pkill -n emacs

也许会飞不起来

emacs 23 自从支持 xft 字体后,大家都不再为配置字体而烦恼了。很多人可能会在 .emacs 文件中填写了类似下面的字体设置语句:

(set-default-font "Courier Std-11")
(set-fontset-font (frame-parameter nil 'font)
                    'han '("AR PL UMing CN"."unicode-bmp"))

很不幸,只要 .emacs 文件里有这样的语句,会导致 emacsclient 程序无法正确运行。具体原因请阅读 http://www.linuxsir.org/bbs/thread350246.html。大概原因就是 .emacs 文件中有关界面和字体的配置没有在 emacsclient 运行的时候被载入。解决方案是利用 emacs 的一个 hook 函数 after-make-frame-functions。我这里把这个函数的壳子贴出来,飞不起来的同学可以尝试将有关界面和字体的配置代码填写进去。

(add-hook 'after-make-frame-functions
          (lambda (new-frame)
            (select-frame new-frame)
            ;; ->在此填界面和字体的配置
))

我的做法是将字体配置语句封装在一个函数里,然后再填写到 after-make-frame-functions 函数中,另外将有关工具条和滚动条(界面配置)禁止配置也写到该函数中。例如:

;; 设置字体的函数
(defun my-default-font ()
  (interactive)
  (set-default-font "Courier Std-11")
  (set-fontset-font (frame-parameter nil 'font)
                    'han '("AR PL UMing CN"."unicode-bmp"))
)

;; 有关界面和字体的配置
(add-hook 'after-make-frame-functions
          (lambda (new-frame)
            (select-frame new-frame)
            (tool-bar-mode 0)
            (scroll-bar-mode 0)
            (my-default-font)
))

这样做了之后,应当不会再出问题了。如果确实还有问题,就自我诊断一下是不是还有其它的界面和字体的配置代码没有移到那个函数里。

飞得更高一些…… 

老是输入 emacsclient 命令,有些累手。为它取个别名吧。在 .bashrc 或 bash 的全局配置文件(对于 gentoo 用户而言 /etc/bash/bashrc 可以用)里写入以下内容:

alias et='emacsclient -t "$@" -a "gvim"'
alias ex='emacsclient -nc "$@" -a "gvim"'

这样就可以在 emacs 守护进程开启的情况下,用 et 命令可以打开终端界面的 emacsclient,使用 ex 命令则可以打开图形界面的 emacsclient。

如果在使用 et 或 ec 命令时,emacs 守护进程没有开启,则自动使用 gvim 作为替代编辑器。当然,你也可以将 gvim 换成你自己喜欢的编辑器,比如 gedit 之类。

如果按照以下方式进行别名定义,可以实现:使用 ex 或 et 命令,碰到 emacs 守护进程未有运行的时候,emacsclient 会将其启动后再进行连接。

alias et='emacsclient -t "$@" -a ""'
alias ex='emacsclient -nc "$@" -a ""'

更正 [1]: 文中谈到 “终于有一天,emacs 23 实现了一个有些笨拙的服务器模式……”,这只是我的臆测。经 helene 考古论证,至少从 emacs 21 就已经实现了这个功能。因此,这里不再提具体的版本号了 :-)

Head_small
Tiger Soldier 说:
2009年5月22日 04:11

不错
emacs的启动一直是个令人头疼的问题

bread 说:
2009年5月22日 06:50

我还是习惯开一个Emacs,扔在一边。。
dameon有一些东西用不成,比如说tabbar

Avatar_small
LiYanrui 说:
2009年5月22日 07:41

@bread: 把 tabbar 的配置代码放到那个 hook 函数里应该可以。

yugushen 说:
2009年5月22日 22:11

请问怎样才能让 daemon 系统登录时自动启动,退出时自动结束。

shuge.lee 说:
2009年5月23日 00:42

嗯,Gentoo用户从来都是幸福滴 :)

http://code.google.com/p/egentoo/wiki/emacs

Avatar_small
LiYanrui 说:
2009年5月23日 01:41

@yugushen: 按照这篇文章的最后那两行配置,是不需要登录时自动启动,退出时自动结束的。如果守护进程没开启,emacsclient 会自动开启它。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter