- Emacsの
use-packageはパッケージをロードして設定を適用するマクロで、インストールは自動では行いません。 :ensure tを指定すると、use-packageが内部でpackage-installを呼び出し、未インストールのパッケージを自動でインストールします。
1. 「Error (use-package): Cannot load 〜」
use-packageで新しいパッケージを使おうとしたらエラーになりました。

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

実は、これは、:ensure t を書き忘れていた場合に起きます。use-package は設定管理のマクロなので、:ensure なしでは自動インストールを行わないからです。
2. package-install
Emacs には package.el が標準搭載されています。
ELPA や MELPA などのリポジトリから拡張パッケージをダウンロードしてインストールするための仕組みです。
代表的なコマンドが 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 slime
:config
(slime-setup '(slime-fancy)))
Code language: PHP (php)
slime をロードし、設定を適用します。
ただし slime が既にインストールされていることが前提です。
3.1. :ensure
:ensure は use-package のキーワードです。
パッケージが未インストールなら自動でインストールします。
(use-package slime
:ensure t
:config
(slime-setup '(slime-fancy)))
Code language: PHP (php)
内部では次の順に処理が走ります。
- slime がインストール済みか確認する
- 未インストールなら
package-installを実行する - slime をロードする
- 設定を適用する
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 を読み込むだけで必要なパッケージが自動インストールされます。
環境の再構築が楽になるわけです。