Stumpwm と loadrc と emacs と

結構前から自分の中で問題視していた部分があり、最近解消したんで問題と対策を残しときます。先ず、問題の話から。Stumpwm の version 0.9.7-27 を使ってるんですが、その stumpwm/contrib 内の module load の 2 回目を行うと再セット不可能というエラーを吐いていました。問題の記述は下記の行です。

(defconstant +ipv4-zero+ "00000000")

defconstant で定数定義しているため loadrc 実行時に怒られるのでした。なので初回の load ではちゃんと読み込みます。因みに放置したところで問題は無いのですが、エラーを放置するのは気持ち悪いのと、一々 Enter key を押してデバッガを先に進めるのが面倒くさいので対処しました。

(set-contrib-dir "stumpwm/contrib/")
(if (boundp '*load-module*)
    nil
    (progn
      (mapcar #'load-module '("cpu"
                              "mem"
                              "battery-portable"
                              "net"
                              "wifi"
                              "disk"))
      (defvar *load-module* 1)))

contrib-dir は module の入っている dir の指定です。stumpwm/ 以下に入ってるので自分の環境の stumpwm/contrib を指定してください。boundp は指定されたシンボルが既に定義されているかどうかを調べるものです。変数定義されていれば t が、定義されていなければ nil が戻ります。progn は関数群を連続で実行するためのものです。if 等の基本的に一つの処理しか書けない場所に記述する事で複数の処理を置けるようになります。defvar は変数の束縛を行うものです。ダイナミック変数の *load-module* を定義しとくことで 2 回目の loadrc の実行時には定義済みの為、progn 以下では無く nil が実行されます。これでエラーは対処できました。

loadrc でのエラーが発生しないようになったと思いきや、今度は別の問題が発覚しました。次の問題は emacs が CPU を馬鹿食いしている現象でした。何気なく quit で xdm の認証に戻ってから再ログインすると発生するようでした。原因は emacs --daemon でした。僕の環境では Stumpwm の設定 load 時に emacs --daemon を上げるようにしていたんですがログアウト時には落とされなく、再ログインした時に不都合が起こっているようでした。因みに emacsclient は画面が出てきませんでした。ですが、動作はしているようなので単に DISPLAY 指定が変わっている可能性があります。emacs の暴走もこれが原因ですかね。これに関しては、Stumpwm の startup 時に hook して emacs を落とした後で再度 emacs を立ち上げる様にして解決しました。ついでに今まで汚く放置してたスタートアップアプリも入れときました。取り敢えず、hook 用の変数名が分からないので grep で stumpwm/ 内を探しました。

$ grep \*.*hook\* stumpwm/*

検索をかけた所、下記の辺りが hook に使用されている変数名っぽいです。

stumpwm/stumpwm.texi:@defvr {Hook} *new-window-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *destroy-window-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *focus-window-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *place-window-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *start-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *internal-loop-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *focus-frame-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *new-frame-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *message-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *top-level-error-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *focus-group-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *key-press-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *root-click-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *mode-line-click-hook*
stumpwm/stumpwm.texi:@defvr {Hook} *urgent-window-hook*

名前からあからさまに *start-hook* が怪しいです。というかどう考えてもこれでしょう。この変数に hook して自前の関数を突っ込んどきましょう。関数と言ってもスタートアップアプリを入れとくだけなんで対したことはしてませんが。

(defun start-applications ()
  (run-shell-command "killall emacs")
  (run-shell-command "xmodmap .xmodmaprc")
  (run-shell-command "scim &")
  (run-shell-command "emacs --daemon")
  (run-shell-command "dropbox start"))

(add-hook *start-hook* #'start-applications)

以上で emacs の暴走問題も解消されました。いやぁよかったよかった。KVM の管理辺りを Stumpwm で用意したいんですが、結構大掛かりになりそうなんでヤル気が乗らないですね。まぁ気が乗ればやることにします。