108 lines
3.3 KiB
Nix
Executable File
108 lines
3.3 KiB
Nix
Executable File
{ 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.nerd-fonts.victor-mono
|
|
# pkgs.overpass
|
|
pkgs.ibm-plex
|
|
];
|
|
|
|
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
|
|
'';
|
|
};
|
|
|
|
emacsclient-or-emacs = pkgs.writeShellScriptBin "emacsclient-or-emacs" ''
|
|
emacsclient --alternate-editor=${emacsWrapper}/bin/emacs "$@"
|
|
'';
|
|
in {
|
|
sydnix.impermanence.cache.directories =
|
|
# Impermanence expects the path to be relative to ~.
|
|
map (lib.removePrefix config.home.homeDirectory) [
|
|
straightBaseDir
|
|
emacsCacheDir
|
|
emacsDataDir
|
|
];
|
|
|
|
# Set emacsclient as the default editor for the time being.
|
|
home.sessionVariables =
|
|
let e = "${emacsclient-or-emacs}/bin/emacsclient-or-emacs";
|
|
in {
|
|
"EDITOR" = e;
|
|
"VISUAL" = e;
|
|
};
|
|
|
|
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
|
|
emacsclient-or-emacs
|
|
] ++ 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;
|
|
package = emacsWrapper;
|
|
};
|
|
}
|