[xyzzy] C-x a で変数をセットするやつ

2014-10-19
* バッファローカルな変数をちゃんとセットできてなかったのを修正
* 標準の関数上書きするのをやめた

主に lisp 書いてて *buffer-package* を修正するのに使ってる。けど微妙に使いにくいので余計なことをしてみた。

  • 値を入力するときに元の値と(あれば)変数の説明を表示
  • 元の値が文字列だったときに、文字列を入力させるか否かを設定できるように
  • 値を入力するときのプロンプトを文字列待ちなら変える
(defvar *set-variable-for-string* t
  "*コマンド set-variable で変数の値が文字列の場合、式ではなく文字列を入力するかどうか。")

(defun my-set-variable (var)
  (interactive "vSet variable: ")
  (unless (and (symbolp var)
               (boundp var))
    (error "No such variable"))
  (set var (save-window-excursion
             (save-excursion
               ;; 変数の説明があれば *Help* バッファに表示
               (let ((buf (get-buffer-create "*Help*"))
                     (doc (documentation var 'variable))
                     (val (symbol-value var)))
                 (erase-buffer buf)
                 (setup-temp-buffer buf)
                 (with-output-to-buffer (buf)
                   (when doc
                     (format t "変数の説明:~%~A~2&" doc))
                   (format t "元の値:~%~S~2%" val))
                 (pop-to-buffer buf)
                 (if (and *set-variable-for-string*
                          (stringp val))
                   (read-string "文字列: ")
                   (read-sexp "値: ")))))))


(global-set-key '(#\C-x #\a) 'my-set-variable)

defcustom があれば色々できるんだろうけどなー。