counsel-projectile-ag を使う
the_silver_sercher(ag) を用いた全文検索を Emacs から使う場合に、 counsel-ag を使っています。検索の範囲は、現在のバッファ(ファイル)があるディレクトリ以下に自動的に設定されますが、ソースコードを読んでいる時には検索の範囲を、ソースコードが属しているプロジェクト全体に設定したくなります。
これは、 projectile.el の機能を使うことで可能です。 projectile を使えば、プロジェクトの範囲、すなわち、どのディレクトリ以下がプロジェクトなのかを特定できるので、その範囲に対して ag すれば良いわけです。そのための関数として counsel-projectile-ag があります。
私は下記の関数を C-M-f にバインドして使っています。 projectile が有効な場合には基本的に counsel-projectile-ag を呼び出し、それ以外では counsel-ag を呼びます。ただ、状況によっては projectile の影響下にあっても、プロジェクトのルートではなく、現在のファイルが位置するディレクトリ以下や、任意のディレクトリ以下を検索対象に設定したいケースもあるので、 dired している場合には counsel-ag を呼び出すようにしています。
なお、検索対象のディレクトリは、 M-o で呼び出すアクションで自由に変更できますし、 counsel-projectile-ag を使っている場合は、 M-o を経由すれば対象のプロジェクト自体を変更できます。
(defun my-counsel-projectile-ag ()
"Use `counsel-projectile-ag' in a projectile project except when `dired'.
Otherwise, use `counsel-ag'."
(interactive)
(if (or (and (eq projectile-require-project-root 'prompt)
(not (projectile-project-p)))
(eq major-mode 'dired-mode))
(counsel-ag)
(counsel-projectile-ag)))
counsel-projectile-ag こそ探していたものだった( ' -')b プロジェクトのルート以下を検索できる pic.twitter.com/SdUsYs7ywL
— たかさん (@takaxp) August 14, 2022

