emacs23 の daemon mode

emacs23 から emacsdaemon 化できるようになりました.

emacs22 でも起動時に (server-start) などとしておくとemacsclient を使用して既に起動している emacs に接続することができましたが"emacs --daemon" などとすると background で起動することができます.

そんな訳でイロイロ仕込んでみました.

既に emacs server が起動している場合には server-start しない

.emacs あたりに

(require 'server)
(unless (server-running-p)
  (server-start)
  )

と書いておくと良いでしょう.

X 起動時に emacsdaemon として起動する.

例えば .xsession なんかに

emacs --daemon &

などとしておくと, X 起動時に emacsdaemon として起動します.

Gnome や XFce4, KDE などの場合は ~/.config/autostart/emacs.desktop を作成して

[Desktop Entry]
Encoding=UTF-8
Version=23
Type=Application
Name=emacs(daemon)
Comment=emacs -- daemon mode
Exec=emacs --daemon
StartupNotify=false
Terminal=false
Hidden=false

とか書いておくと良いかもしれません.daemon として起動した際の出力が .xsession-errors に残るので,個人的には .xsession から呼び出す方が好きです*1.

また個人的に skk の sticky-shift を使いたいので, 以下の様な emacs-daemon という shell script で daemon を起動します.つまるところ uim-skk を無視しています.

#!/bin/sh
XMODIFIERS="@im=none"
GTK_IM_MODULE=none
export XMODIFIERS GTK_IM_MODULE
exec /usr/bin/emacs --daemon

emacsclient の設定, terminal 編

emacsclient に --tty を指定すると, そのターミナルでクライアントを起動できます.例えば, 以下の様な shell script で emacsclient を起動します.

#!/bin/sh
XMODIFIERS="@im=none"
GTK_IM_MODULE=none
TERM=screen-256color-bce
export XMODIFIERS GTK_IM_MODULE TERM
exec /usr/bin/emacsclient  --tty "$@"

TERM の設定は 256 色表示するためのモノです.

emacsclient の設定, X-Window 編

emacsclient に -c を指定すると X(正確には frame) で起動します.しかしながら, このままでは前回行なったフォントの設定が有効になりませんでした.

これは .emacs 内でフォント設定のファイルを

(if (eq window-system 'x)
    (if (>= emacs-major-version 23)
        (load "~/.emacs.d/init/init-antialias.el")
      (load "~/.emacs.d/init/init-frame.el"))
  )

として読み込んでいるためでした.つまり daemon として起動した際には (eq window-system 'x) が t ではないから,フォント設定のファイルを読みに行っていないわけです.emacsclient には lisp を評価する -e|--eval というオプションがあるので,emacsclient --eval '(load "~/.emacs.d/init/init-antialias.el")' などとしてフォントと色の設定を読みに行かせることにしました.

そんな訳で, 以下の様なシェルスクリプトで emacsclient を起動します.XMODIFIERS と GTK_IM_MODULE は ry)

#!/bin/sh
XMODIFIERS="@im=none"
GTK_IM_MODULE=none
export XMODIFIERS GTK_IM_MODULE
exec /usr/bin/emacsclient -c "$@" -e \
'(load "~/.emacs.d/init/init-antialias.el")'

その他イロイロ

client の停止は, これまでは C-x # でしたが C-x 5 0 になります*2.

daemon の停止は例えば以下の様な shell script でやります.

#!/bin/sh
exec /usr/bin/emacsclient -n -e \
'(progn
  (dolist (f (cdr-safe (reverse (frame-list))))
    (delete-frame f t))
  (kill-emacs))'

他には, (eq window-system 'x) が t の場合の色設定を幾つかやっているので,frame を上げて起動した時に偶に色が変になりました(skk のカーソルの色とか).これは気がついた時に弄ることにします.

まとめ

emacsclient への接続はほんの一瞬で終わります. 体感的には emacs が一瞬で起動したかの様です. emacsclient は全バッファーを共有しているので, ファイルの編集が非常に楽になりました.

ちなみにdaemon を X 起動時ではなくて screen の 0 番で起動したら, これまで通り emacsclient と screen との連携*3ができました.

参考

*1: ~/.config/autostart で起動する際のアプリケーションの log ってドコにあるんだろう…

*2:これは割り当てをあとで変えておきたいなぁ

*3: emacsclient 起動時に emacs を開いている screen に移動して, 編集を終えたら元の screen に戻る, というアレ