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)))
amazon_banner_large
amazon_banner_small