emacs + ag = ag.el
emacs 上で検索 → 編集するときの "検索" を高速化しよう! という話題です.
color-moccur + moccur-edit の代わりにag.el + wgrep を使います.
やりたいこと
emacs 上で
- あるディレクトリー配下をキーワード検索し,結果を表示
- 検索結果を直接編集 → もとのファイルに変更が適用される
moccur-grep-find
+ moccur-edit-mode
を使えばできます.かなり便利.
moccur-grep-find
が遅すぎる
color-moccur はgrep コマンドがない環境でも動きます.それはそれですばらしいのですが,遅すぎて使いにくい.
手元の3500 ほどのテキストファイルを検索するのに 60秒.無理.そんなに待てない.*1
M-x ielm *** Welcome to IELM *** Type (describe-mode) for help. ELISP> (benchmark-run 1 (moccur-grep-find "path_to/memo" '("pattern"))) (60.971513 44 0.7432170000000002)
ag.el + wgrep を使う
をload-path
に置く.もしくはMELPA を使って
M-x package-install
で
- ag
- wgrep
- wgrep-ag
をインストール.
なお,The Silver Searcher (ag
コマンド ) は別途必要です.
検索スピード
ag.el はサブプロセスとしてag
を呼ぶためbenchmark-run
しにくいのですが,1秒 程度で検索できます.
-*- mode: ag; default-directory: "path_to/memo/" -*- Ag started at Mon Jul 7 02:46:44 ag --color --color-match 30\;43 --literal --smart-case --nogroup --column -- pattern . (snip) Ag finished at Mon Jul 7 02:46:45
編集方法
wgrep を適切に設定しておくと,
- 検索結果バッファ上で
r
→ 編集できるように C-x C-s
(もしくはC-c C-e
orC-c C-c
) で検索元のファイルを更新M-x wgrep-save-all-buffers
で更新を保存
という操作ができます.
設定
参考までに,私の.emacs
:
; ag (setq default-process-coding-system 'utf-8-unix) ; ag 検索結果のエンコード指定 (require 'ag) (setq ag-highlight-search t) ; 検索キーワードをハイライト (setq ag-reuse-buffers t) ; 検索用バッファを使い回す (検索ごとに新バッファを作らない) ; wgrep (add-hook 'ag-mode-hook '(lambda () (require 'wgrep-ag) (setq wgrep-auto-save-buffer t) ; 編集完了と同時に保存 (setq wgrep-enable-key "r") ; "r" キーで編集モードに (wgrep-ag-setup)))
なお,
のようなエントリもありますが,私は基本custom-set-variable
使う派です.
今回setq
しているのは,ag.el やwgrep ドキュメントに "setq
使え" 的な記述があったため.