2015年のEmacs

その昔、自宅PCにLinuxをインストールして頑張っていた頃はEmacsを使っていたり、その延長で職場でもMeadowやxyzzyなどを活用していたものですが、Eclipseを使い始めてからめっきりEmacsから離れてしまっていました。

ところがここ最近、MacBookを使い始めたり、仕事柄サーバのメンテナンス等でターミナルを使う機会が圧倒的に増えたり、周囲の影響もあったりして久しぶりにEmacsに復帰してみることにしました。Emacsをちゃんと使うのは10年ぶりくらいですが、同僚のEmacserに教えてもらいながら環境を整備してみました。

パッケージをインストールするための準備

最近のEmacsはmeplaというリポジトリからパッケージをインストールできるようです。~/.emacs.d/init.elに以下を書いておきます。

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

するとこんな感じでパッケージをインストールできるようになる模様。

(unless (package-installed-p 'helm)
  (package-refresh-contents) (package-install 'helm))

テーマで外観をカスタマイズ

最近のEmacsはカラーテーマで外観をカスタマイズできるようです。

(unless (package-installed-p 'atom-dark-theme)
  (package-refresh-contents) (package-install 'atom-dark-theme))

(load-theme 'atom-dark t)

若者っぽくAtomっぽいテーマにしてみました。Emacsが一気にモダンな感じになります。

Scala開発環境としてのEmacs

仕事ではScalaを書いているのでScalaの開発環境を整備する必要があります。Emacsだとscala-mode2とEnsimeを使うのがいいみたいです。インストールはQiitaのこの記事などが参考になります。使い方はこのへんを参照。

デフォルトだとScaladocコメントの自動補完の挙動が微妙だったので以下の設定を追加しています。

(add-hook 'scala-mode-hook 'my-scala-mode-hook)
(defun my-scala-mode-hook ()
  (setq scala-indent:use-javadoc-style t))

ちなみにEnsimeはEmacs専用というわけではなく、SublimeText、Atom、vim用の拡張も提供されているのでEmacsをお使いの方以外も「普段使っているエディタでScalaを書きたい!」という方はチェックしてみるといいかもしれません。

helmでなんでもインクリメンタルサーチ

helmはEmacs上でいろんなものを絞り込み検索することができる拡張で、anything.elの後継のようなものらしいです。

(unless (package-installed-p 'helm)
   (package-refresh-contents) (package-install 'helm))

(require 'helm)
(helm-mode 1)
(define-key global-map (kbd "C-x C-o") 'helm-mini)

(helm-mode 1)を書いておくとC-x C-fでファイルを開くときや、M-xでコマンドを実行するときなど様々な箇所でhelmによる絞り込み検索が使えるようになります。helm-miniは様々な候補リストを統合的に表示して絞り込み検索できるインターフェースで、どのような候補を表示するかは設定でカスタマイズ可能です。

helm-ls-gitを入れるとGit管理されているファイルを絞り込み検索できたり、helm-agを入れるとagの結果を絞り込み検索できたりして非常に便利です。

(unless (package-installed-p 'helm-ls-git)
  (package-refresh-contents) (package-install 'helm-ls-git))

(unless (package-installed-p 'helm-ag)
  (package-refresh-contents) (package-install 'helm-ag))

ag自体は別途Homebrewでインストールしておきます。今までgrepするときはM-x rgrepしていたのですが、agはドットディレクトリの中身はデフォルトで検索対象から外してくれるなど気が効いています。

$ brew install ag

できれば開いているScalaソースのフィールドやメソッド一覧をhelmで絞り込み検索できたりすると最高っぽいのですが、今後の研究課題です。

gitの操作もEmacsで

Emacsを使っているからにはgitの操作もEmacsで完結したいものです。magitを入れるとEmacs上で様々なgit操作が可能になります。

(unless (package-installed-p 'magit)
  (package-refresh-contents) (package-install 'magit))

基本的にはM-x magit-statusで表示できるステータス画面から様々な操作を行います。コミットの履歴をグラフ表示できるなどかなり高機能ですし、最初は取っ付きが悪いですが基本的な操作方法さえ覚えれば細かい操作は画面にガイドが表示されるのでさほど迷うことはないのではと思います。

複雑な操作はgitコマンドやGUIクライアントを使ってもいいですし、コミットやプッシュといった日常的な操作がEmacsで完結するだけでもかなり快適になりますね。

ace-jumpでどこにでも一発ジャンプ

vimには画面で見えているどの場所にも3キーストロークで移動できるというeasymotionという拡張機能があるそうなのですが、ace-jumpを使うとEmacsでも同じことができます。

(unless (package-installed-p 'ace-jump-mode)
  (package-refresh-contents) (package-install 'ace-jump-mode))

(require 'ace-jump-mode)
(define-key global-map (kbd "C-c SPC") 'ace-jump-mode)

文章だと説明が難しいのですが、C-c SPCを押してミニバッファで移動したい場所の文字を入力すると該当の箇所にポインタとなる文字が表示されるので、そのキーを入力するとそこにジャンプできるというものです。このキーバインドだとC-cがあるので4ストロークになってしまうのが欠点です。

ツリー型のファイルマネージャ

目的のファイルを開くときはhelmを使えばよいのですが、プロジェクト全体を俯瞰したい場合やファイルやディレクトリの操作を行いたい場合はhelmや標準のdiredだけだとちょっと不便です。できればツリー状のファイルマネージャが欲しいと思い探してみたところいくつか見つかったのですが、試してみたところneotreeがよさそうです。

F8でトグルするようにしてみました。

(unless (package-installed-p 'neotree)
  (package-refresh-contents) (package-install 'neotree))

(require 'neotree)
(global-set-key [f8] 'neotree-toggle)

そういえば昔はspeedbar使ってたなーと思い出して懐かしい気持ちになりました。

Atomのツリーペインみたいにgitのステータスによってファイルの色が変わったりすると素敵なんですが…。

ウィンドウのリサイズを簡単に

EmacsではC-x 2やC-x 3でウィンドウを分割できるのですが、分割したウィンドウのサイズの変更はデフォルトではかなり変態的なキーバインドに割り当てられています。ググってみたところQiitaにこんな記事を見つけました。C-c C-rでウィンドウサイズ変更モードに入り、h、j、k、lでサイズ調整ができるようになります。

もちろんこの他にも使用するプログラミング言語のためのメジャーモードをインストールしたり、タブ幅など細かい設定を加えています。ここ数週間Emacsでコーディングしているのですが、ようやく以前の勘を取り戻してきた感があり、IntelliJを使わなくても大抵のことは困らない状態になってきましたが、同僚の変態vimmerにインスパイアされ、日々Emacs環境の研究を重ねる日々が続いています。