tvl-depot/emacs/default.nix

192 lines
4 KiB
Nix
Raw Normal View History

{ pkgs, depot, ... }:
let
inherit (builtins) path;
inherit (depot.third_party) emacsPackagesGen emacs27;
inherit (pkgs) writeShellScript writeShellScriptBin;
inherit (pkgs.lib.strings) concatStringsSep makeBinPath;
emacsBinPath = makeBinPath (with pkgs; [
ripgrep
bat
fd
2020-09-08 00:23:08 +02:00
fzf
pass
tokei
nmap
tldr
diskus
jq
pup
exa
gitAndTools.hub
kubectl
google-cloud-sdk
xsv
Remove assertions that prelude/executable-exists? I'm in the midst of transitioning onto a few new tools. My previous workflow just used `nix-env` to install *some* packages. I didn't have a prescribed methodology for which packages I would install using `nix-env` and which ones I would install using `sudo apt-get install`. Sometimes if a package would be available in my aptitude repositories, I'd use that; other times when it wasn't available I'd use `nix-env`. One complication about being on gLinux intead of NixOS is that some packages (e.g. nixpkgs.terminator) is available via `nix-env -iA nixpkgs.terminator`, but the installation won't actually run on my gLinux. In these instances, I would install terminator from the aptitude repositories. Then @tazjin introduced me to his Emacs configuration that he builds using Nix. What appealed to me about his built Emacs is that it worked as expected on either a NixOS machine and on gLinux (and presumably on other non-NixOS machines as well). A setup towards which I'm working is to own one or a few NixOS machines whose configurations are entirely managed with Nix. On devices like my work machines, which cannot run NixOS, I can build as much of the software that I need using Nix and attempt to minimize the ad hoc configuration either with shell scripts, python, golang, or more Nix code... it's clear that I still don't have a clear idea of how that part will work. For now, I'm adopting nix, nix-env, lorri, direnv, and weening off of aptitude as much as I can. Things are a bit messy, but my general trend feels positive. Stay tuned for more updates.
2020-02-06 22:44:26 +01:00
scrot
clipmenu
xorg.xset
direnv
nix
Remove assertions that prelude/executable-exists? I'm in the midst of transitioning onto a few new tools. My previous workflow just used `nix-env` to install *some* packages. I didn't have a prescribed methodology for which packages I would install using `nix-env` and which ones I would install using `sudo apt-get install`. Sometimes if a package would be available in my aptitude repositories, I'd use that; other times when it wasn't available I'd use `nix-env`. One complication about being on gLinux intead of NixOS is that some packages (e.g. nixpkgs.terminator) is available via `nix-env -iA nixpkgs.terminator`, but the installation won't actually run on my gLinux. In these instances, I would install terminator from the aptitude repositories. Then @tazjin introduced me to his Emacs configuration that he builds using Nix. What appealed to me about his built Emacs is that it worked as expected on either a NixOS machine and on gLinux (and presumably on other non-NixOS machines as well). A setup towards which I'm working is to own one or a few NixOS machines whose configurations are entirely managed with Nix. On devices like my work machines, which cannot run NixOS, I can build as much of the software that I need using Nix and attempt to minimize the ad hoc configuration either with shell scripts, python, golang, or more Nix code... it's clear that I still don't have a clear idea of how that part will work. For now, I'm adopting nix, nix-env, lorri, direnv, and weening off of aptitude as much as I can. Things are a bit messy, but my general trend feels positive. Stay tuned for more updates.
2020-02-06 22:44:26 +01:00
]);
emacsWithPackages = (emacsPackagesGen emacs27).emacsWithPackages;
wpcarrosEmacs = emacsWithPackages (epkgs:
(with epkgs.elpaPackages; [
exwm
]) ++
(with epkgs.melpaPackages; [
org-bullets
sly
notmuch
elm-mode
ts
vterm
base16-theme
password-store
clipmon # TODO: Prefer an Emacs client for clipmenud.
evil
evil-collection
evil-magit
evil-commentary
evil-surround
key-chord
add-node-modules-path # TODO: Assess whether or not I need this with Nix.
web-mode
rjsx-mode
tide
prettier-js
flycheck
diminish
doom-themes
telephone-line
which-key
all-the-icons
all-the-icons-ivy
ivy
ivy-pass
ivy-prescient
restclient
package-lint
parsec
magit-popup
direnv
alert
nix-mode
racer
rust-mode
rainbow-delimiters
racket-mode
lispyville
elisp-slime-nav
py-yapf
reason-mode
elixir-mode
go-mode
company
markdown-mode
refine
deferred
magit
request
pcre2el
helpful
exec-path-from-shell # TODO: Determine if Nix solves this problem.
yasnippet
projectile
deadgrep
counsel
counsel-projectile
engine-mode # TODO: Learn what this is.
eglot
dap-mode
lsp-ui
company-lsp
suggest
paradox
flymake-shellcheck
fish-mode
tuareg
haskell-mode
lsp-haskell
use-package
general
clojure-mode
cider
f
dash
company
counsel
flycheck
]));
vendorDir = path {
path = ./.emacs.d/vendor;
name = "emacs-vendor";
};
# TODO: byte-compile these by packaging each as an Elisp library.
wpcDir = path {
path = ./.emacs.d/wpc;
name = "emacs-libs";
};
wpcPackageEl = path {
path = ./.emacs.d/wpc/wpc-package.el;
name = "wpc-package.el";
};
initEl = path {
path = ./.emacs.d/init.el;
name = "init.el";
};
loadPath = concatStringsSep ":" [
wpcDir
vendorDir
# TODO: Explain why the trailing ":" is needed.
"${wpcarrosEmacs.deps}/share/emacs/site-lisp:"
];
withEmacsPath = { emacsBin, briefcasePath ? "$HOME/briefcase" }:
writeShellScriptBin "wpcarros-emacs" ''
export XMODIFIERS=emacs
export BRIEFCASE=${briefcasePath}
export GOOGLE_BRIEFCASE="$HOME/google-briefcase"
export PATH="${emacsBinPath}:$PATH"
export EMACSLOADPATH="${loadPath}"
exec ${emacsBin} \
--debug-init \
--no-init-file \
--no-site-file \
--no-site-lisp \
--load ${initEl} \
"$@"
'';
in {
inherit initEl withEmacsPath;
# I need to start my Emacs from CI without the call to `--load ${initEl}`.
runScript = { script, briefcasePath }:
writeShellScript "run-emacs-script" ''
export BRIEFCASE=${briefcasePath}
export PATH="${emacsBinPath}:$PATH"
export EMACSLOADPATH="${wpcDir}:${vendorDir}:${wpcarrosEmacs.deps}/share/emacs/site-lisp"
exec ${wpcarrosEmacs}/bin/emacs \
--no-site-file \
--no-site-lisp \
--no-init-file \
--script ${script} \
"$@"
'';
# Use `nix-env -f '<briefcase>' emacs.nixos` to install `wpcarros-emacs` on
# NixOS machines.
nixos = { briefcasePath ? "$HOME/briefcase" }: withEmacsPath {
inherit briefcasePath;
emacsBin = "${wpcarrosEmacs}/bin/emacs";
};
}