[emacs] replace-regexp と isearch の組み合わせ

これの続き。

結局、紹介していただいた ireplace に搭載されてた機能は全部 emacs 22 の新機能に含まれてるので、必要無いという結論に達しました。これを .emacs に書いて終わり。

(defun my-isearch-query-replace-regexp (prefix)
  (interactive "P")
  (if prefix
      (query-replace-string)
    (let ((search-whitespace-regexp nil)
          (my-ireplace-user-quit-search-p nil)
          (isearch-mode-end-hook (cons (lambda ()
                                         (setq my-ireplace-user-quit-search-p
                                               isearch-mode-end-hook-quit))
                                       isearch-mode-end-hook)))
      (isearch-forward-regexp)
      (unless my-ireplace-user-quit-search-p
        (isearch-query-replace-regexp)))))

(global-set-key "\C-\M-r" 'my-isearch-query-replace-regexp)

追記: isearch を C-g で中止しても、構わず query-replace に進むので修正。どうも quit は isearch の内部で処理してるっぽいので、終了 hook で flag を立ててそれを確認するという安易な手法。まぁ .emacs の code なんてこんなもの(顔