平衡点
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 に戻る, というアレ))ができました.
参考
2013/11/27
_ Redmine でメールでチケット登録する際のエラー(?)
プロジェクト管理に Redmine を使っているのだけれど, 久々にメールからチケット登録しようとして
Encoding::CompatibilityError (incompatible character encodings: UTF-8 and ISO-2022-JP):
を頂戴した. rdm-mailhandler の呼び出し自体は ~/.forward でやっていて, どうせ自分が送信するメールは ISO-2022-JP であることが殆どなので
"| nkf -w | /usr/share/redmine/extra/mail_handler/rdm-mailhandler.rb \ --url [redmine の URL] \ --key [redmine の API キー] \ --project [redmine のプロジェクト ] \ --unknown-user=ignore" # 折り返しているけれど, 実際は一行で
として, お茶を濁してみた. 特に問題無いみたいなので, これで良いかなぁ...
2014/11/27
_ google-contacts-wl 改め gcontacts-get-wl
ひっそりと google-contacts-wl を更新し,emacs-misc/gcontacts-get.el の更新に合わせて, 名前を gcontacts-get-wl にしました.
これは何?
Google Contacts にある名前,(あればニックネーム),メールアドレスを wanderlust の Address ファイルに書き出す elisp です.
Address ファイルの形式はいたって単純で
email1 nickname1 fullname1 email2 nickname2 fullname2 :
と,一行につきメールアドレスと対応するニックネーム,名前が <TAB> 区切りで列挙されているだけです. 本 elisp では
- nickname 無い場合には fullname を二回続ける
- fullname も無い場合にはメールアドレスを並べる,
というおバカ使用になっていますが,実用には耐えるので,まあ良いか,と.
あと,1-way converter (GoogleContacts → Address ファイル)なので, 御本尊が Google Contacts な人向けです.また,手元の Address ファイルを上書きするのでご注意下さい.
ちなみに emacs-misc/gcontacts-get.el 以外にも google-contacts.el | Julien Danjou というモンもあって, こちらは非同期通信かつ高機能だったのですが,認証が oauth2 のみで, かつ Emacs >= 24 用だったので使いませんでした(一瞬試してみているので,Github の履歴には残っています).
使い方
依存パッケージは,多分無いと思っていますが,どうかな...? 一応 Emacs >= 23 で動作確認しています.
- gcontacts-get-wl.el を load-path のあるディレクトリに置く
- 以下を ~/.wl に記述: 必要な所は適宜書き換えて下さい.
# source: scheme (setq wl-address-file [somewhere]) (require 'gcontacts-get-wl) ;; Optional1 - application login ;; (setq gcontacts-get-email "Your GMail Address") ;; (setq gcontacts-get-passwd "Your GMail Password") ;; Optional2 - use auth-source ;; (setq gcontacts-get-passwd-use-auth-source "somewhere") ;; Optional2 - use Oauth2 (Required package `oauth2') ;; (setq gcontacts-get-use-oauth2 t) ;; (setq gcontacts-get-oauth-client-ID "Your Client ID") ;; (setq gcontacts-get-oauth-client-secret "Your Client Secret")
認証方式1, 2, 3 を適宜選択して下さい. authinfo を使う場合には素のファイルより .gpg の方が良いと思います.
- M-x gcontacts-update-wl-address
そんな訳で.
まあ,個人的な用途にしか使用していないので,こんなんで良いかなぁ,と.
望むべくは Emacs から Google Contacts を編集することなんでしょうけれど, 幾つかある情報を参考にしてみても,いまいち上手く動作しません. 誰か教えて下さい.
もしくは GoogleContacts を LDAP アドレス帳として使えるようになっていれば, wl-use-ldap で直接アドレス補完できるんですけれどね.