LinuxGem
此处为老的 LinuxGem,新版 LinuxGem 请移步 www.linuxgem.org

让 Emacs 飞起来

galeki posted @ 2009年5月22日 04:07 in 文档编辑与排版 with tags emacs DAEMON emacsclient , 6226 阅读

许多憎恨 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 ""'

本文转载自 http://liyanrui.is-programmer.com

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

cnlion 说:
2009年8月10日 18:53

也可以在.Xresources中设置emacs字体:

$ cat .Xresources
Xft.dpi:96
Emacs*Background: LightYellow2
Emacs*Foreground: black
Emacs.FontBackend: xft
Emacs.geometry: 100x35+0+0
Emacs.Font:DejaVu Sans YuanTi Condensed-14
xdvi.editor: emacsclient --no-wait +%l %f
xdvi.mfMode: ljfour
xdvi.Margin: 0.5cm
xdvi.keepPosition: on
xdvi.pixelsPerInch: 600
xdvi.shrinkFactor: 5
xdvi.geometry: 1000x900+0+0


登录 *


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