読者です 読者をやめる 読者になる 読者になる

LGTM

Looks Good To Me

emacs + ag = ag.el

emacs 上で検索 → 編集するときの "検索" を高速化しよう! という話題です.

color-moccur + moccur-edit の代わりにag.el + wgrep を使います.

やりたいこと

emacs 上で

  1. あるディレクトリー配下をキーワード検索し,結果を表示
  2. 検索結果を直接編集 → もとのファイルに変更が適用される

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 を適切に設定しておくと,

  1. 検索結果バッファ上でr → 編集できるように
  2. C-x C-s (もしくは C-c C-e or C-c C-c) で検索元のファイルを更新
  3. 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 使え" 的な記述があったため.

*1:ちなみに,シェルからGNU grep で検索したら0.2秒ほど