首页 > 初级, 快速启动 > 使用Emacs daemon

使用Emacs daemon

2010年4月20日 ahei 发表评论 阅读评论

作者: 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/

分享家:Addthis中国
GD Star Rating
loading...
使用Emacs daemon, 9.0 out of 10 based on 8 ratings 标签:daemon, Emacs, face, lambda, org, term, 插件, 配色, 配色

相关日志

分类: 初级, 快速启动
  1. 2010年4月20日08:31 | #1

    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 回复:

    @wd, 不错,gentoo下还有这东西。

    [回复]

  2. g
    2010年4月20日09:31 | #2

    i believe the original discussion is in:
    http://www.linuxsir.org/bbs/thread350246.html

    [回复]

    ahei 回复:

    @g, 你的意思是?

    [回复]

  3. tumashu
    2010年4月20日12:29 | #3

    这个速度确实快,唯一的问题就是字体,窗口的配置,我用的方法和你是一样的,也是抄的。。。
    http://github.com/tumashu/emacs-helper/blob/master/eh-frame.el

    [回复]

    ahei 回复:

    @tumashu, …这话说的

    [回复]

    tumashu 回复:

    @ahei,
    发的时候没有检查,有了歧义了。。。。 :oops:

    [回复]

  4. tmpistemp
    2010年4月21日15:14 | #4

    请问Emacs-cn的IRC在哪里?
    服务器和端口说说.

    [回复]

    ahei 回复:

    @tmpistemp, ERC使用简介上不是有吗, irc.debian.org, 端口默认的就可以

    [回复]

    tmpistemp 回复:

    @ahei, 晕,忘记了.

    [回复]

  5. bentusi
    2010年4月23日05:47 | #5

    恩,这篇就非常实用,一下就能用上。谢了。

    [回复]

  6. 2010年4月23日07:37 | #6

    @tmpistemp
    irc.oftc.net:6667
    #emacs-cn

    经常来玩 :)

    [回复]

  7. soey
    2010年11月30日16:53 | #7

    关于关闭daemon:

    在任意一个client中键入 M-x save-buffer-kill-emacs
    活着再终端输入 emacsclient -e “(kill-emacs)”
    :oops:

    [回复]

    Mike Ma 回复:

    @soey, pkill emacs

    [回复]

  8. 2011年7月8日13:54 | #8

    为什么我的emacsclient打不开了?我碰到了字体问题,用set-default-font失败,最后不知怎么emacsclient的GUI打不开了,诡异的是,终端上的又能打开。。。求助。。。

    [回复]

  9. krfantasy
    2011年9月10日18:08 | #9

    原本cedet分析出来的tag都在菜单栏的“TAGS”下的,在emacsclient怎么就没了?

    [回复]

  10. sinners
    2012年1月5日19:05 | #10

    window-system-default-frame-alist下font那里该怎么设置,如果我想用多种font呢,针对中英文不同的

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: