平衡点
2009/11/27
_ emacs23 の daemon mode
emacs23 から emacs を daemon 化できるようになりました.
emacs22 でも起動時に (server-start) などとしておくとemacsclient を使用して既に起動している emacs に接続することができましたが"emacs --daemon" などとすると background で起動することができます.
そんな訳でイロイロ仕込んでみました.
既に emacs server が起動している場合には server-start しない
.emacs あたりに
(require 'server) (unless (server-running-p) (server-start) )
と書いておくと良いでしょう.
X 起動時に emacs を daemon として起動する.
例えば .xsession なんかに
emacs --daemon &
などとしておくと, X 起動時に emacs が daemon として起動します.
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 から呼び出す方が好きです(( ~/.config/autostart で起動する際のアプリケーションの log ってドコにあるんだろう…)).
また個人的に 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 になります((これは割り当てをあとで変えておきたいなぁ)).
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 との連携(( emacsclient 起動時に emacs を開いている screen に移動して, 編集を終えたら元の screen に戻る, というアレ))ができました.