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

projectileのコマンドを他のプロジェクトに対して簡単に実行する

Emacs

最近のEmacs事情に詳しくないのですが、みなさんはprojectileお使いなのでしょうか?
僕の環境では目下のところ、第一線で活躍しています。
そんなprojectileですが、以前から不満に思っていたことがありますて。

例えば、

  • 参照用にあのプロジェクトのあのファイル開きたい
  • あのプロジェクトからこのキーワードを含むファイルをgrepしたい

とか思った時に、それを簡単にできる方法が提供されてないっぽいのです。

projectileのコマンドは軒並み、「カレントバッファが属するプロジェクト」を対象としていて、
「対象のプロジェクトを切り替える」インタフェースが見つかりませんでした。
(例えば、「前置引数付きだったらプロジェクト選択フェーズを挟む」みたいな)

projectile-switch-project というコマンドはありましたが、
projectile-switch-project-action に設定されている関数を実行するようになっていて、
普段使うのには向かない感じでした。

なので、上記のコマンドを使って、現在のプロジェクト以外のプロジェクトを対象にして
projectileのコマンドを実行するための設定を書いてみました。

(defmacro my:projectile-defun-in-other-project (command)
  `(defun ,(intern (format "my:%s-in-other-project" command)) ()
     (interactive)
     (let ((projectile-switch-project-action
            (lambda ()
              (call-interactively ',command))))
       (projectile-switch-project))))

;; 他プロジェクトを対象に実行したいコマンド毎に以下を記述
;; (my:projectile-defun-in-other-project コマンド名)

;; 例えば、projectile-agなら、
(my:projectile-defun-in-other-project projectile-ag)

上記を評価すると、対象のプロジェクトを選択するフェーズを挟んで projectile-ag を実行する
my:projectile-ag-in-other-project というコマンドが定義されます。

あとがき

ちなみに、 helm-projectile のコマンドにも使えました。
つーか、本家にホントに無いのかなぁ... みんなに必要な機能だと思うのだけど。
あと、コマンド数分記述しないといけないので、これでもまだダルい。
projectile-switch-project あたりをもうちょい上手いこと実装するのが一番だと思うんだけど、
ソースを把握できてないから、本家にプルリクは思い留まってます。

もっと良い方法とか、本家に機能ありますとか、知ってる人いたら教えて欲しいですぅ