[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)))))))