52d284f59d
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.
152 lines
3.6 KiB
Nix
152 lines
3.6 KiB
Nix
{
|
|
pkgs ? import <nixpkgs> {},
|
|
depot ? import <depot> {},
|
|
...
|
|
}:
|
|
|
|
let
|
|
utils = import ~/briefcase/utils;
|
|
emacsBinPath = pkgs.lib.strings.makeBinPath (with pkgs; [
|
|
scrot
|
|
clipmenu
|
|
ocaml
|
|
ocamlformat
|
|
]);
|
|
emacsWithPackages = (pkgs.emacsPackagesNgGen pkgs.emacs26).emacsWithPackages;
|
|
wpcarrosEmacs = emacsWithPackages (epkgs:
|
|
(with epkgs.elpaPackages; [
|
|
exwm
|
|
]) ++
|
|
|
|
(with epkgs.melpaPackages; [
|
|
base16-theme
|
|
ivy-pass
|
|
clipmon # TODO: Prefer an Emacs client for clipmenud.
|
|
protobuf-mode # TODO: Determine if this is coming from google-emacs.
|
|
# docker
|
|
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
|
|
neotree # TODO: Remove this dependency from my config.
|
|
which-key
|
|
ivy
|
|
restclient
|
|
package-lint
|
|
parsec
|
|
magit-popup
|
|
direnv
|
|
emr
|
|
ivy-prescient
|
|
all-the-icons
|
|
all-the-icons-ivy
|
|
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
|
|
# emr
|
|
flymake-shellcheck
|
|
fish-mode
|
|
tuareg
|
|
haskell-mode
|
|
lsp-haskell
|
|
use-package
|
|
general
|
|
clojure-mode
|
|
cider
|
|
f
|
|
dash
|
|
company
|
|
counsel
|
|
flycheck
|
|
ivy
|
|
magit
|
|
]) ++
|
|
|
|
(with depot.tools.emacs-pkgs; [
|
|
dottime
|
|
term-switcher
|
|
]));
|
|
|
|
# TODO: Do I need `pkgs.lib.fix`?
|
|
in pkgs.lib.fix(self: l: f: pkgs.writeShellScriptBin "wpcarros-emacs" ''
|
|
# TODO: Is this the best way to handle environment variables using Nix?
|
|
export BRIEFCASE=$HOME/briefcase
|
|
export DEPOT=$HOME/depot
|
|
|
|
export PATH="${emacsBinPath}:$PATH"
|
|
exec ${wpcarrosEmacs}/bin/emacs \
|
|
--debug-init \
|
|
--no-site-file \
|
|
--no-site-lisp \
|
|
--directory ${ ./.emacs.d/vendor } \
|
|
--directory ${ ./.emacs.d/wpc } \
|
|
--load ${ ./.emacs.d/wpc/wpc-package.el } \
|
|
--load ${ ./.emacs.d/init.el } \
|
|
--no-init-file $@
|
|
'' // {
|
|
# TODO: Ascertain whether I need this.
|
|
overrideEmacs = f': self l f';
|
|
|
|
# Call with a local.el file containing local system configuration.
|
|
withLocalConfig = confDir: self confDir f;
|
|
|
|
# This accepts the path to an Emacs binary outside of /nix/store. On gLinux,
|
|
# this will ensure that X and GL linkage behaves as expected.
|
|
withLocalEmacs = emacsBin: pkgs.writeShellScriptBin "wpcarros-emacs" ''
|
|
# TODO: Is this the best way to handle environment variables using Nix?
|
|
export BRIEFCASE=$HOME/briefcase
|
|
export DEPOT=$HOME/depot
|
|
|
|
export PATH="${emacsBinPath}:$PATH"
|
|
export EMACSLOADPATH="${wpcarrosEmacs.deps}/share/emacs/site-lisp:"
|
|
exec ${emacsBin} \
|
|
--debug-init \
|
|
--no-site-file \
|
|
--no-site-lisp \
|
|
--directory ${ ./.emacs.d/vendor } \
|
|
--directory ${ ./.emacs.d/wpc } \
|
|
--load ${ ./.emacs.d/wpc/wpc-package.el } \
|
|
--load ${ ./.emacs.d/init.el } \
|
|
--no-init-file $@
|
|
'';
|
|
}) null utils.identity
|