Files
sydnix/users/crumb/programs/emacs.nix
2025-01-17 16:28:45 -07:00

65 lines
2.1 KiB
Nix

{ 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;
emacsConfigDir = "/persist/dots/users/crumb/programs/emacs";
emacs-overlay =
import (builtins.fetchTarball {
url =
"https://github.com/nix-community/emacs-overlay/archive/master.tar.gz";
sha256 = "sha256:02aln37ch9isz8h7dlm9v6jkl60g923z0dij0rjsxq7xi61fas2j";
});
# Create a new instance of nixpkgs with emacs-overlay applied. This is a
# little unorthodox, but we do it
# 1. for the sake of organisation — For pure aesthetics and a clean
# codebase, I want everything Emacs to stay in this file;
# 2. and, there's simply no need to leak emacs-overlay's packages into the
# global nixpkgs instance when nothing else is using it!
pkgs' = import inputs.nixpkgs {
system = args.system;
overlays = [ emacs-overlay ];
};
emacsDataDir = "${config.xdg.dataHome}/emacs";
emacsCacheDir = "${emacsDataDir}/cache";
straightBaseDir = "${emacsDataDir}/straight";
emacsWrapper = pkgs.symlinkJoin {
name = "emacs-wrapper";
paths = [ emacsPackage ];
nativeBuildInputs = [ pkgs.makeWrapper ];
buildInputs = [
pkgs.git # Dependency of Straight.el.
];
postBuild = ''
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}"
done
'';
};
in {
sydnix.impermanence.cache.directories = [
# Impermanence expects the path to be relative to ~.
(lib.removePrefix config.home.homeDirectory straightBaseDir)
];
home.packages = [ emacsWrapper ];
# TODO: Make sure this is using the right package for Emacs...
services.emacs = {
enable = true;
# Generate a desktop entry for emacsclient.
client.enable = true;
};
}