検索した文字列を対象に置換(その2)
置換周りを適当に変えてみる話とか。
■変えた所
正規表現で検索中で正規表現で置換できるように。*1
;; 置換 (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) (replace-string pattern replacement)) (quit) )) (define-key *isearch-map* #\M-r 'isearch-replace)
正規表現で検索している時は正規表現で置換するようにした。ただし、正規表現で検索をする場合はisearch-scannerを変えた方がいいというか、変えないと駄目な気がする。何故かed::*isearch-current-string*をtにしても上手くいかないので色々見てみたら
(defun isearch-scanner (string no-dup) (let (;(*isearch-regexp* nil) (pattern string))
iscarch-scannerの始めの辺を、こんな漢字に変えた方が良いように思う。isearch-decoを使っていたので勝手に書き換えてて気づいてなかったけど、isearch-deco使ってない人はこの辺を上書きするか書き換えておかないと、正規表現の検索とか面倒。書き換えてある場合はisearch-deco見たいに、適当なトグルするのを好きなキーに割り当てておくと良い感じ。
(defun isearch-deco-regex-toggle() (interactive) (setq *isearch-regexp* (not *isearch-regexp*)) (message "now ~A regex in isearch" (if *isearch-regexp* "" "NON ")) )
isearch-decoのregex切り替えは前に気づいた時にはC-aに割り当てられていたわけだけど、C-aが嫌な場合は違うのにしても良いかもしれない。検索中でもC-aって行頭に移動してほしい時もありそうなので。その場合は
;; ex (undefine-key *isearch-map* #\C-a);一応解除 (define-key *isearch-map* #\C-t 'isearch-deco-regex-toggle);キーは好きなので
もしisearch-decoのusageも一所に変えたいなら、*isearch-help-string*とかの中身を変えればいいんだけど、これがstringとか書いてあっても中身は文字列じゃないので、単純にconcatとかと言うわけにはいかないから、直接書き換えた方が良いと思う。後からの変更を考えると
(defun isearch-help () (eval *isearch-help-string*))
ここでpopupさせれば良いような気もするが、何か意味があったのかもしれない。
(setq *isearch-help-string* (concat "usage " (find-command-key 'isearch-help *isearch-map*) " " " " "abort " (find-command-key 'isearch-abort *isearch-map*) " " "exit " (find-command-key 'isearch-exit *isearch-map*) " " "delete-char " (find-command-key 'isearch-delete-char *isearch-map*) " " " " "repeat C-r <-> C-s " "history C-p,up <-> down,C-n " " " "toggle deco " (find-command-key 'isearch-deco-ignore-toggle *isearch-map*) " " "toggle regex " (find-command-key 'isearch-deco-regex-toggle *isearch-map*) " " " " "quota char " (find-command-key 'isearch-quote-char *isearch-map*) " " "yank word " (find-command-key 'isearch-yank-word *isearch-map*) " " "yank " (find-command-key 'isearch-yank *isearch-map*) " ")) (defun isearch-help () (popup-string *isearch-help-string* (point)))
こんな感じだと嬉しいような気がする。こうだとconcatで適当に
(concat *isearch-help-string* "replace " (find-command-key 'isearch-replace *isearch-map*) " " )
とかやったら文字が出るんじゃないだろうか。あんまり試してないけど。ESC keymapがまずそうな気もする。
igsearchは余り試してないので不明だけど、同様のことをやってくれるかもしれない。少し気になるのはigsearchのC-gは設定が必要なのか、この前少し試したら何か挙動がおかしい。あと正規表現のトグルもなんか変な気がする。C-sを2回押した時に挙動は普通のisearchより便利そうなので、手を入れたら良いような気もする。
isearch-decoで同じような事をする場合は検索じゃなくてGrepにしてしまうので、isearch中にM-gとか。これは色分けもないし少し落ちるかもしれないが。まあ、好みの問題かも。
*1:12/30日にミスってた所を直しておいた。