flake.nixでポータブルな最小構成のEmacsを作成する

Table of Contents

Introduction

「任意のEmacs Packageが動かない」がおま環かバグかというのを切り分けることは非常に重要。 誰でも同じ環境を整えられるようにすると問題解決が捗るので構築方法をメモしておく。

作業手順

1. init.el作成

今回のサンプルはrainbow-delimitersが動作するか確認するものにする。

(use-package rainbow-delimiters
  :ensure t
  :hook
  (prog-mode-hook . rainbow-delimiters-mode))

2. flake.nix作成

alwaysEnsure = true; にすると init.el 内の :ensure t を読んでNix Build時によしなにインストールしてくれる。

また、emacs-overlay を使うと unstable/stable/head など複数バージョンで実行できるので検証の幅を簡単に広げられる。 https://github.com/nix-community/emacs-overlay/blob/master/overlays/emacs.nix

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    emacs-overlay = {
      url = "github:nix-community/emacs-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, emacs-overlay }:
    let
      system = "aarch64-darwin";
      pkgs = import nixpkgs {
        inherit system;
        overlays = [ emacs-overlay.overlay ];
      };
      emacs = pkgs.emacsWithPackagesFromUsePackage {
        config = ./init.el;
        package = pkgs.emacs-unstable;
        alwaysEnsure = true;
      };
    in
      {
        packages.${system}.default = emacs;
      };
}

3. Nix Buildして実行

Localに一切依存しない形でEmacsをBuildできる。

$ nix build .#default
$ ./result/bin/emacs -nw -Q

終わりに

「最小構成を作ってください」の正解は flake.nix だと思っている。

余談だが、natsukiumの「一般構築魔法(Nix)のVimへの応用について」の「Nixでプラグインの実行環境を提供する」でも同じことが書かれている。 https://zenn.dev/natsukium/articles/b4899d7b1e6a9a#nix%E3%81%A7%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B