2020年12月13日

counsel-projectile-switch-project で neotree を開くようにした

neotree には

(setq projectile-switch-project-action 'neotree-projectile-action)

とすることで、 Projectile でプロジェクトを切り替えた時に neotree を起動するというオプションがある。

設定当時、結構この挙動が気に行ってたんだけど 気付いたらそういう挙動をしなくなっていて その代わりに find-file 的な挙動をするようになっていた。

で、その挙動をされると、絞り込みが結構だるい。 何しろプロジェクト以下のファイル全部が候補になるので。

というわけで、自分としてはプロジェクトの切り替えの後は Rails のプロジェクトなら projectile-rails の機能で絞り込みをするとか org-mode のリポジトリなら find-file するとか 自分に選択権がある状態にしたかった。

で、原因を調べてみると projectile-switch-project ではなく counsel-projectile-switch-project を使うようになってるから 記事冒頭に書いた設定が活かされない、というのに気付いた。

もはや ivy に飼い馴らされて来ている体を持つ者としては counsel-projectile-switch-project は手放せないので そっちで動かしても基本的には neotree が動くようにしたらいいよねってことで対応した

まず counsel-projectile-switch-project

(defun counsel-projectile-switch-project (&optional default-action)

https://github.com/ericdanan/counsel-projectile/blob/06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b/counsel-projectile.el#L1455

という感じで default-action を指定できるので、

(counsel-projectile-switch-project 'neotree-dir)

とかすれば良いだろうと考えて実行すると

(error "Action not found: neotree-dir")

とか怒られた。

原因を調べると

https://github.com/ericdanan/counsel-projectile/blob/06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b/counsel-projectile.el#L99-L125 に書いてるように どうも、action-list に登録されてない action は実行されないようになってるらしい。

じゃあ追加したらいいよね〜っってことで counsel-projectile-remove-current-project という変数を調べると defcustom で定義されている

https://github.com/ericdanan/counsel-projectile/blob/06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b/counsel-projectile.el#L1214-L1269

個人的には Customize で設定した情報は普段設定を書き込んでるファイルから遠い位置に書き込まれるので あんまり好きじゃないんだけど 今回に関しては Customize じゃない方法で変更しているとだるそうだったので Customize 画面から neotree-dir を counsel-projectile-remove-current-project に登録。

すると無事 counsel-projectilw-switch-project が動くようになってハッピー。 ってのが以下の Pull Request

https://github.com/mugijiru/.emacs.d/pull/183

あと、まだ ivy リキが足らなくて default じゃないアクションを動かす方法を気にしてなかったんだけど M-o でコマンドリストが出るのね。便利そう。

ただ確実にその操作忘れるので posframe のどこかにその情報残したいなって気持ちになったので 宿題としておく。

posted by 麦汁 at 14:17 | Comment(1) | emacs | このブログの読者になる | 更新情報をチェックする