つうさにメモブログ

つうさにがメモをブログとして書いていくところ

Spacemacs触ってみた

EmacsのStarter Kitの一つであるSpacemacsを試してみました。

この記事では他人のinitファイルをお試しする方法についてもメモしています。

EmacsのStarter Kit

これ(Emacs Wiki)とかこれ(WikiEmacs)とかを参考にしてください。要するに、使いやすいEmacsの設定ファイル(Starter Kit)を公開してくれている方々がいて、それを使えばEmacsの設定が楽に済み、Emacsがより便利になるかもしれないということです。Spacemacsが有名だと思いますが、他にも色々あるみたいです。

個人で.emacs.dをgithubなどに公開している方も多いと思いますが、それらを使ってみるより、Starter Kitは普通多くの人に保守されていますから、(エラーに遭遇しにくいという意味で)安全に使えると思います。

EmacsEmacs lispによってとてつもなく拡張できるので、Starter Kitで設定したEmacsは素のEmacsとはだいぶかけ離れているかもしれません。しかし、Starter Kitの開発者は利便性を追求しているはずなので、素のEmacsより何倍も便利になっているはずです。なにより、自分で設定を書く手間が省けるのがいいです。

ダウンロードした.emacs.dを試してみる

git cloneなどで.emacs.dを用意したら、それを試すにはどうすべきでしょう。いくつか方法はあります。

  • 方法1 現在の.emacs.dをバックアップして、置き換えてEmacsを起動する。
  • 方法2 先頭にuser-emacs-directoryの設定を加えて、emacs -q -l /path/to/starterkit/.emacs.d/init.elする。
  • 方法3 環境変数HOMEを変更してEmacsを起動する。
  • 方法4 playground.elを使う。

ちなみに、Emacsのinitファイルが.emacs.emacs.elではなく.emacs.d/init.elであることを想定しています。個人的にEmacsのinitファイルは~/.emacs.d/init.elにするのがいいと思います。参考: tadsanさんの記事

方法1 現在の.emacs.dをバックアップ

一番直感的な方法だと思います。

$ cd ~
$ mv .emacs.d .emacs.d.bak

のようにしてから、試したいStarter Kitの.emacs.dを~/.emacs.dにコピーします。

これでいいんですが、試す時や試し終わった時にいちいち入れ替える必要があるので面倒です。

方法2 先頭にuser-emacs-directoryの設定を追加

これは、taraoさんのel-getについての記事で紹介されているものです。個人のinit.elを試しあう際に、

