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:
@@ -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 =
|
||||||
|
|||||||
Reference in New Issue
Block a user