Emacs の use-package でパッケージが
インストールされない?
(ensure)

  • Emacsの use-packageはパッケージをロードして設定を適用するマクロで、インストールは自動では行いません。
  • :ensure t を指定すると、use-packageが内部でpackage-installを呼び出し、未インストールのパッケージを自動でインストールします。

関連記事

1. 「Error (use-package): Cannot load 〜」

use-packageで新しいパッケージを使おうとしたらエラーになりました。

1. 「Error (use-package): Cannot load 〜」
Error (use-package): Cannot load slime
Code language: JavaScript (javascript)

このエラーは、use-package が slime をロードしようとした時点でパッケージが存在しなかったことを示しています。
リポジトリにパッケージがなかったのかな、と思ったのですが、package-installを実行するとインストールできました。

1. 「Error (use-package): Cannot load 〜」

実は、これは、:ensure t を書き忘れていた場合に起きます。
use-package は設定管理のマクロなので、:ensure なしでは自動インストールを行わないからです。

三者の役割まとめ package-install インストール担当 DL → 配置のみ use-package 設定・ロード担当 遅延ロード対応 :ensure 両者をつなぐ よくあるエラー Cannot load slime 原因: :ensure t の書き忘れ 解決: (use-package slime :ensure t …)

2. package-install

Emacs には package.el が標準搭載されています。
ELPA や MELPA などのリポジトリから拡張パッケージをダウンロードしてインストールするための仕組みです。

package-install 役割:インストールのみ コマンド例: M-x package-install RET slime 保存先: ~/.emacs.d/elpa/ ⚠ 設定・ロードは行わない

代表的なコマンドが package-install です。

M-x package-install RET slime RET

パッケージは通常、次のディレクトリに保存されます。

~/.emacs.d/elpa/
Code language: JavaScript (javascript)

package-install はインストールのみを行います。
設定やロードは行いません。

3. use-package

use-package は Emacs Lisp のマクロで、コードを生成する仕組みです。
パッケージ設定の整理と遅延ロードを目的として使います。
直接のパッケージ管理ツールではないのです。

use-package 設定管理マクロ ロード・設定・遅延ロードを整理 (use-package slime :config (slime-setup ‘(slime-fancy))) 前提条件: slime が既にインストール済みであること インストールは自動では行わない

典型的な書き方はこうなります。

(use-package slime
  :config
  (slime-setup '(slime-fancy)))
Code language: PHP (php)

slime をロードし、設定を適用します。
ただし slime が既にインストールされていることが前提です。

3.1. :ensure

:ensureuse-package のキーワードです。
パッケージが未インストールなら自動でインストールします。

:ensure — 自動インストール 1 インストール済みか確認 2 未ならpackage-installを実行 3 ロード → 設定を適用 (use-package slime :ensure t :config (slime-setup …)) ↑ これだけでOK :ensure が両者をつなぐ use-package  └ :ensure → package-install  └ require → ロード
(use-package slime
  :ensure t
  :config
  (slime-setup '(slime-fancy)))
Code language: PHP (php)

内部では次の順に処理が走ります。

  1. slime がインストール済みか確認する
  2. 未インストールなら package-install を実行する
  3. slime をロードする
  4. 設定を適用する

4. 実際の設定例

(require 'package)

(setq package-archives
      '(("melpa" . "https://melpa.org/packages/")
        ("gnu"   . "https://elpa.gnu.org/packages/")))

(package-initialize)

(require 'use-package)

(use-package slime
  :ensure t
  :config
  (slime-setup '(slime-fancy)))
Code language: PHP (php)

この構成にしておくと、新しい Emacs 環境でも init.el を読み込むだけで必要なパッケージが自動インストールされます。
環境の再構築が楽になるわけです。