エスケープシーケンスを理解して置換
とかが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で変更したら同期するとか、何かあると便利かもしれない。まあ細かく切り替えなくても別にできるので、手動であわせても良いんだけど。
■追記