refactor,feat(emacs): Refactor emacs.nix

- Added Tree-sitter grammars.
- Attempting to do so led to discovering how janky the previous setup was.
- Previous package "bootstrapping" process looked like

    emacsPackage (The selected Emacs build from Nixpkgs)
         ↓
    emacs-wrapper (My wrapper that set envvars and included external deps)
         ↓
    programs.emacs.finalPackage (The package created by the HM module, which
                                 included Nix-managed Emacs packages)

  Now, we have

    emacsBasePackage (The selected build from Nixpkgs)
         ↓
    my-emacs (My wrapper that manages envvars, external packages, Nix-managed
              Emacs packages, and everything else)
   
  `programs.emacs.finalPackage` still exists, but it doesn't do anything that
  `my-emacs` doesn't.
This commit is contained in:
Madeleine Sydney
2025-03-04 03:10:59 -07:00
parent 1a97b8344c
commit e102d66797

View File

@@ -1,11 +1,7 @@
{ config, lib, pkgs, inputs, ... }@args: { config, lib, pkgs, inputs, ... }@args:
# NOTE: Remember to wrap `programs.emacs.finalPackage` rather than pass a
# wrapped package to `programs.emacs.package`, lest some unexpected behaviour
# occur when home-manager calls emacs during the build process.
let let
emacsPackage = pkgs.emacs30-pgtk; emacsBasePackage = pkgs.emacs30-pgtk;
emacsConfigDir = "/persist/dots/users/crumb/programs/emacs"; emacsConfigDir = "/persist/dots/users/crumb/programs/emacs";
emacs-overlay = emacs-overlay =
@@ -41,10 +37,16 @@ let
en en-computers en-science en en-computers en-science
]); ]);
emacsWrapper = my-emacs =
pkgs.symlinkJoin { let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages
name = "emacs-wrapper"; (epkgs: with epkgs; [
paths = [ emacsPackage ]; jinx
pdf-tools
treesit-grammars.with-all-grammars
]);
in pkgs.symlinkJoin {
name = "sydmacs";
paths = [ ewp ];
nativeBuildInputs = [ pkgs.makeWrapper ]; nativeBuildInputs = [ pkgs.makeWrapper ];
buildInputs = [ buildInputs = [
pkgs.git # Dependency of Straight.el. pkgs.git # Dependency of Straight.el.
@@ -52,10 +54,12 @@ let
pkgs.direnv pkgs.direnv
]; ];
postBuild = '' postBuild = ''
# The binary called `emacs` is actually a symlink to `emacs-«version»`, so # We specify `-type f` because `emacs` is sometimes a symlink to
# we needn't wrap it. # `emacs-«version»`. If we were to wrap the symlink, Emacs would be
for i in $out/bin/emacs-*; do # wrapped *twice*.
wrapProgram "$i" \ find "$out" -type f -name emacs -or -name "emacs-*" \
| while IFS= read -r emacs; do
wrapProgram "$emacs" \
--add-flags "--init-directory \"${emacsConfigDir}\"" \ --add-flags "--init-directory \"${emacsConfigDir}\"" \
--set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \ --set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \
--set EMACS_CACHE_DIR "${emacsCacheDir}" \ --set EMACS_CACHE_DIR "${emacsCacheDir}" \
@@ -67,21 +71,17 @@ let
--set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell" --set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell"
done done
''; '';
meta = emacsPackage.meta; meta = emacsBasePackage.meta;
version = emacsPackage.version; version = emacsBasePackage.version;
}; };
emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" '' emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" ''
emacsclient --alternate-editor=${emacsWrapper}/bin/emacs "$@" emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@"
''; '';
in { in {
programs.emacs = { programs.emacs = {
enable = true; enable = true;
package = emacsWrapper; package = my-emacs;
extraPackages = epkgs: [
epkgs.jinx
epkgs.pdf-tools
];
}; };
sydnix.impermanence.cache.directories = sydnix.impermanence.cache.directories =