emacs wgrepが便利だった

Table of Contents

背景・動機

本記事は Emacs Advent Calendar 2025 の2日目の記事です。

emacs wdiredが便利だった でwgrepも便利だということが判明したのでこちらも調査してみる。

試したこと・やったこと

1. wgrepの機能調査

mhayashi1120/Emacs-wgrep のサードパーティpackageでMelpaから落とすことができる。

https://melpa.org/#/?q=wgrep

*grep* bufferの grep-mode にhookして wgrep-setup を実行し、 wgrep-mode というminor modeを起動する。

(add-hook 'grep-setup-hook 'wgrep-setup)

類似機能に標準機能の moccur-edit があり、migemoとの連携も取れるようだ。 自分はmigemoユーザではないが将来的に試してみたい。

2. wgrep設定

defcustom としては以下だが、自分は特に設定していない。

変数名 (Variable)機能概要戦略的利用法
wgrep-auto-save-buffer変更適用完了時(wgrep-finish-edit)にバッファを自動保存するか 。大規模リファクタリング時、安全のため nil (手動保存)を維持するか、迅速な処理のために t に設定。
wgrep-enable-keywgrepモードを有効にするためのキーバインド 。ワークフローの摩擦を減らすため、単一キー(例: “r"や"e”)に設定することを推奨。
wgrep-change-readonly-fileバッファが読み取り専用であるかどうかにかかわらず、変更を強制的に適用するか 。VCSによって保護されたファイルを編集する場合に有効化。

デフォルトのkeybindは次のようになっている。

(unless wgrep-mode-map
  (let ((map (make-sparse-keymap)))

    (define-key map "\C-c\C-c" 'wgrep-finish-edit)
    (define-key map "\C-c\C-d" 'wgrep-mark-deletion)
    (define-key map "\C-c\C-e" 'wgrep-finish-edit)
    (define-key map "\C-c\C-p" 'wgrep-toggle-readonly-area)
    (define-key map "\C-c\C-r" 'wgrep-remove-change)
    (define-key map "\C-x\C-s" 'wgrep-finish-edit)
    (define-key map "\C-c\C-u" 'wgrep-remove-all-change)
    (define-key map "\C-c\C-k" 'wgrep-abort-changes)
    (define-key map "\C-x\C-q" 'wgrep-exit)

    (setq wgrep-mode-map map)))

3. 挙動の確認

minad-wareのaffeで実験すると次のようになる。

https://github.com/minad/affe

Step1. M-x affe-grep を実行する

Step2. 雑にgrepをかける

Step3. embark-act を起動しつつ embark-export する

Step4. C-c C-q でwgrep-modeに入り編集、 C-x C-s で保存すると変更される

得られた結果・所感

wdiredと双対をなすキラーアプリと言っても過言ではないくらい便利でもっと早く知りたかった。

今後の展開・検討事項

projectile からEmacs標準の project.el に移行したいと長年思ってたが、projectileのgrep/replace周りを使いたいしなーと思ってなんとなく移行できてなかった。 projectileを剥がして affe-grepaffre-find を使いつつ wgrep でよいなという結論がついたので次回は移行する記事を書く。