コンテンツへスキップ

el-init なるものを作っています

2012/12/30

前書き

自分は Emacs を使い始めてからというもの、
いろいろな人のブログや web サイトなどを参考に
いろいろなコードを自分の設定ファイルに取り込んできました。

設定ファイルは、拡張機能やプログラミング言語、ジャンルなどによって
ファイルを分割し、init-loader によって管理してきました。

結果、分割された設定ファイルはいつの間にか 190 個を超えていて、
設定ファイルごとの依存関係や適切なロード順を
ファイル名の番号で整理するのは徐々に困難になって行きました。

また、設定ファイルをバイトコンパイルすると他の設定ファイルが
ロードされること前提で書かれているコードが警告を受けて、
重要な警告が覆い隠されてしまうことも多々ありました。

そういうことがあったので、
番号とは違う形でのロード順の決定法や、
設定ファイルごとの依存関係の明示ができるようにならないかと考え
el-init を書きました。

el-init って?

el-init とは、特定のディレクトリ下にある emacs の設定ファイルを
ロードするための emacs lisp です。

こんなかんじで使用します。

(require 'el-init)
(setq el-init:load-directory-list '("base" "pkg" ("ext" t)))

(el-init:load "~/.emacs.d/inits")

ねらい

設定ファイルの大雑把なロード順の指定と
設定ファイルごとの依存関係を明示的に表現することが主なねらいです。

設計

ロード順

段階的なロード順の指定は、ディレクトリを分けることで表現します。
el-init では段階的なロード順をロードするディレクトリのサブディレクトリとして
表現します。

  • 何よりも先にロードされて欲しい設定ファイル
  • パッケージマネージャの初期化用の設定ファイル
  • 各拡張機能用の設定ファイル

のような、大雑把なくくりを表現します。

依存関係

設定ファイルごとの依存関係を表現するために
el-init では require と provide を使用します。

各設定ファイルは provide 式を記述し、
依存する設定ファイルがある場合は、
require を使って依存する設定ファイルが読み込まれるようにします。

require と provide を使う関係上、
ロード対象のディレクトリはすべて load-path に追加されることになります。

インストール

コードは github から取得できます。

使い方

例えば ~/emacs.d/inits が次のようなディレクトリ構成になっているとします。

▾ inits
  ▾ base
      init-encode.el
  ▾ ext
    ▾ anything
        init-anything.el
    ▾ org-mode
        init-org-mode.el
        init-org2blog.el
  ▾ pkg
      init-el-get.el
      init-elpa.el

それぞれのサブディレクトリとその中にある設定ファイルの意味は次のようだとします。

ディレクトリ 設定ファイルの目的
base どの設定ファイルよりも先に読み込まれて欲しい設定ファイル群
ext 拡張機能用の設定ファイル群
pkg パッケージマネージャ用の設定ファイル群

この時、

  • まず inits/base ディレクトリ下の設定ファイルをロードし、
  • 次に、inits/pkg ディレクトリ下の設定ファイルをロードし、
  • 最後に、inits/ext ディレクトリ下(サブディレクトリ下も含む)にある設定ファイルをロードする

という動作を el-init で行いたいとします。

その場合には init.el などに次のように記述します。

;; ロードパスの設定は適宜読み替えてください
(add-to-list 'load-path "path/to/el-init")

(require 'el-init)
(setq el-init:load-directory-list '("base" "pkg" ("ext" t)))

(el-init:load "~/.emacs.d/inits")

では、詳しく見て行きましょう。

ロードパスの追加

el-init は設定ファイルローダなので、
大抵はパッケージマネージャなどの恩恵を受ける前にロードすることになるでしょう。
従って、ロードパスを手で追加します。

;; ロードパスの設定は適宜読み替えてください
(add-to-list 'load-path "path/to/el-init")

el-init をロード

require で el-init をロードします。

(require 'el-init)

ロードするサブディレクトリを指定

ロードするサブディレクトリとその順序を指定します。

(setq el-init:load-directory-list '("base" "pkg" ("ext" t)))

el-init:load-directory-list にはサブディレクトリ名を記述します。
リストの先頭にあるサブディレクトリから順にロードされます。
サブディレクトリ内を再帰的に探索して欲しい場合は

("ext" t)

のように、

(サブディレクトリ名 t)

の形で記述します。

ロード

目的のディレクトリの指定されたサブディレクトリ内のファイルを順にロードします。

(el-init:load "~/.emacs.d/inits")

この場合は、

  1. ~/.emacs.d/inits/base
  2. ~/.emacs.d/inits/pkg
  3. ~/.emacs.d/inits/ext下サブディレクトリも含む

の順で各ディレクトリ内の設定ファイルがロードされます。

設定ファイルの書き方

el-init では 依存関係を示すために、各設定ファイルに
provide 式を記述する必要があります。

とは言っても、ファイル名と同じシンボルを provide 関数に渡すだけです。

;; init-anything.elの場合
(provide 'init-anything)

これをファイル内に記述します。
それだけです。

ファイル名が他の拡張機能と被らないように注意しましょう。

anything.el x
init-anything.el o

provide 省略マクロ

el-init には provide の引数を省略することができるマクロが用意されています。
次のように記述することでファイル名を気にする必要がなくなります。

(require 'el-init)
(el-init:provide)

最後に

今回は簡単な紹介だけですが、気になることなどがあれば
コメントか github の issues@HKe7 にリプライを飛ばしてもらえるとありがたいです。

詳しい説明や el-init:load-function-list や el-init:record については
後日書こうと思います。

From → Emacs

3件のコメント
  1. 匿名希望 permalink

    githubにアップロードして全世界に公開なさるのならば,コード中に日本語(multi-byte文字)は残さず,またコミットメッセージも英語で書いていったほうがいいかもしれません.

    • コメントありがとうございます。
      ご指摘の通り、できる事なら英語で書くほうが望ましいのですが、今の自分はあまり英語が書けないのでとりあえず日本語で書いている次第です。
      英語で書けるようにしていきたいとは思いますが、リポジトリなどに反映されるまでには少し時間がかかるかもしれません。

Trackbacks & Pingbacks

  1. init-loaderで.emacsを分割管理してみた。 | Acid Note

匿名希望 への返信 コメントをキャンセル