@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

= Emacsでお試しinit.elの指針

[2013-02-18 16:16:41]

emacs-jpのIssue #15で@taraoさんがtypesterさんのEmacsお試し環境(Emacsの設定を見直し、 el-get の distributed セットアップに統一 - unknownplace.org)を紹介していました.

init.elを~/.emacs.d/に置かなくても良いような設定になっていて,任意のディレクトリにgit cloneなどして,

% emacs -q -l /path/to/init.el

とすると,そのディレクトリを基準に設定が読み込まれて,その人の環境をお試しできるというものです.

taraoさんが

他人の設定を覗き見るのにとてもべんりなので、設定を晒している人には積極的に採用してもらいたいですね。

.emacs 晒してる方 · Issue #15 · emacs-jp/emacs-jp.github.com · GitHub

と締めくくっていたので自分なりに解釈して,取り入れやすいようにまとめてみました.

間違っていたり,提案などありましたらコメントや@pecculへ教えていただければ幸いです.

設定のポイント

と言っても,重要なのはパスで,変数user-home-directoryを変えてしまう.ということみたいです.

init.elの先頭にこれを追加しましょう.これさえできてれば基本的には~/.emacs.d/に置いてなくても使えるようになって,他の人にも試してもらえるようになるかと思います.
(もちろんパスを直接書いてるところは変更する必要がありますが)

;; emacs -l init.el のように起動されるとload-file-nameにinit.elのパスが入るので
(when load-file-name
  ;; 設定ファイルの基準となるディレクトリを読み込んだinit.elのあるディレクトリへ変更する
  (setq user-emacs-directory (file-name-directory load-file-name)))
(add-to-list 'load-path user-emacs-directory)


以上.あとは必要な人のみ.

相対パスへの対応

基本的に上の設定があれば基準となるディレクトリが変わるので,
あとは好きに設定を読み込めばいいと思います.

例えばディレクトリ/path/to/の中身がこんな感じとして話を進めます.

./init.el
./conf/config-foo.el
./conf/config-bar.el
  • パスに追加して直接読み込む場合

これは設定ファイル名と,ライブラリ名がかぶったりするとまずいけども.
サブディレクトリconfのパスを追加して読み込むならこんな感じ.

(add-to-list 'load-path (locate-user-emacs-file "conf"))
(dolist (conf (list
                "config-foo"
                "config-bar"
               ))
  (load conf))
  • init-loaderの場合

init-loaderを読み込んだ後にこんな感じかな

(init-loader-load (locate-user-emacs-file "conf"))

;; 追記 2013/02/25 19:46
taraoさんのbundle.elをうまく解釈できていないのと,el-get, init-loader共に使っていないので以下の設定は参考になりません.
;; 追記おわり

taraoさんはel-getでinit-loaderを読み込む設定をこんな感じに書いていました(dotfiles/init.el at master · tarao/dotfiles · GitHub).

;; el-getのパスを通したりemacs-wikiのurl設定
(add-to-list 'load-path (locate-user-emacs-file "el-get/el-get"))
(setq-default el-get-dir (locate-user-emacs-file "el-get")
              el-get-emacswiki-base-url
              "http://raw.github.com/emacsmirror/emacswiki.org/master/")
;; el-getが無ければインストール
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "http://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))
;; el-getのレシピの場所を設定
(add-to-list 'el-get-recipe-path (locate-user-emacs-file "recipes"))

;; ;; emacs-jp版のinit-loaderの読み込み
;; init-loaderがインストールされてなかったらインストールする設定を書いてください

;; init-loaderの設定
(setq-default init-loader-show-log-after-init nil
              init-loader-byte-compile t)
;; dotディレクトリ以下の設定の反映
(init-loader-load (locate-user-emacs-file "dot"))

locate-user-emacs-fileが無ければ

もしlocate-user-emacs-fileが無ければこの定義を追加したら良いと思います.

(unless (fboundp 'locate-user-emacs-file)
  (defun locate-user-emacs-file (new-name &optional old-name)
    "Return an absolute per-user Emacs-specific file name.
If OLD-NAME is non-nil and ~/OLD-NAME exists, return ~/OLD-NAME.
Else return NEW-NAME in `user-emacs-directory'."
    (convert-standard-filename
     (let* ((home (concat "~" (or init-file-user "")))
            (at-home (and old-name (expand-file-name old-name home))))
       (if (and at-home (file-readable-p at-home))
           at-home
         (abbreviate-file-name
          (expand-file-name new-name user-emacs-directory)))))))

おわりに

この設定で,~/.emacs.dのリポジトリを公開している方はお試し環境も追加しちゃいましょう.というお話でした.