Clojure 初心者のための Emacs 設定作りました


2017/07/04 更新しました

  • MELPA-stable 以外を利用するパッケージを削除しました
  • use-package を利用し起動時間を 1 秒以下に抑えました
  • Windows へのインストール方法を記述しました

はじめに

Clojure で何かを開発する際に、数あるエディタの中から Emacs を使ってみたいと思う人は 数多く いると思いますが、元々他のエディタを使っていた場合全てを設定するのは容易ではないでしょう。
また最近では spacemacs や live-emacs などという最初から色々出来るよーみたいなプリセットが出てきていて、それを試している人がチラホラいたのでそういう需要もあるのかなと思って作ってみました。

Emacs config for newbie clojurian

インストール

Linux であれば以下のコマンドでインストールできます。

$ git clone --depth=1 https://github.com/ayato-p/emacs-config-for-newbie-clojurian.git ~/.emacs.d
$ cd ~/.emacs.d && make install

Windows であれば HOME というユーザー環境変数を追加した上で、以下のコマンドでインストールできます。

Set-Location $HOME
git clone --depth=1 https://github.com/ayato-p/emacs-config-for-newbie-clojurian.git .emacs.d
Set-Location .emacs.d
.\install.ps1

~/.lein/profiles.clj は特に設定する必要はありません。

解説

初心者用と言いつつ初心者じゃなくても使える便利なものを設定しておいたので、わりと誰でも使えると思いますが注意事項としては Clojure の開発に関わるものは設定したけどそれ以外はあまり設定していないというところです。例えばとても便利な Git クライアントである magit であるとか Git で変更した差分を見るのに便利な git-gutter などは設定しません。ちなみに一応初心者向けを謳っているだけあって、 Emacs の GUI 部分は残してあるのでファイルのセーブなどは上のメニューから実行できたりします(一応コードの中にコメントアウトしてあるコードを外せば全部消せるようにはなってる)。

init.el だけで完結していて、トータルの行数は 330 行くらいしかないので比較的ミニマルだと思いますし、 MELPA-stable を使うようにしているためバギーなバージョンは入っていません。

また Cask か el-get のようなサードパーティを使っていないので、比較的シンプルになっているのも特徴です。

使っているパッケージ一覧

exec-path-from-shell
use-package
bind-key
mykie
company ;; like auto complete
zenburn-theme

;; helm stuffs
helm
helm-projectile
helm-ls-git

;; for lisp
paredit
rainbow-delimiters
aggressive-indent

;; for clojure
clojure-mode
cider
clj-refactor

こんな感じですね。それぞれ簡単に説明しましょう。

projectile, exec-path-from-shell

git などで管理しているプロジェクト配下での諸々の操作が便利になります。とは言え、僕が主に使うのは helm-projectile 経由なので直接はあまり使ってないです。 exec-path-from-shell は PATH をシェルから引き継ぎます(これがないと Cider がコケる)。

use-package, bind-key, mykie

require の代わりに use-package を使っています。また、キーバインドの変更は bind-key もしくは mykie 経由で行っています。
C-u をプレフィックスとして設定するキーバインドの変更だけ mykie ですね。

company

最近 Clojure 界隈ではどうも auto-complete 離れが発生してきているようなので、 company-mode を採用しています。あと若干 Cider 使うなら company の方が補完窓に出てくる情報が多い。 Cider を起動して jack-in している場合 2 文字くらいタイプすると補完候補が出てきますが、 C-i で強制的に補完候補を表示させることができます。

helm, helm-projectile, helm-ls-git

anything の後継と言われていたものですね。 M-xhelm-M-x, C-u C-x C-fhelm-projectile-find-file, C-u C-u C-x C-fhelm-git-ls が設定されています。

paredit, rainbow-delimiters, aggressive-indent

paredit は括弧の対応を崩さないもので clojure-mode では自動的にオンにしています。
rainbow-delimiters 括弧を色分けして比較的見やすくしてくれます。
aggressive-indent は強制的に編集中のフォームのインデントを整理してくれるもので、これも clojure-mode で自動的にオンになっているので気にしなくても問題ありません。

paredit については初めてだと難しいかもしれないので、次のチュートリアルを参考にすると良いでしょう。
ParEdit チュートリアル

clojure-mode, cider, clj-refactor

clojure-mode は Clojure 書くときのモードで、 cider は Clojure 用のマイナーモードで clojure-mode を補うものです。 clj-refactor については後述します。

clj-refactor?

こんなことが簡単に出来るようになります。

主な機能は例えば (str/ まで入力したら、そのネームスペースに [clojure.string :as str] として自動的に require したり、上の gif アニメにあるように通常のフォームをスレッディングマクロを使うように変形させたり出来るようになります。また名前の通り、シンボルのリネームや関数の抽出などといったリファクタリング機能に加え、依存関係のホットロードということもできます。

他にも色々と出来ることが多いので clj-refactor.el の wiki を確認してみてください。 gif アニメ付きで説明されているので英語が分からなくてもなんとなく察することができると思います。

幾つかのキーバインド説明

多くは設定していませんが、簡単に書いておきます。

キーバインド 機能
C-i or TAB company モードの補完候補を表示
( company モードの補完候補が出ているときに) C-n / C-p 補完候補の選択
( company モードの補完候補が出ているときに) C-g キャンセル
C-u C-x C-f helm-projectile の find-file 実行
C-u C-u C-x C-f helm-ls-git の helm-git-ls 実行
C-u C-b helm-projectile の switch-to-buffer 実行
C-c M-j cider-jack-in
C-c C-j + ... clj-refactor の prefix キー が C-c C-j なのでその後コマンドを叩く (e.g. C-c C-j ar -> Add require to namespace declaration)

時間があるときに README あたりに整理したいと思います。 Cider や paredit などは設定変えてないので標準のコマンドが使えるので公式のドキュメントをあたるなどしてください。

エディタに思うこと

Clojure で何かを開発する際にエディタは何でも使えますよ、と僕はよく言いますが Vim には clj-refactor.el のようなものが未だなさそうなので Emacs の方が便利なんじゃないかなと思っています( Vim ユーザーの方で便利なプラグイン知ってる方は教えてください m()m )

個人的にこのプロジェクトに興味がありますが、試せる状況じゃなさそう…。
https://github.com/Deraen/vim-cider

参考

http://clojure-doc.org/articles/tutorials/emacs.html
https://github.com/clojure-emacs/cider#installation-via-packageel
https://github.com/clojure-emacs/clj-refactor.el