From e102d667979806e716fbd22b637117d5899050a7 Mon Sep 17 00:00:00 2001 From: Madeleine Sydney Date: Tue, 4 Mar 2025 03:10:59 -0700 Subject: [PATCH] refactor,feat(emacs): Refactor emacs.nix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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. --- users/crumb/programs/emacs.nix | 62 +++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/users/crumb/programs/emacs.nix b/users/crumb/programs/emacs.nix index 52cd3f7..15c6e52 100755 --- a/users/crumb/programs/emacs.nix +++ b/users/crumb/programs/emacs.nix @@ -1,11 +1,7 @@ { 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 - emacsPackage = pkgs.emacs30-pgtk; + emacsBasePackage = pkgs.emacs30-pgtk; emacsConfigDir = "/persist/dots/users/crumb/programs/emacs"; emacs-overlay = @@ -41,10 +37,16 @@ let en en-computers en-science ]); - emacsWrapper = - pkgs.symlinkJoin { - name = "emacs-wrapper"; - paths = [ emacsPackage ]; + my-emacs = + let ewp = (pkgs.emacsPackagesFor emacsBasePackage).emacsWithPackages + (epkgs: with epkgs; [ + jinx + pdf-tools + treesit-grammars.with-all-grammars + ]); + in pkgs.symlinkJoin { + name = "sydmacs"; + paths = [ ewp ]; nativeBuildInputs = [ pkgs.makeWrapper ]; buildInputs = [ pkgs.git # Dependency of Straight.el. @@ -52,36 +54,34 @@ let pkgs.direnv ]; postBuild = '' - # The binary called `emacs` is actually a symlink to `emacs-«version»`, so - # we needn't wrap it. - for i in $out/bin/emacs-*; do - wrapProgram "$i" \ - --add-flags "--init-directory \"${emacsConfigDir}\"" \ - --set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \ - --set EMACS_CACHE_DIR "${emacsCacheDir}" \ - --set EMACS_DATA_DIR "${emacsDataDir}" \ - --prefix PATH : "${pkgs.git}/bin" \ - --prefix PATH : "${my-aspell}/bin" \ - --prefix PATH : "${pkgs.direnv}/bin" \ - --prefix PATH : "${pkgs.texliveFull}/bin" \ - --set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell" - done + # We specify `-type f` because `emacs` is sometimes a symlink to + # `emacs-«version»`. If we were to wrap the symlink, Emacs would be + # wrapped *twice*. + find "$out" -type f -name emacs -or -name "emacs-*" \ + | while IFS= read -r emacs; do + wrapProgram "$emacs" \ + --add-flags "--init-directory \"${emacsConfigDir}\"" \ + --set EMACS_STRAIGHT_BASE_DIR "${straightBaseDir}" \ + --set EMACS_CACHE_DIR "${emacsCacheDir}" \ + --set EMACS_DATA_DIR "${emacsDataDir}" \ + --prefix PATH : "${pkgs.git}/bin" \ + --prefix PATH : "${my-aspell}/bin" \ + --prefix PATH : "${pkgs.direnv}/bin" \ + --prefix PATH : "${pkgs.texliveFull}/bin" \ + --set ASPELL_CONF "dict-dir ${my-aspell}/lib/aspell" + done ''; - meta = emacsPackage.meta; - version = emacsPackage.version; + meta = emacsBasePackage.meta; + version = emacsBasePackage.version; }; emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" '' - emacsclient --alternate-editor=${emacsWrapper}/bin/emacs "$@" + emacsclient --alternate-editor=${config.programs.emacs.finalPackage}/bin/emacs "$@" ''; in { programs.emacs = { enable = true; - package = emacsWrapper; - extraPackages = epkgs: [ - epkgs.jinx - epkgs.pdf-tools - ]; + package = my-emacs; }; sydnix.impermanence.cache.directories =