コード書き中 (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しないといけなくて、引数はどうするのかという問題がある。
まあ、もっといい方法はあるに違いないが、とりあえず動いてるので良しとしよう。