about summary refs log tree commit diff
path: root/emacs.nix
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.nix')
-rw-r--r--emacs.nix141
1 files changed, 141 insertions, 0 deletions
diff --git a/emacs.nix b/emacs.nix
new file mode 100644
index 000000000000..8e3bf21d2424
--- /dev/null
+++ b/emacs.nix
@@ -0,0 +1,141 @@
+{ pkgs ? import <nixpkgs> {}
+, tazjinsPkgs ? import (builtins.fetchGit "https://git.tazj.in") {
+    rev = "4c0e0d715f21eeb62594d198ba1eeccb1a2cfb13";
+  }
+}:
+
+let
+  # TODO: Move this function definition to a prelude.nix or elsewhere.
+  identity = x: x;
+
+  # Here is a whitelist of all of the binary dependencies that Emacs relies
+  # on. These are separate from Emacs libraries like dash.el.
+  emacsBinPath = pkgs.lib.strings.makeBinPath [ pkgs.terminator ];
+
+  emacsWithPackages = (pkgs.emacsPackagesNgGen pkgs.emacs26).emacsWithPackages;
+
+  # TODO: Learn more about melpa versus elpa to have a preference.
+  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-leader
+      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
+      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
+      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
+    ]) ++
+
+    # tazjin's packages
+    (with tazjinsPkgs.tools.emacs-pkgs; [
+      dottime
+      term-switcher
+    ]));
+
+# TODO: Do I need `pkgs.lib.fix`?
+in pkgs.lib.fix(self: l: f: pkgs.writeShellScriptBin "wpcarros-emacs" ''
+   export PATH="${emacsBinPath}:$PATH"
+   exec ${wpcarrosEmacs}/bin/emacs \
+     --debug-init \
+     --no-site-file \
+     --no-site-lisp \
+     --directory ${ ./configs/shared/emacs.d/vendor } \
+     --directory ${ ./configs/shared/emacs.d/wpc } \
+     --directory ${ ./configs/shared/emacs.d/wpc/packages } \
+     --load ${ ./configs/shared/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 a non-Nix built Emacs, so that X and GL linkage
+  # behaves as expected.
+  withLocalEmacs = emacsBin: pkgs.writeShellScriptBin "wpcarros-emacs" ''
+    export PATH="${emacsBinPath}:$PATH"
+    export EMACSLOADPATH="${wpcarrosEmacs.deps}/share/emacs/site-lisp:"
+    exec ${emacsBin} \
+      --debug-init \
+      --no-site-file \
+      --no-site-lisp \
+      --directory ${ ./configs/shared/emacs.d/vendor } \
+      --directory ${ ./configs/shared/emacs.d/wpc } \
+      --directory ${ ./configs/shared/emacs.d/wpc/packages } \
+      --load ${ ./configs/shared/emacs.d/init.el } \
+      --no-init-file $@
+  '';
+}) null identity