私の現時点での.emacs 管理方法を紹介します。リポジトリは以下です。

org ファイルがならんでます。そうです!

emacs の設定ファイルを org-mode で管理しています。

org-mode で書いた設定ファイルを hoge.org -> hoge.el に変換しています。

それを可能にするパッケージが、babel-loader です。

org-mode で init.el を管理することで得られる 7 つの恩恵

benel-loader は init-loder と組み合わせることによって、効果を発揮します。 hoge.org -> hoge.el に変換したファイルを init-loader によって、 一つずつロードしていくからです。

rubikitch さんが以下のような記事を年末に書きました。

それにならって、org-mode で init.el を管理することの恩恵を考えて見たいと思います。

  1. 説明をコメントとして書かないですむ。… ;; で説明をコメントアウトする見苦しさとはおさらば。
  2. 説明とコードを一緒に 一元管理できる。… Run Book Automation です。
  3. org-mode に慣れていれば説明を書きやすい。… I love org-mode!!
  4. org-mode の折りたたみ機能によって、階層的に設定を管理できる。
  5. 設定ファイルがブログ記事になる … こんな感じです。Emacs プログラミング言語開発環境 | Futurismo
  6. 読みやすい。他人に見せやすい。… とくに github にあげるといい感じにシンタックスハイライトしてくれる。
  7. 書いていて楽しい!!

私の Emacs 起動方法

以下、自分き Emacs の起動順序について抜粋しながら書く。

フォルダ構成

フォルダ構成はこんな感じ。

.emacs.d
  |- init.el ... 一番初めに起動されるファイル
  |- inits ... org ファイルが入っているディレクトリ
       |- 00_init.org
       |- ....
       |- 90_color.org
  |- el-get
      |- repo 
          |- el-get 
          |- el-get で取得したパッケージ群
      |- user-recipes ... el-get 用の自分のレシピ

init.el: el-get

まずは、el-get を一番初めにダウンロードする。

;; el-get ロードパス設定
(add-to-list 'load-path (locate-user-emacs-file "el-get/repo/el-get"))

;; ダウンロードした elisp 置き場
(setq el-get-dir "~/.emacs.d/el-get/repo")

;; ダウンロードしていないときはダウンロード
(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (let (el-get-master-branch)
      (goto-char (point-max))
      (eval-print-last-sexp))))

;; 初期化処理用
(setq el-get-user-package-directory "~/.emacs.d/el-get/init-files")

;; レシピ置き場
;; 追加のレシピ置き場
(add-to-list 'el-get-recipe-path "~/.emacs.d/el-get/user-recipes")

init.el: org-mode

org-mode を読み込む。load-path に

;; org-mode/lisp, org-mode/contribe/lisp をロードパスに追加する
(let* ((org-dir (expand-file-name
                 "lisp" (expand-file-name
                         "org-mode" el-get-dir)))
       (org-contrib-dir (expand-file-name
                         "lisp" (expand-file-name
                                 "contrib" (expand-file-name
                                            ".." org-dir)))))
  (setq load-path (append (list org-dir org-contrib-dir)
                          (or load-path nil))))
(require 'org)

init.el: init-loader

(el-get-bundle emacs-jp/init-loader)

;; バイトコンパイルする
;; 初めのバイトコンパイルは手動で実施する必要がある
(setq init-loader-byte-compile t)

;; エラー発生時にだけ log を開く
;; (setq init-loader-show-log-after-init t)
(setq init-loader-show-log-after-init 'error-only)

init.el: babel-loader

el-get で babel-loader をインストール

(el-get-bundle takaishi/babel-loader.el)
(add-to-list 'load-path (locate-user-emacs-file "el-get/repo/babel-loader.el"))
(require 'babel-loader)

;; インデント保持
;; これをしないと 変換された elisp ファイルのインデントがずれる.
(setq org-src-preserve-indentation t)

;; inits 配下の org ファイルを elc に変換して読み込み.
(bl:load-dir "~/.emacs.d/inits/")

inits:00_init.org フォルダを再帰的にロードパスに追加

;; @ load-path
;; for Emacs 23 under
(defvar user-emacs-directory "~/.emacs.d")

;; load-path の追加関数
(defun add-to-load-path (&rest paths)
  (let (path)
    (dolist (path paths paths)
      (let ((default-directory (expand-file-name (concat user-emacs-directory path))))
    (add-to-list 'load-path default-directory)
    (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
        (normal-top-level-add-subdirs-to-load-path))))))

;; load-path に追加するフォルダ
;; 2 つ以上フォルダを指定する場合の引数 => (add-to-load-path "elisp" "xxx" "xxx")
(add-to-load-path "elisp" "inits" "el-get" "local" "mylisp")

inits:00_init.org: use-package

パッケージ管理のパッケージ

(package-initialize nil)
(el-get-bundle use-package)

;; use-package が存在しないときはなにもしない
(add-to-list 'load-path "~/.emacs.d/el-get/repo/use-package")
(unless (require 'use-package nil t)
  (defmacro use-package (&rest args)))

inits:00_init.org: el-get 同期 Package

el-get で自動にインストールするパッケージをひたすら列挙。

(defvar my/el-get-packages-all
  '(
    ;; 03_display
    popwin
    switch-window
    isearch-dabbrev
    ;; open-junk-file
    iy-go-to-char
    key-chord
    jump-char
    recentf-ext
    stripe-buffer

    ;; 20_text
    hydra
    swiper
    yasnippet
    dired-k
    migemo
    undo-tree
    define-word
    auto-complete
    anzu
    auto-highlight-symbol
    highlight-symbol
    multiple-cursors
    bm
    emacs-async
    pcre2el
    ht
    iedit
    codic
    search-web
    wgrep
    expand-region
    ag
    auto-capitalize
    omni-kill

    ;; 以下省略
    )
  "A list of packages to install from el-get at launch.")

inits: 00_init.org el-get config

;; 通知は minibuffer のみ
(setq el-get-notify-type 'message)

;; パッケージをインストール
(el-get 'sync my/el-get-packages-all)

inits: 01_global.org … 90_color.org

babel-loader によって、次々と org ファイルを el に変換して読み込んでいく。

Special Thanks