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にすると動作が重たいので