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 =