letの変数を書き換えとか

 昨日の続き(良く見たら今日書いてたらしい)で、少し思ったのはletの中の変数の書き換えはそんなに難しくないなぁと。つまり、letの中の変数を変えたら、其の括弧以内の範囲で変数名と同じ奴を変換すればいいわけだから。

;lispの文法を読むのに使いそうなのを先に作ってみた。
(defun hoge-word()
  "キャレットの付近の単語を返す"
  (interactive)
  (let ((start (and (skip-syntax-spec-backward "w_") (point)))
		(end nil))
	(if (not(eolp))
		  (setq end (and (skip-syntax-spec-forward "w_")(point)))
	  (setq end (point)))
	(buffer-substring start end)))

(defun backto-paren()
  "(が出てくるまで後ろに移動"
  (interactive)
  (while (not (looking-back "("))
	(backward-char)))

(defun upto-paren()
  "一つ上の括弧の枠に移動。正規表現とかの(とかがあると上手くいかないけど。"
  (interactive)
  (let ((cp (point)))
	(dotimes (i 2 t)
	  (while (looking-at "[^)]")
		(if (looking-at "(")
			(goto-matched-parenthesis))
		(forward-char))
	  (goto-matched-parenthesis))
	(when (eobp)
	  (goto-char cp)
	  (message "これ以上は括弧が一つしかない"))
	))

(defun goto-let()
  "キャレットがletの括弧内ならばletのある所に移動"
  (let ((cp (point)))
	(while (not (looking-for "let "))
	  (dotimes (i 2 t)
		(while (looking-at "[^)]")
		  (if (looking-at "(")
			  (goto-matched-parenthesis))
		  (forward-char))
		(goto-matched-parenthesis))
	  (forward-char)
	  (when (eobp)
		(goto-char cp)
		(message "これ以上は括弧が一つしかない")
		(return nil)))
	cp))

(defun set-let-mark()
  "letのなかをmark"
  (let ((cp (point))
		startlet
		endlet)
	(when (goto-let)
	  (set-mark)
	  (backward-char)
	  (goto-matched-parenthesis)
	  )))

 取りあえず、適当にやってみたけど、やった所までメモ。letの範囲でmarkできるようになったので、letでナローイングして置換を次に試す予定。出来たら、置換対象の変数をどうにか捕捉して、それを置換候補のメニューに出せたらいい感じ。妄想的には、変数の所を書き換えようとしたら、それが自動で動いてletないの変数が自動で書き換わるといいかなぁとか。思ってみた。出来るのか知らないけど。
 今日見たらshilogの中の人が、朝に書いたようなことらしきことを書かれていたので、アイデアだけ適当に書いておいたら後は実装してくれそうな気もしてきたけど。