コード書き中 (1)

まだ完成してないけど、考えがこんがらがっているのが良く解るコード。

(defmacro polyedit-set-toggle-key (toggle-key &rest args)
  (let* ((func (gensym))
         (docp  (stringp (car args)))
         (ar (if docp (cdr args) args))
         (pre (if docp `(,(car args) (interactive)) '((interactive)))))
    `(progn
       (defun ,func ()
         ,@pre
         (series 2 (define-key #1=*polyedit-mode-map*)
           ,@ar))
       (define-key #1# ,toggle-key ',func)
       (push '(,toggle-key ,func ,(if docp (car args))) polyedit-toggle-alist))))

これだけじゃ動かないし、多分動作が見えないので何がしたいのか説明。
マイナーモード内で、あるキーを押すと、他のキーの動作が変わるようにしたい。
さらに、そのキーの組み合わせをユーザが設定できるようにしたい。
設定したら、設定の一元管理もしたい。


それだけなんだけど、キーを設定するためにコマンドを作らなくちゃいけないので、マクロになっている。
まあ、こういう処理って複雑になりがちだけれども。他の言語ではやりたくない。


クロージャを使って、キーごとにコールするコマンドを変える方法も考えたけれど、それだとfuncallしないといけなくて、引数はどうするのかという問題がある。
まあ、もっといい方法はあるに違いないが、とりあえず動いてるので良しとしよう。