{ 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"; fontPackages = [ pkgs.julia-mono (pkgs.nerdfonts.override { fonts = [ "VictorMono" ]; }) pkgs.overpass ]; emacsWrapper = pkgs.symlinkJoin { name = "emacs-wrapper"; paths = [ emacsPackage ]; nativeBuildInputs = [ pkgs.makeWrapper ]; buildInputs = [ pkgs.git # Dependency of Straight.el. ]; 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" done ''; }; in { sydnix.impermanence.cache.directories = [ # Impermanence expects the path to be relative to ~. (lib.removePrefix config.home.homeDirectory straightBaseDir) ]; home.file = let default = lib.removePrefix "${config.home.homeDirectory}/" "${straightBaseDir}/straight/versions/default.el"; in { ${default}.source = config.lib.file.mkOutOfStoreSymlink "/persist/dots/users/crumb/programs/emacs/straight-lockfile.el"; }; home.packages = [ emacsWrapper ] ++ fontPackages; # There's probably a better place to put this, but the current setup demands # Fontconfig for Emacs to find my fonts. fonts.fontconfig.enable = true; # TODO: Make sure this is using the right package for Emacs... services.emacs = { enable = true; # Generate a desktop entry for emacsclient. client.enable = true; }; }