setqでの変数の定義を現在の変数の状態に変更するelisp
一部の関数を直接変数の中に代入して、それをsourceとしてanythingを使っているのですが。*1
変更結果を保存したくなりました。
そんなわけで、現在の変数の状態に変数定義の部分を変更するelispを書いてみました。
コード
(defun renew-sexp-in-current-buffer (regexp) (goto-char (point-min)) (search-forward-regexp regexp) ;re = (setq \\\(anything[\-a-zA-Z]+source\\\)" 必ず変数名の部分を\\\(と \\\)で囲む (let ((valname (intern-soft (match-string 1)))) ;valnameを読み取るために (when valname (kill-region (progn (beginning-of-defun) (point)) (progn (end-of-defun) (point))) (print `(setq ,valname ',(symbol-value valname)) #'insert))))
実行結果
以下のように書いてあるbufferがあったとして、
(setq a 1) (setq a '(1 2 3)) (renew-sexp-in-current-buffer "(setq \\\(a\\\)") ;変数名は「\\\(」と「\\\)」で囲む必要がある。
renew-sexp-in-current-bufferをC-x C-eで実行すると以下のように変わる
(setq a (quote (1 2 3))) ;(setq a 1) (setq a '(1 2 3)) (renew-sexp-in-current-buffer "(setq \\\(a\\\)")
問題は無駄に一行改行されてしまうことです。(bufferに出力するときにprintを使っているので)
*1:obarrayをsourceにすると動作が重たいので