@kyanny's blog

私は天才ではありません。ただ、人より長く一つの事と付き合っていただけです - アインシュタイン

Spacemacs の private configuration layers の作り方と使い方

Spacemacs は Emacs Lisp 拡張を Configuration Layers (レイヤー)という概念でまとめて扱う。

公開され広く使われるレイヤーとは別に、自作レイヤーを私的に使うこともできる。このような Private Configuration Layers は ~/.emacs.d/private ディレクトリ以下に配置するのが慣例のようだ。

Private Configuration Layers の作り方は https://github.com/syl20bnr/spacemacs/blob/master/private/README.md に書いてある。このファイルは ~/.emacs.d/private/README.md と同一。

SPC SPC configuration-layer/create-layer RET

実行すると指定したディレクトリ以下に雛形が作られる。レイヤー名を xyz とした場合に作られる雛形の packages.el は以下の内容。

あとは packages.el の中に説明があるのでその通りにすれば良い...のだが、初見ではきつい。幸い、 Private Configuration Layers の完全に動作するサンプルを公開している人がいるので、それをお手本にすると良い。

自作パッケージを自作レイヤーを介して利用する

このようなディレクトリ配置になる。

$  ~ tree ~/.emacs.d/private
/Users/kyanny/.emacs.d/private
├── my-layer
│   ├── local
│   │   └── my-mode
│   │       └── my-mode.el
│   └── packages.el

5 directories, 7 files

レイヤー名・パッケージ名・ディレクトリ名・ファイル名などを合わせる必要がある箇所がいくつかあるので注意。

  • ~/.emacs.d/private/my-layer/local/my-mode/my-mode.el の中で (provide 'my-mode)
  • ~/.emacs.d/private/my-layer/packages.el の中で (defconst my-layer-packages '( (my-mode :location local)))
    • defconst のかわりに setq でも可
  • ~/.emacs.d/private/my-layer/packages.el の中で (defun my-layer/init-my-mode () (use-package my-mode))

あとは ~/.spacemacs 内の dotspacemacs-configuration-layers の中にレイヤー名を追記して SPC f e R でリロードすればレイヤー(とレイヤー内で指定したパッケージ)が利用できるようになる。

   dotspacemacs-configuration-layers
   '(
     my-layer
     )

別解(既存のパッケージを自作レイヤーを介して利用する)

Creating a Spacemacs Layer from an Existing Emacs Package

ただ、この場合は dotspacemacs-additional-packages に追記するだけで解決しそう。

さらに別解(自作パッケージをレイヤーを介さずに利用する)

Creating packages in Spacemacs for the programmer in a hurry | Dal Blog

~/.emacs.d/private/local 以下にパッケージを配置する方法。 ~/.emacs.d/private 以下のディレクトリ構造は紛らわしくてわかりづらいが、このエントリは非常にわかりやすい。

その他

~/.emacs.d/private 以下を公開している人もいる。