(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

を皆がinitファイルの先頭に書いておけば

$ emacs -q -l /path/to/.emacs.d/init.el

でinit.el試せて楽だよね、というものです。

emacsはオプションとして-q(initファイル非読み込み)、-l file(fileを読み込んで起動)があります。これだけ聞くと別に上のS式の追記をしなくても、emacs -q -l path/to/.emacs.d/init.elしとけば他人のinitファイルを試せるじゃんと思われますが、Emacsは例えばパッケージのインストール、読み込みなどで変数user-emacs-directoryを使います。上を追記しないと、user-emacs-directoryは~/.emacs.dを見てるため、元の.emacs.dとごっちゃになってしまうのでまずいのです。

ただ、この方法はこれが設定されてないinit.elに対してはわざわざ書き込むことになるので面倒です。

方法3 環境変数HOMEを変更

自分はこの方法で試しています。emacs環境変数HOMEにある.emacs.dを見るので、HOMEをemacs実行時にSterter Kitの.emacs.dがあるディレクトリにしてやります。bashなら環境変数を書き換えつつ実行するには

HOME=/path/to/starterkit emacs

のようにします。これで自分の環境を汚さず、initファイルの書き換えもせずに試すことができます。

ただし、この方法にも欠点があり、それはemacsの中で~が/path/to/starterkitと解釈されることです。例えばM-x find-file ~/.emacs.d/init.elで開かれるファイルはStarter Kitのinit.elです。真のホームディレクトリを見たいならフルパスを打ち込みましょう。

方法4 playground.el

上でリンクを貼ったWikiEmacsでの説明で書かれていて知りました。私は使ったことがありませんが、紹介だけしておきます。

playground.elは他所の.emacs.dを試すためのelispパッケージです。HOMEがどうのと書かれているので中身としては3の方法を行ってくれているものだと思います。

  • M-x playground-checkoutで、自分でcloneしたものやパッケージ内に書かれているメジャーなStarter Kit、またURLを入力してinitファイルを試すことができます。これはHelmインタフェースに対応しています。
  • M-x playground-persistで、読み込むinitファイルを指定してemacsを起動する実行ファイル(シェルスクリプト)を作ってくれます。

とても便利そうなので、他人のinitファイルを試すならこれを使うといいかもしれません。

Spacemacs

本題のSpacemacsです。これを使うと相当Emacs魔改造されます。インストール方法はREADME.mdを見ればわかると思います。.emacs.dを置き換えるだけです。また上の方法3でお試しできます。

初期設定としてvimスタイルかemacsスタイルかなどを聞かれます。スタイルについてはvimを選択することをオススメします。なぜならSpacemacsの名前の通りspace barによるコマンドのアクセスがSpacemacsをいい感じにさせてるところだと思うからです(ちなみに、emacsスタイルにするとM-mがその役割となります)。初期設定を済ませると、.spacemacsが生成されます。初回はパッケージのインストールなどで結構時間がかかると思います。

使ってみてすごいと思ったところ

いくつか列挙してみます。

見た目がかっこいい!

f:id:tsuu_mmj:20180902150221p:plain
Spacemacsのsplash screen

spacemacsのテーマがダークでいい感じです。カスタマイズされたモードラインもかっこいいです。splash screen(スタート画面)が中央に並んでいて綺麗で、かつrecentファイルなどが表示されて便利だと思います。

evilすごい

vi(m)のキーバインドemacs上で再現しています。hjklでのカーソル移動とか、iでinsert stateに変更とか、/でインクリメンタルサーチとか。もちろんevilが有効だとC-nとかC-pは違う意味になるので注意しましょう。evilについてはtaraoさんのevilについての記事が詳しいです。4編あるみたいです。

ちなみにSpacemacsはHelm/Ivyのキーバインドとかもvim風に設定してくれていてC-j、C-kで上下移動ができます。本気でEmacsキーバインドとはおさらばですね。

spaceの楽さとわかりやすいキーバインド, which-key

普通のEmacsではspace barはもちろんspaceを入力するキーですので、キーバインドを設定しません。しかし、stateの概念があるevilなら、normal stateの時space barキーバインドとして設定できます。Spacemacsではvimスタイルの時space barキーバインドのエントリーポイントとして様々なコマンドを呼び出せます。space barは何と言っても押しやすいので、これに適していると思います。file関連なら"SPC f"、buffer関連なら"SPC b"、window関連なら"SPC w"とわかりやすいのもいいです。

f:id:tsuu_mmj:20180902150345p:plain
which-keyによるキーバインドのヒント

また、キーバインドを覚えてなくてもwhich-keyが教えてくれます。私は元のEmacswhich-keyをインストールして使っていますが、C-xとかではほとんど見ていません。なんせ割り当てられているキーバインドが多すぎて1ページ分に表示できていないからです。しかし、Spacemacsでは、frameを横幅に広い状態で使えばちゃんとすべて表示してくれます。これはとてもありがたいことで、キーバインドを覚えていなくてもストレスなくキーバインドでコマンドを呼び出せます。

restart-emacsのresume-layout機能

これは不意打ちでびっくりしました。"SPC q"でEmacsの終了に関するコマンドにアクセスできます。そこにrestart-emacs-resume-layoutsというコマンドがありました。restart-emacsEmacsを再起動するのみでwindow構成などを復元する機能は持っていません。Spacemacsはrestart-emacspersp-modeの組み合わせで、再起動時にレイアウトの復元機能を提供するコマンドを定義しているようです。パッケージの設定だけではなく、便利な関数をを定義してくれているとは驚きました。

Spacemacsを触ってみて

かなり完成度が高いStater Kitだと思います。貧弱な素のEmacsから様々な設定をしてくれていて、さらにevilとの組み合わせで最高のエディタにするというコンセプトは素晴らしいと思います。ただ、私は乗り換えようとは思いませんでした。

なぜなら、

  • すでに自分のinitファイルがあり、それを結構気に入っている。
  • Emacs Lispを書くのが好き。
  • vimキーバインドが慣れない。

私はもう既にEmacs中毒者で結構EmacsキーバインドとかEmacs lispに慣れてしまっているので、Spacemacsで魔改造されたEmacsに移るのは結構ハードルが高いと思いました。また、同じEmacsとはいえ、それらを切り替えながら同時に使うのもなかなか難しいと思います。

終わりに

私は自分の育てたinitファイルを捨てられませんでしたが、初心者の方やinitファイルに凝っていない方にはSpacemacsはとてもオススメなので使ってみてください。