Emacs での一括検索・一括置換まとめ

# はじめに
一括検索・置換のようなことをやろうとすると、
`moccur` や `all.el` といったキーワードはすぐに検索に引っかかるけれども、
まとまった記述を見つけられなかったので、
ここに改めてまとめてみることにした。

# 参考リンク
- [emacsで一括検索と一括置換 | miyazakikenji](http://miyazakikenji.wordpress.com/2014/02/02/emacs%E3%81%A7%E4%B8%80%E6%8B%AC%E6%A4%9C%E7%B4%A2%E3%81%A8%E4%B8%80%E6%8B%AC%E7%BD%AE%E6%8F%9B/ "emacsで一括検索と一括置換 | miyazakikenji")
- [Emacs で wdired と moccur-edit を使っていない人は(ry - Higepon’s blog](http://d.hatena.ne.jp/higepon/20061226/1167098839 "Emacs で wdired と moccur-edit を使っていない人は(ry - Higepon’s blog")
- [Emacsでmoccur-grepとmoccur-editからagとwgrepに移行したら爆速で快適すぎる - kotatu.org](http://kotatu.org/blog/2013/12/18/emacs-ag-wgrep-for-code-grep-search/ "Emacsでmoccur-grepとmoccur-editからagとwgrepに移行したら爆速で快適すぎる - kotatu.org")
- [all-ext.el:対象行を絞り込んでからまとめて編集するM-x allを超強化！occurと融合＆anything・helmと連携 - (rubikitch loves (Emacs Ruby CUI Books))](http://d.hatena.ne.jp/rubikitch/20130202/all "all-ext.el:対象行を絞り込んでからまとめて編集するM-x allを超強化！occurと融合＆anything・helmと連携 - (rubikitch loves (Emacs Ruby CUI Books))")
- [helm-c-moccurの代わりにhelm-occurを使うようにした - $shibayu36-&gt;blog;](http://shibayu36.hatenablog.com/entry/2013/10/19/191958 "helm-c-moccurの代わりにhelm-occurを使うようにした - $shibayu36-&gt;blog;")
- [Emacs - 最近のOccur modeについて - Qiita](http://qiita.com/ballforest/items/61eaa64429fc5313c1c9 "Emacs - 最近のOccur modeについて - Qiita")
- [EmacsWiki: color-moccur.el](http://www.emacswiki.org/emacs/color-moccur.el "EmacsWiki: color-moccur.el")
- [EmacsWiki: wdired.el](http://www.emacswiki.org/emacs/wdired.el "EmacsWiki: wdired.el")
- [mhayashi1120/Emacs-wgrep](https://github.com/mhayashi1120/Emacs-wgrep "mhayashi1120/Emacs-wgrep")

# シチュエーション別
## カレントバッファ
### `occur`
Emacs 24.1 以降の `occur` には編集機能がそもそも備わっているようなので、
あらためて拡張を入れる必要はない。

`occur` バッファで `e` を入力すると編集モードに移行する(`occur-edit-mode`)。
他のメジャーな拡張と異なる挙動として、**編集内容はそのまま元のバッファに反映されている。**
`C-c C-c` で編集を終了する(`occur-cease-edit`)。

### `color-moccur` + `moccur-edit`
`color-moccur` には `occur-by-moccur` という、
カレントバッファを対象に `moccur` を実行する機能があるので、
そちらを利用するという手もある。
個人的には、操作性の統一という面でこちらを使ったほうがいいと思う。

具体的な操作は「全バッファ」の項の `color-moccur` + `moccur-edit` と同じものが使える。

## 全バッファ
### `color-moccur` + `moccur-edit`
`M-x moccur` の結果バッファで `r` を押すと、編集可能になる。

編集を反映させるには `C-c C-c`、破棄するには `C-c C-k` を入力する。

編集を反映させても、直ちにファイルに変更が書き込まれるわけではなく、
**該当ファイルのバッファに変更内容が反映されるのみ。**

適宜 `save-some-buffers`(デフォルトは `C-x s`)を実行する等で変更を保存する必要がある。

## ファイル
`ag` と `wgrep-ag` の組み合わせが最も使いやすいと思う。

`ag` や `grep` の結果バッファで `C-c C-p` (変更可)を押すと、編集可能になる。

編集を反映させるには `C-c C-c`、破棄するには `C-c C-k` を入力する。

編集を反映させても、直ちにファイルに変更が書き込まれるわけではなく、
**該当ファイルのバッファに変更内容が反映されるのみ。**

## ファイル・ディレクトリ名
`wdired` が使える。

`dired` バッファで `r` を押すと編集可能になる。

ファイルやディレクトリのリネームはもちろん、
ファイル名に任意の相対・絶対パスを追加することで、移動も可能である。

編集を反映させるには `C-c C-c`、破棄するには `C-c C-k` を入力する。

こちらの編集は **即座にファイルシステムに反映される。**

# 実際の設定例
`occur` や `moccur` については、検索結果をリアルタイムで見られるように、`helm` インタフェースを使うように設定して使っている。

`isearch` で検索していたが一覧で見たくなったので、
`helm-moccur` で該当箇所を確認し、
編集したくなったら `moccur` バッファを開く、というようなフローを実現できるように設定している。

## occur, moccur 関連
- [dot-emacs/inits/22_moccur.org at master · yewton/dot-emacs](https://github.com/yewton/dot-emacs/blob/master/inits/22_moccur.org "dot-emacs/inits/22_moccur.org at master · yewton/dot-emacs")
- [dot-emacs/inits/25_helm-moccur.org at master · yewton/dot-emacs](https://github.com/yewton/dot-emacs/blob/master/inits/25_helm-moccur.org "dot-emacs/inits/25_helm-moccur.org at master · yewton/dot-emacs")

## wgrep 関連
- [dot-emacs/inits/25_wgrep.org at master · yewton/dot-emacs](https://github.com/yewton/dot-emacs/blob/master/inits/25_wgrep.org "dot-emacs/inits/25_wgrep.org at master · yewton/dot-emacs")

## wdired 関連
- [dot-emacs/inits/20_dired.org at master · yewton/dot-emacs](https://github.com/yewton/dot-emacs/blob/master/inits/20_dired.org "dot-emacs/inits/20_dired.org at master · yewton/dot-emacs")