この記事は CAMPHOR- Advent Calendar 2014 の13日目の記事です。
@ivstivs と申します。CAMPHOR-だと少数派のEmacsを使ってる人です。
今回はEmacsで割と統合的なプロジェクト管理を実現するProjectileについて、Helmという拡張と一緒に簡単に紹介してみようと思います。
Projectileとは?
ざっくり言うと汎用的なプロジェクト管理をEmacsで行うための便利機能いっぱいなパッケージです。ちなみに、projectileという単語自体は手元の英和辞書を引いてみますと「砲弾・石などの発射物、あるいはロケットなどの自動推進体」とかあります。
公式ページのREADMEを見るとわかるように個別の機能の数は多いのですが、だいたいの所次のようにまとめられると思います。
- Gitや主要なプロジェクト管理ツールを自動認識
- 例えば手元のGitリポジトリ下のファイルを開いたとします。Projectileはその時点で自動的にルートディレクトリ等を認識し、そのプロジェクト内のファイルに絞った操作を行えるようになります。
そのプロジェクト内で最近開いたファイルを開くとか、プロジェクトのテストを再実行するとか。一度開いたプロジェクトのルートディレクトリは記憶してくれているので、プロジェクト単位での管理もしやすい感じです - 対応するファイルを簡単に開ける
- 「Hoge.cに対してHoge.hを開きたい」というような場合や「Testコードと実装コードを行き来する」といった、あるファイルと実装上関連があるファイルを開く操作に対して強いです。
特段設定の必要なくプロジェクトごとに編集作業ができるので、Projectile単体で十分利用価値があるのですが、さらにHelmという拡張機能と組み合わせるとより使い勝手がまします。
Helmとは?
Emacsでの操作全般を効率化する非常に強力な拡張です。
基本的にはHelmは「操作対象(ファイル、ディレクトリ、コマンド)について、統一された見た目で表示・検索が可能」・「いちいち個別にキーバインド覚えてやらなければならない操作を減らす」という2つの特徴があると私は考えています。
例えばEmacsには標準でrecentfという「最近開いたファイルを開く」的拡張があるのですが、これをHelmでラップしたhelm-recentfは以下のように利用できます。
- まずC-x rで最近開いたファイルの一覧を表示
- インクリメンタルに絞込み
- その後Tabでそのファイル等に対して行える操作を表示
- ここでは「違うWindowで開く」を選択してファイルを別ウインドウで表示
ということを行います。「ファイルを消すときのコマンドとかなんだっけ?」とか考えなくても「とりあえずファイルを選んでTabを押してみる」ということができて効率的かな、と思ってます。
ProjectileとHelm
で、ようやっと本番です。Projectileでは、標準で主要な機能はHelmから扱えるようになってます。
Projectileのインストール
まずは、MELPAでProjectileを入れて以下のように設定しましょう。
(projectile-global-mode)
(setq projectile-completion-system 'helm)
(helm-projectile-on)
3行です。簡単です。
具体的なコマンド
あとは参考文献とか読みながら色々試してみると良いと思いますが、具体的にいくつか紹介しておこうと思います。
以下、「<操作内容>(<コマンド名>、<デフォルトキーバインド>)」の書式で紹介していきます。
- ファイル表示(helm-projectile-find-file、C-c p f)
- 基本の基本で特に説明することもあんまないはずですが、実はProjectile独自(?)の機能がありまして、複数ファイルを一気に開けるというのがあります。
開きたいファイルをC-SPCで選択後、後はRETすると全部開けます。図では2つのファイルを選択しています(緑にハイライトがかかっている)。 - プロジェクトで最近開いたファイルを表示・開く(helm-projectile-recentf、C-c p e)
- そのまま。地味に重要
- プロジェクト内のファイルにGrep(helm-projectile-grep、C-c p s g)
- Helmのインターフェイスでプロジェクト内のファイルにGrepかけられます。agとかも使えるようです。
- 主要なコマンドを全部実行した状態で表示(helm-projectile、C-c p h)
- いちいちキーバインド覚えてられないわ! って人向け(多分)。ここで実行されるコマンドは変数で設定できます。
まとめ
Projectile(+Helm)の触り部分を紹介しました。
すんごいリッチな環境でがっつり開発するんだったらIDE立ち上げればいいと思うんですが、そうでもないときには意外と気軽に試せて使い心地の良い拡張なんじゃないかなぁと思います。Emacs使って開発するようなことがある方はぜひ。
参考
Projectile公式
本家。使い方まではそれなりに書いてあるが、具体的な設定方法とかがちょい弱い
Exploring large projects with Projectile and Helm Projectile
ProjectileをHelmで利用してできることについてかなり具体的な内容がまとまってます。