Emacs
.emacsDay 7

init.el の編集で意識していること

More than 3 years have passed since last update.

ここでは、私自身の init.el の編集にあたって意識していることを、簡単に紹介します。


バイトコンパイルの自動化

init.el を変更したらすぐにバイトコンパイルするよう、auto-compile-mode は自動的にOnにしています。

  (use-package auto-compile :no-require t :defer t :ensure t

:diminish "C"
:init
(add-hook 'emacs-lisp-mode-hook 'auto-compile-mode))


パッケージの設定


外部パッケージ設定は、パッケージのアルファベット順に並べる

外部パッケージは、 use-package パッケージ等、 init.el 本体で使う一部を除いては、原則、アルファベット順に並べます。


依存関係は、hook と with-eval-after-load で管理する

use-package:init 部にて、 add-hookwith-eval-after-load などを用いて、対象ライブラリが読み込まれたりフックが起動したタイミングで、依存ライブラリを読みこませ、各種設定を行うようにします。


use-package のオプション管理

外部パッケージの設定には use-package を使います。Emacs 標準パッケージの設定には use-package は使わず、 with-eval-after-load を使います。これは、何もインストールされていない素のEmacsでも、 init.el だけを持参したら、可能な限り自分の環境で動かせるようにするためです。


:no-require

バイトコンパイル時にパッケージをロードすると、普段使わないパッケージまで読み込んでしまい、コンパイルに時間がかかります。そのため、 use-package 等、どうしてもコンパイル時に読み込まなければいけないもの以外は :no-requiret にします。


:defer

起動時にパッケージを読み込むと、起動時間がかかるので、どうしても起動時から必要なもの以外は必ず :defert にします。ただし、 :commands, :bind, :interpreter, :mode が設定されていれば、 :defer は不要です。


:ensure

ELPAにあるパッケージは :ensuret にする、という癖をつけておけば、パッケージの出自がひと目で分かり、メンテナンスが楽になります。


:diminish

モードラインがマイナーモード表示で溢れると嫌なので、よく使うマイナーモードは :dminish を =""= にするか、絵文字にするなど、カラムを節約するようにします。


カスタム変数


変数の設定

カスタム変数の設定には、 setq ではなく、 set-variable を使います。以下の利点があります。


  • バイトコンパイル時に未定義変数の警告がなくなる。

  • 変数設定時に、型チェック・副作用チェックが行われる

  • 変数設定時に、それに影響される各種設定が、連動して更新される

カスタム変数でない変数の変更には setq を使いますが、そのような変数はパッケージ作者にとって、ユーザが変更することを想定していない変数ですので、扱いに注意します。また、 defvar 宣言をして、バイトコンパイル時に警告を抑止します。


custom-set-variables 設定部分の分離

M-x customize-variables や、外部パッケージによって変更されたカスタム変数は、デフォルトでは init.el の末尾に記述されますが、欝陶しいと思われる場合は別ファイルにしてしまうと良いでしょう。

  (setq custom-file (locate-user-emacs-file "custom.el"))


未定義関数

各種パッケージの autoload 未宣言な関数を init.el で利用するのは、パッケージ作者にとって想定されていないことなので、できるだけ避けます。どうしても必要な場合は、以下のように declare-function でバイトコンパイル時の警告を抑止します。

  (declare-function org-defkey "org" (keymap key def))


編集モードの設定


ファイル変数の設定

init.el の末尾に以下のように書いています。

  ;; Local Variables:

;; coding: utf-8-unix
;; outline-minor-mode: t
;; auto-complete-mode: nil
;; flycheck-mode: nil
;; time-stamp-pattern: "10/Modified:\\\\?[ \t]+%:y-%02m-%02d\\\\?\n"
;; eval: (hide-sublevels 5)
;; End:


outline-minor-mode

init.el が大きくなっても、 outline-minor-modet にしておいて、以下のように outline-mode-map に、 org-cycle を設定しておけば、 org-mode と同じ操作で階層的な編集ができます。

  (with-eval-after-load 'outline

(bind-key "<tab>" 'org-cycle outline-minor-mode-map)
(bind-key "C-<tab>" 'org-global-cycle outline-minor-mode-map))

また、最初から下位レベルを隠しておけば、編集したい場所を探すのが楽になります。


time-stamp-pattern

time-stamp-pattern をファイルローカル変数に設定しておくと、ファイル冒頭の編集日時が、保存時に自動的に更新されます。


auto-complete-mode, flycheck-mode

幾つかの編集モードは、 init.el が大きくなりすぎると動作が遅くなるので、不便に感じたらさっさとファイルローカル変数で切っておきます。