概要
ghqでリポジトリを管理し、fzfやpecoでそのディレクトリを簡単に移動できるのはとても便利ですが、同じようなことをEmacsでも行う方法です。
これまでも、Emacsの補完機能と組み合わせたemacs-lispで、これを実現する方法が提供されています。
- GitHub - masutaka/emacs-helm-ghq: ghq with helm interface
- GitHub - uwabami/ido-ghq: ghq with ido
- GitHub - analyticd/ivy-ghq: Navigate to ghq managed git repos quickly using ivy Emacs package
ただ、EmacsにはProjectileというプロジェクト管理の便利なパッケージがあるので、そこでghqの管理するリポジトリ一覧を使いたいなと思いました。
設定
Projectileとghqを設定した上で、以下の設定を追加するだけです。ghqで管理するリポジトリ一覧をProjectileから使えるようになります。Projectileの標準的な設定ならプロジェクト切り替えは "C-c p p" です。idoやivyなどが設定されていれば、この切り替えに補完インターフェースも機能します。
(when (executable-find "ghq")
(setq projectile-known-projects
(mapcar
(lambda (x) (abbreviate-file-name x))
(split-string (shell-command-to-string "ghq list --full-path")))))
ただ、とても簡単なコードなので、ghqで管理していないものは一切利用できなくなります。また細かいところですが、Emacs起動中にghqで新規にリポジトリを用意した場合、それを自動的に検知してくれたりはしないです。
おまけ
Projectileは特定のプロジェクト配下に限定してfind-file ("C-c p f")したり、grep ("C-c p s g")したりできます。以下は、use-packageを使った場合の設定例です。
;; projectile
(use-package projectile
:ensure t
:diminish
:custom
(projectile-switch-project-action 'projectile-dired)
:config
(projectile-mode +1)
(when (executable-find "ghq")
(setq projectile-known-projects
(mapcar
(lambda (x) (abbreviate-file-name x))
(split-string (shell-command-to-string "ghq list --full-path")))))
:bind-keymap
("C-c p" . projectile-command-map))