Help us understand the problem. What is going on with this article?

init-loader.el と package.el を導入して快適 Emacs ライフ

More than 5 years have passed since last update.

今まで(恥ずかしながら)適当だった Emacs の設定を改革したらとても快適だったので紹介します

今回紹介したいのは

  • init-loader.el
  • package.el

です

init-loader.el

今まで .emacs に適当に設定を書いていたので以下の様な問題で悩んでいました

  • 環境依存(具体的には Mac と Ubuntu)な設定を分離出来ないので環境構築に手作業が発生する
  • 設定を追加しても上の事情で各々の環境に手作業で導入する必要がある

ということで init-loader.el の出番です

https://github.com/emacs-jp/init-loader

~/.emacs.d/site-lisp/ 以下に init-loader.el を置いて ~/.emacs.d/init.el

init.el
;; ~/.emacs.d/site-lisp 以下全部読み込み
(let ((default-directory (expand-file-name "~/.emacs.d/site-lisp")))
  (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)))

(require 'init-loader)
(setq init-loader-show-log-after-init nil)
(init-loader-load "~/.emacs.d/inits")

と書きます

最初に ~/.emacs.d/site-lisp 以下のものを全部読み込んでしまいます

するとそれ以下に置いた init-loader.el が読み込まれますので単純に require するだけで実行できます

これで ~/.emacs.d/inits ディレクトリ以下に置かれた設定ファイルを読み込ませることができます

ちなみにデフォルトもこの値なので上の設定は冗長ですが,今回は明示的に書いてあります

~/.emacs.d/inits ディレクトリ以下のファイルは以下の設定に従って作成します

  • 環境に依存しない設定はファイル名の最初に 2 桁の数字をつける
    • 番号は優先度で 00 が最初に読み込まれて, 99 が最後に読み込まれる
    • 同じ数字を付けても良い
  • 環境依存な設定はそれぞれの環境のプレフィックスをファイル名の最初につける

プレフィックスは以下のようになります

環境 prefix
Meadow meadow
Carbon Emacs carbon-emacs
Cocoa Emacs cocoa-emacs
emacs -nw nw
Windows windows
Linux linux

なので 00-keybind.el とか cocoa-emacs-appearance.el のように prefix - 機能名 .el とファイル名をつけます

ファイルを機能ごとに分割するとメンテナンス性が格段に向上するので機能ごとにファイルを分割して作成してください

番号に特に決まりはないと思いますが,次に紹介する package.el 周りの設定は 20 番台に書くことが多いようです

package.el

Emacs でも apt-get とか gem とか cpanm 的なあれを使いたくなります

Emacs24 から標準で入った package.el を使えば簡単に使えるようになるので使います

ただデフォルトのままでは入れられる種類が少ないので少し設定を追加します

~/.emacs.d/inits 以下に 20-package.el を置いて

20-package.el
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

と書きます

これで M-x package-list-packages とやるとインストールできるパッケージのリストが見れて,この上からインストールができます

  • インストールしたいパッケージの上で i キーを押す
  • 選択し終わったら x を押す

これでインストールができます

リストの取得でインターネットに接続しないでキャッシュから見たい時は M-x package-list-packages-no-fetch とします

また入れるパッケージの名前がわかっているなら M-x package-install としてもインストールできます

自動インストール設定

最初に必ずインストールするものがあるなら自動設定しておきたいので設定します

先ほどの設定の後に(私は 20-package.el の中に書いてしまっています)

(require 'cl)

(defvar installing-package-list
  '(
    ;; ここに使っているパッケージを書く。
    php-mode
    scala-mode
    markdown-mode
    scss-mode
    haskell-mode
    google-c-style
    yaml-mode
    open-junk-file
    ))

(let ((not-installed (loop for x in installing-package-list
                            when (not (package-installed-p x))
                            collect x)))
  (when not-installed
    (package-refresh-contents)
    (dolist (pkg not-installed)
        (package-install pkg))))

こんな感じのことを書いておきます

こうするとインストールされていなければ自動でインストールされるようになります

サンプルファイル

以上の設定をしたものを catatsuy/dot.emacs.d · GitHub に置きました

参考程度に御覧ください

catatsuy
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away