6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソニックガーデン プログラマAdvent Calendar 2024

Day 12

Borg で始める Emacs のパッケージ管理

Last updated at Posted at 2024-12-11

こちらは ソニックガーデン プログラマ Advent Calendar 2024 の12日目の記事です。
ブレずに Emacs のパッケージ管理について書いていきます。

最初に簡単なまとめ

  • Borg を使えば Emacs のパッケージをたぶん完全にコントロールできる
  • 導入は少し大変

Emacs のパッケージ管理

Emacs 24 で package.el が本体に含まれるようになって以降、Emacs におけるパッケージの導入・管理はとても簡単にできるようになりました。
また、Emacs 29 からは use-package も本体に含まれるようになり、シンプルで分かりやすい設定を書けるようになっています。

これらのツールでは簡単にパッケージやその設定を管理できる一方、意識しなければ更新時に何が変わったのかはあまり見えず、また依存関係も複雑で Emacs が起動しなくなってしまう(そしてその復旧で数時間かかったり)こともときどきあります。
最初に少し手間はかかりますが、Borg を使い始めてからはそういった困りごとはほぼなくなって快適に過ごせているので、今回紹介してみようと思います。

Borg とは

  • Emacs のパッケージを Git submodules として管理するパッケージ
  • 依存関係を含めて、どのパッケージのどのバージョン(commit hash)をインストールするかをユーザーが指定する
  • パッケージの更新についても Git のログを見た上でユーザー自身が判断する

Borg の導入と設定

追加のパッケージマネージャーとして導入する場合

こちら を参照して導入しましょう。
私はやったことがないので分かりません。

最初から導入する場合

基本は ここ に書いてある通りなんですが、簡単に説明していきます。

最初に Makefile を用意

最終的に make コマンドを通してビルドなどできるようになりますがまだ使いません、とりあえず置いておきましょう。
次回以降にセットアップするときは make bootstrap-borg ですべてが完了します。

Makefile
DRONES_DIR = $(shell git config "borg.drones-directory" || echo "lib")

-include $(DRONES_DIR)/borg/borg.mk

bootstrap-borg:
	@git submodule--helper clone --name borg --path $(DRONES_DIR)/borg --url https://github.com/emacscollective/borg.git
	@cd $(DRONES_DIR)/borg; git symbolic-ref HEAD refs/heads/main
	@cd $(DRONES_DIR)/borg; git reset --hard HEAD

Borg 本体を Submodule として追加

ゼロからの構築なので Borg 本体がまだありません、Submodule として追加しておきましょう。

git submodule add --name borg https://github.com/emacscollective/borg.git lib/borg

Borg の初期設定

Borg を使ってパッケージ管理をするための設定です。
package.el でのパッケージ管理はしないのでこのタイミングで止めておきます。

early-init.el
(setq package-enable-at-startup nil)
init.el
(add-to-list 'load-path (expand-file-name "lib/borg" user-emacs-directory))
(require 'borg)
(borg-initialize)

epkg および依存パッケージの追加

この段階で git のコマンドを使用してパッケージ管理はできるようになっているのですが、まだ不便なので便利に扱えるように関連パッケージを追加します。

git submodule add --name closql https://github.com/emacscollective/closql lib/closql
git submodule add --name emacsql https://github.com/skeeto/emacsql lib/emacsql
git submodule add --name compat https://github.com/emacs-compat/compat lib/compat
git submodule add --name llama https://github.com/tarsius/llama lib/llama
git submodule add --name epkg https://github.com/emacscollective/epkg lib/epkg
git config -f .gitmodules submodule.emacsql.no-byte-compile emacsql-pg.el
echo /epkgs/ >> .gitignore

Magit の追加と設定

M-x borg-assimilate から magit を追加(依存関係にある dash, with-editor を先に追加する必要があります)後、以下の設定を追記してください。

init.el
(with-eval-after-load 'magit
  (magit-add-section-hook 'magit-status-sections-hook
                          'magit-insert-modules
                          'magit-insert-stashes
                          'append))

設定完了

これで設定完了です。
後は borg-xxxx 系のコマンドを使って自由にパッケージを管理できます。

ちょっとした使い方

パッケージの更新

  1. magit を開いて f m でサブモジュールの更新を取得(fetch)
  2. 個別のサブモジュールごとに更新内容を確認して F u で取込み(pull)
  3. M-x borg-build で再ビルド
    • コマンドラインから make build で一括ビルドも可能です

load-path を追加したい場合

複数のパスから .el ファイルをロードしたい場合があります。
その場合は .gitmodules ファイルを開いて load-path (複数指定可) を設定します。

.gitmodules
[submodule "corfu"]
	path = lib/corfu
	url = https://github.com/minad/corfu
	load-path = .
	load-path = extensions

追加したいパッケージが見つからない

epkg で管理しているデータが古くなっている可能性があります。
M-x epkg-update を実行してデータを更新しましょう。

最後に

導入のハードルは少し高めですが、ぜひみなさんも Borg を使って快適なパッケージ管理をしてみましょう。
13日目は @sincrare です、お楽しみに!

6
1
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
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?