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