検索した文字列を対象に置換(その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日にミスってた所を直しておいた。