LoginSignup
7
7

More than 5 years have passed since last update.

init.elのスリム化を目指す (Part2)

Last updated at Posted at 2016-12-24

はじめに

これは.emacs Advent Calendar 2016の21日目の記事です。
init-loader.elの採用とその後について書いています。

init-loader.elは分割されたEmacsの設定ファイルを、
ファイル名の命名規則に従い、Emacsの起動時に読み込み、
設定を反映してくれるパッケージです。

昨年の.emacs Advent Calendar 2015では、init.elのスリム化を目指すということで
init-loader.elを採用して、init.el (Emacsの設定ファイル) のスリム化を図りました。

しかし、私は増加した設定ファイルの管理が億劫になり、Emacsの設定が面倒に感じるようになりました。
これは致命的であります。

そこで、私は設定をファイル分割せず、init.elにまとめるという方針に変更しました。
工夫としては、自作関数を書いて、after-init-hookemacs-startup-hookで読み込むというものです。

init-loaderの再考

init-loader.elを使うと以下の利点を得られます。

  • Emacsの設定を読み込む順番をコントロールできる
  • Emacsの設定を目的毎に用意したelispファイルに記述できる

これらの点は、elispの書き方がイマイチわからなかった当時の私にとっては、とても魅力でした。
ただ、Emacsを使う人の嗜好によっては、以下の点に遭遇するでしょう。

  1. ファイルのロード順の変更がめんどい (ファイルのリネームが必要)
  2. 設定変更時に別ファイルを開き直すのがめんどい
  3. 連番の管理や「帯域1」の記憶がめんどい
  4. 複数の言語やパッケージにまたがる設定をどこに書くか悩みが生じる
  5. 設定の加除によって「コメントしかないファイル」が生まれる

init-loaderって必要なの? ほんとに? - Qiita

私は上記のすべてに当てはまります。
設定を複数のファイルに別けたことで、面倒になっていたのです。

さて、どうしたものか。

何をしたか

init-loader.elをやめ、分散していた設定ファイルをinit.elにまとめました。
私はinit.elを以下のように書き換えています。下記は例です。

init.el
(add-hook 'after-init-hook
          (lambda ()                    
            ;; load-pathを設定する.
            (hp-load-load-path-config)
            :
            :
            :
            ))

(add-hook 'emacs-startup-hook
          (lambda ()
            ;; helmに関する設定を読み込む.
            (hp-load-helm-config)

            ;; org-modeに関する設定を読み込む. 
            (hp-load-org-mode-config)
            :
            :
            :
            ))                                                  

(defun hp-load-load-path-config ()
  :
  :
  :
  )

(defun hp-load-helm-config ()
  :
  :
  :
  )

(defun hp-load-org-mode-config ()
  :
  :
  :
  )

上記の例だと、org-modeの設定を読み込みたくない場合は、(hp-load-org-mode-config)をコメントアウトします。
また、org-modeの設定をhelm-modeよりも前に読み込みたい場合は、記述順序をその通りにします。

init.elの動き

下記のinit.elで初期化動きを確認してみます。

init.el
(message "loading init.el, start")

(add-hook 'after-init-hook
          (lambda ()                    
            (message "run after-init-hook")))

(add-hook 'emacs-startup-hook
          (lambda ()                    
            (message "run emacs-startup-hook")))

(message "loading init.el, end")

上記のelispを読み込むと、以下の順序でEmacsはmessageを出力します。

  1. loading init.el, start
  2. loading init.el, end
  3. run after-init-hook
  4. run emacs-startup-hook

ということは、add-hookする後に自作の関数を書いても問題なさそうです。

init.el
(message "loading init.el, start")

(add-hook 'after-init-hook
          (lambda ()                    
            (message "run after-init-hook")
            (run my-function)))

(add-hook 'emacs-startup-hook
          (lambda ()                    
            (message "run emacs-startup-hook")))

(defun my-function ()
  (message "run my-function"))

(message "loading init.el, end")

上記のelispを読み込むと、以下の順序でEmacsはmessageを出力します。

  1. loading init.el, start
  2. loading init.el, end
  3. run after-init-hook
  4. run my-function
  5. run emacs-startup-hook

ということは、add-hookを使えば、init-loader.elで魅力に思っていた以下の点を維持できそうです。

  • Emacsの設定を読み込む順番をコントロールできる
  • Emacsの設定を目的毎に用意したelispファイルに記述できる

なので、以下の方法で設定をいじりやすくなりました。

  1. add-hook内で呼ぶ関数の記述順序を変えれば、設定の読み込み順序を変更できる
  2. add-hook内で呼んでいる関数をコメントアウトすれば、その設定を読み込まないようにできる

まとめ

以上の通り、Emacsの設定は分散して書くのではなく、init.elにまとめて書くスタイルに変更しました。
このスタイルではinit.elの行数は増えますが、以下のメリットがあります。

  • どのファイルに何を書いたのか把握しておく必要がない
  • 仮に設定の変更が必要な場合は、init.elで検索(helm-swoopなど)をして該当箇所に移動すれば良い

皆様がご存知の通り、Emacsはスマートフォン、タブレットと同様に生活必需品の1つであります。
本エントリーが読者様のEmacsライフに少しでもお役に立てれば幸いです。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7