エスケープシーケンスを理解して置換

とかがreplace-regexpで判断してくれなかったので無理やり書き換え。前に2chで見かけた奴を適当に改造。多分、前の奴だとargがnoerrorの所にきてしまったので、バグとか出来てしまいそうに思ったりした。ついでに、isearch-replaceの方は書き換えるとisearch-decoとかigsearchとかisearchで違うがある部分を吸収できそうにないのでreplace-regexpを変えた方が良いかなぁとかで。このisearch-replaceは下の replace-regexpとセットでじゃないと上手く動かない感じ。
grepを見てたら*understand-escape-sequences*なんていう素敵な変数が既にあるのに気づいたので、それに変更とか。

;keymap
(define-key *isearch-map* #\M-> 'toggle-esc-sequences)

(defun toggle-esc-sequences()
  "置換時のエスケープシーケンスを読み込みを切り替え"
  (interactive)
  (if ed::*understand-escape-sequences*
	  (message "replace esc sequence : ~A"
			   (setq ed::*understand-escape-sequences* nil))
	(message "replace esc sequence : ~A"
			 (setq ed::*understand-escape-sequences* t))
	))


;;; ベース部分改造なので副作用注意
(defun replace-regexp (regexp replacement
							  &optional
							  noerror
							  (esc-sequences ed::*understand-escape-sequences*))
  "正規表現で置換"
  (interactive "*sReplace regexp: \nswith: \np"
	:default0 ed::*last-search-regexp* :history0 'search
	:default1 ed::*last-replace-regexp* :history1 'search)
  (if esc-sequences
	(setq regexp (decode-escape-sequence regexp t)
		  replacement (decode-escape-sequence replacement t)))
  (perform-replace regexp replacement nil t (interactive-p) noerror))


;;; ベース部分改造なので副作用注意
(defun replace-string (pattern replacement
							   &optional
							   noerror
							   (esc-sequences ed::*understand-escape-sequences*))
  "エスケープシーケンスを理解するreplace-string"
  (interactive "*sReplace string: \nswith: "
    :default0 ed::*last-search-string* :history0 'search
    :default1 ed::*last-replace-string* :history1 'search)
  (if esc-sequences
	(setq pattern (decode-escape-sequence pattern nil)
		  replacement (decode-escape-sequence replacement nil)))
  (perform-replace pattern replacement nil nil (interactive-p) noerror))

ついでにisearch-replaceもそれに対応。

;; keymap
(define-key *isearch-map* #\M-r 'isearch-replace)

;; 置換
(defun isearch-replace()
  "isearchの検索対象に対して置換。"
  (interactive)
  (let ((pattern ed::*isearch-current-string*)
		(replacement (read-string "sReplace:")))
	(when (not (stringp pattern))
	  (message "~A is not string" pattern)
	  (return-from isearch-replace nil))
	(if ed::*isearch-regexp*
		(replace-regexp pattern replacement ed::*understand-escape-sequences*)
	  (replace-string pattern replacement ed::*understand-escape-sequences*))
	(quit)
	))

 何か普通に動くようにしていたら、意外と直さないと駄目だった。というかreplaceがエスケープシーケンス理解するのがないのはなんでなんだろうなぁ。ed::*understand-escape-sequences*こんな変数まで作っておいて、ないってのは何となく、忘れてしまったんじゃないかと、思ったりした。
 後欲を言えば、igsearchが入っているかとか調べて、エスケープシーケンスをigsearchのUIで変更したら同期するとか、何かあると便利かもしれない。まあ細かく切り替えなくても別にできるので、手動であわせても良いんだけど。

■追記