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