自分がgitで管理している.emacs.dのディレクトリ構造と設定を紹介します. 個別のファイルに分割した設定, 複数のPCで共有したい設定・したくない設定を見通しよく管理でき, pullしてemacsを起動するだけで環境を再現できるので便利です.
設定を構築するにあたってtaraoさんの.emacs.dを参考にさせていただきました. というより本質的な部分は丸々借りてきています.
必要なツール
- バージョン24以上のEmacs
- git - バージョン管理. 共有したいelispとそうでないものを管理する
-
el-get (要
el-get-bundle
を含むバージョン) - パッケージのダウンロードとインストールの自動化する - init-loader - elispを複数のファイルに分割して管理する
ディレクトリ構造
以下に中心となるファイルを示します. 人によっては他にel-get-user/recipes
やテーマファイルなどもgitで管理すると思います.
.emacs.d
├── .gitignore
├── init.el
├── inits
│ ├── .gitignore
│ ├── 00_el-get-install-packages.el
│ ... <gitで管理する他のelisp>
│ └── 99_local-init-load.el
├── local-inits
... <サイト固有のelisp>
ファイル
.gitignore
.emacs.d以下には色々なファイル・ディレクトリが作られますが、必ずgitで管理するのは上で挙げたinit.elとinits/そして.gitignore自身です.
*
# whitelist
!init.el
!inits/
!.gitignore
init.el
init.elでは次の処理を行います.1
- el-getのインストール・設定
- init-loaderのインストール・実行
このコードでは2.をpackage.elを使って実現しています. stable.melpa.orgのel-getにはel-get-bundle
が含まれていなかったので, package-pinned-packages
を設定してmelpa.orgからインストールするようにしています. また、package.elを使わない方法がel-getのREADME.mdに書いてありますので, そちらも確かめてみてください.
(when load-file-name
(setq user-emacs-directory (file-name-directory load-file-name)))
(add-to-list 'load-path (locate-user-emacs-file "el-get/el-get"))
(unless (require 'el-get nil 'noerror)
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-pinned-packages '((el-get . "melpa")))
(package-refresh-contents)
(package-initialize)
(package-install 'el-get)
(require 'el-get))
(add-to-list 'el-get-recipe-path (locate-user-emacs-file "el-get-user/recipes"))
(el-get-bundle! 'init-loader
(setq-default init-loader-show-log-after-init nil)
(init-loader-load))
(el-get 'sync)
inits/
gitで管理するelispを集めたディレクトリです. init-loader-load
がこれらのelispをロードします. elispのファイル名は数字2文字で始まる必要があり、ファイル名の辞書式順序でロードされます.2
00_el-get-install-packages.el
このelでパッケージを自動インストールします. 従ってこのファイルはそれらのパッケージが実際に使われる前にロードしなければなりません. そのため名前を00_xxxとしています. 内容としてはel-get-bundle
の羅列です.
(el-get-bundle flycheck)
(el-get-bundle ggtags)
(el-get-bundle multi-term)
(el-get-bundle powerline)
(el-get-bundle use-package)
...
99_local_init-load.el
ローカルなelispをロードします. この例ではlocal-inits/にelispを格納しています.
(init-loader-load (locate-user-emacs-file "local-inits"))
.gitignore
gitに99_local_init-load.elを無視させます.
*
!*.el
!.gitignore
99_local-init-load.el
local-inits/
gitで管理しないローカルなelispを格納します. こちらもelispをinit-loader-load
でロードするので, 数字2文字で始まるというファイル名の形式を守る必要があります. 無論このディレクトリの名前自体はサイト毎に自由に決められます.
運用
最初に書いたようにpushしてpullしてemacsを起動するだけです. 何か問題が発生する場合は, init-loader-load
のロード順序は適切か, 特にパッケージが適切な順番でロードされているか確認してみてください.
他にuse-package(Qiita記事)などもパッケージの管理を容易にしてくれるのでおすすめです.