使用Emacs daemon
作者: Tiger Soldier
什么是 Emacs daemon
关于Emacs有一个很著名的笑话,就是Emacs = Emacs Makes A Computer Slow。Emacs启用慢是一个人尽皆知的事实。由于启动时要加载大量的脚本和插件,使得Emacs在启动时往往需要数秒之久。因此我在进行一些快速简单的任务,如svn commit时,都是使用nano或者vim来进行的。
Emacs daemon就是为了这个而诞生的。它将Emacs变成了一个C/S模型——只需要启动一个服务器在后台作为守护进程(daemon)跑着,之后启动的每个emacs都是一个客户端,它连接上服务器进行工作。这样一来,只要在启动服务器时运行初始化脚本,客户端启动无需运行脚本,实现启动时间从Firefox到Chrome的转变。
使用 Emacs daemon
要使用Emacs daemon,至少需要Emacs 23。它提供了一个emacsclient程序,用于启动客户端。
有客户端就必然要有服务端。要启动一个daemon,需要在运行emacs时加入一个–daemon参数。幸运的是,我们不用手动启动服务端,而是可以利用emacsclient的-a参数。emacsclient的-a参数用于指定连接不上服务器时使用的别的编辑器(alternate editor),当把这项留空时,它会自动启动服务端。如果不想指定-a,也可以将ALTERNATE_EDITOR环境变量设为""。
除了-a参数,emacsclient还要手工指定使用终端还是X来启动。要从终端启动,需要使用-t参数:
emacsclient -t -a "" |
从X启动则是-c:
emacsclient -c -a "" |
方便些,再方便些
每次都要输入上面那些命令太烦了,不符合*nix的终极目标——偷懒
首先把终端版本设一个alias。编辑~/.bashrc,在最后加入
1 2 3 4 | #用ec来快速启动emacs client alias ec='emacsclient -t -a ""' #现在可以将emacs设为默认编辑器啦:P export EDITOR="ec" |
以后在终端下输入ec就可以启动emacs的终端客户端了:)
在X下,我习惯用gnome-do来启动程序。因此最方便的方法就是建立一个菜单项,名叫Fastmacs,内容自然就是X模式启动emacsclient的命令啦
配置,还是配置
如果在.emacs里对X相关的选项(字体什么的)直接进行设置,那么会发现用emacsclient启动时,这些设置都失效了。这是因为这些设置是在X下的frame创建时才有效的,而启动服务器的时候是没有创建frame的。
解决方法有两种,一种是使用after-make-frame-functions这个hook,在创建一个frame之后才进行设置。代码如下
1 2 3 4 5 6 7 8 9 10 11 | (defun frame-setting () (set-frame-font "文泉驿等宽微米黑 8") (set-fontset-font "fontset-default" 'gb18030 '("文泉驿等宽微米黑" . "unicode-bmp"))) (if (and (fboundp 'daemonp) (daemonp)) (add-hook 'after-make-frame-functions (lambda (frame) (with-selected-frame frame (frame-setting)))) (frame-setting)) |
需要判断是否以daemon模式启动,分别进行处理
另一种方法是设置window-system-default-frame-alist,直接设置参数的默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (setq window-system-default-frame-alist '( ;; if frame created on x display (x (menu-bar-lines . 1) (tool-bar-lines . nil) ;; mouse (mouse-wheel-mode . 1) (mouse-wheel-follow-mouse . t) (mouse-avoidance-mode . 'exile) ;; face (font . "文泉驿等宽微米黑 8") ) ;; if on term (nil (menu-bar-lines . 0) (tool-bar-lines . 0) ;; (background-color . "black") ;; (foreground-color . "white") ) ) ) |
可以设置的参数见Emacs Lisp Reference > Frames > Frame Parameters
推荐使用第二种方法,启动客户端时直接就使用所设置的字体了
参考文章
http://www.wanglianghome.org/blog/2009/01/customization-tips-for-emacs-daemon.html
http://jackycxh.blog.35.cn/2009/07/22/emacs-daemon-and-font/

loading...
gentoo 用户可以安装 app-emacs/emacs-daemon 这个包,然后
sudo ln -s /etc/init.d/emacs /etc/init.d/emacs.yourname
sudo rc-update add emacs.yourname
需要注意的是,有些 elisp 配置在这种模式下面可能不起作用,所以如果发现什么异常也不要惊讶。
不过我这好像除了 highlight-tail-mode 之外还没遇到什么问题。
[回复]
ahei 回复:
四月 20th, 2010 at 8:58 上午
@wd, 不错,gentoo下还有这东西。
[回复]
i believe the original discussion is in:
http://www.linuxsir.org/bbs/thread350246.html
[回复]
ahei 回复:
四月 20th, 2010 at 9:38 上午
@g, 你的意思是?
[回复]
这个速度确实快,唯一的问题就是字体,窗口的配置,我用的方法和你是一样的,也是抄的。。。
http://github.com/tumashu/emacs-helper/blob/master/eh-frame.el
[回复]
ahei 回复:
四月 20th, 2010 at 12:59 下午
@tumashu, …这话说的
[回复]
tumashu 回复:
四月 21st, 2010 at 12:07 上午
@ahei,
发的时候没有检查,有了歧义了。。。。
[回复]
请问Emacs-cn的IRC在哪里?
服务器和端口说说.
[回复]
ahei 回复:
四月 21st, 2010 at 3:19 下午
@tmpistemp, ERC使用简介上不是有吗, irc.debian.org, 端口默认的就可以
[回复]
tmpistemp 回复:
四月 21st, 2010 at 3:29 下午
@ahei, 晕,忘记了.
[回复]
恩,这篇就非常实用,一下就能用上。谢了。
[回复]
@tmpistemp
irc.oftc.net:6667
#emacs-cn
经常来玩
[回复]
关于关闭daemon:
在任意一个client中键入 M-x save-buffer-kill-emacs
活着再终端输入 emacsclient -e “(kill-emacs)”
[回复]
Mike Ma 回复:
七月 8th, 2011 at 1:54 下午
@soey, pkill emacs
[回复]
为什么我的emacsclient打不开了?我碰到了字体问题,用set-default-font失败,最后不知怎么emacsclient的GUI打不开了,诡异的是,终端上的又能打开。。。求助。。。
[回复]
原本cedet分析出来的tag都在菜单栏的“TAGS”下的,在emacsclient怎么就没了?
[回复]
window-system-default-frame-alist下font那里该怎么设置,如果我想用多种font呢,针对中英文不同的
[回复]