about summary refs log tree commit diff
path: root/users/wpcarro/emacs/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'users/wpcarro/emacs/default.nix')
-rw-r--r--users/wpcarro/emacs/default.nix177
1 files changed, 177 insertions, 0 deletions
diff --git a/users/wpcarro/emacs/default.nix b/users/wpcarro/emacs/default.nix
new file mode 100644
index 000000000000..2353643326de
--- /dev/null
+++ b/users/wpcarro/emacs/default.nix
@@ -0,0 +1,177 @@
+{ depot, pkgs, lib, ... }:
+
+# TODO(wpcarro): See if it's possible to expose emacsclient on PATH, so that I
+# don't need to depend on wpcarros-emacs and emacs in my NixOS configurations.
+let
+  inherit (depot.third_party.nixpkgs) emacsPackagesFor emacs27;
+  inherit (depot.users) wpcarro;
+  inherit (lib) mapAttrsToList;
+  inherit (lib.strings) concatStringsSep makeBinPath;
+  inherit (pkgs) runCommand writeShellScriptBin;
+
+  emacsBinPath = makeBinPath (
+    wpcarro.common.shell-utils ++
+    (with pkgs; [
+      clipmenu
+      ispell
+      nix
+      pass
+      scrot
+      xorg.xset
+    ])
+  );
+
+  emacsWithPackages = (emacsPackagesFor emacs27).emacsWithPackages;
+
+  wpcarrosEmacs = emacsWithPackages (epkgs:
+    (with epkgs.tvlPackages; [
+      tvl
+    ]) ++
+
+    (with epkgs.elpaPackages; [
+      exwm
+    ]) ++
+
+    (with epkgs.melpaPackages; [
+      avy
+      org-bullets
+      sly
+      notmuch
+      elm-mode
+      ts
+      vterm
+      base16-theme
+      password-store
+      # TODO(wpcarro): Prefer an Emacs client for clipmenud.
+      clipmon
+      dockerfile-mode
+      evil
+      evil-collection
+      evil-commentary
+      evil-surround
+      key-chord
+      # TODO(wpcarro): Assess whether or not I need this with Nix.
+      add-node-modules-path
+      web-mode
+      rjsx-mode
+      tide
+      prettier-js
+      flycheck
+      diminish
+      doom-themes
+      telephone-line
+      which-key
+      all-the-icons
+      all-the-icons-ivy
+      ivy
+      ivy-clipmenu
+      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
+      # TODO(wpcarro): Determine if Nix solves this problem.
+      exec-path-from-shell
+      yasnippet
+      projectile
+      deadgrep
+      counsel
+      counsel-projectile
+      # TODO(wpcarro): Learn what this is.
+      engine-mode
+      eglot
+      dap-mode
+      lsp-ui
+      suggest
+      paradox
+      flymake-shellcheck
+      fish-mode
+      tuareg
+      haskell-mode
+      use-package
+      general
+      clojure-mode
+      cider
+      f
+      dash
+      company
+      counsel
+      flycheck
+      emojify
+      yaml-mode
+    ]));
+
+  loadPath = concatStringsSep ":" [
+    ./.emacs.d/wpc
+    # TODO(wpcarro): Explain why the trailing ":" is needed.
+    "${wpcarrosEmacs.deps}/share/emacs/site-lisp:"
+  ];
+
+  # Transform an attrset into "export k=v" statements.
+  makeEnvVars = env: concatStringsSep "\n"
+    (mapAttrsToList (k: v: "export ${k}=\"${v}\"") env);
+
+  withEmacsPath = { emacsBin, env ? { }, load ? [ ] }:
+    writeShellScriptBin "wpcarros-emacs" ''
+      export XMODIFIERS=emacs
+      export PATH="${emacsBinPath}:$PATH"
+      export EMACSLOADPATH="${loadPath}"
+      ${makeEnvVars env}
+      exec ${emacsBin} \
+        --debug-init \
+        --no-init-file \
+        --no-site-file \
+        --no-site-lisp \
+        --load ${./.emacs.d/init.el} \
+        ${concatStringsSep "\n  " (map (el: "--load ${el} \\") load)}
+        "$@"
+    '';
+in
+{
+  inherit withEmacsPath;
+
+  nixos = { load ? [ ] }: withEmacsPath {
+    inherit load;
+    emacsBin = "${wpcarrosEmacs}/bin/emacs";
+  };
+
+  # Script that asserts my Emacs can initialize without warnings or errors.
+  check = runCommand "check-emacs" { } ''
+    # Even though Buildkite defines this, I'd still like still be able to test
+    # this locally without depending on my ability to remember to set CI=true.
+    export CI=true
+    export PATH="${emacsBinPath}:$PATH"
+    export EMACSLOADPATH="${loadPath}"
+    ${wpcarrosEmacs}/bin/emacs \
+      --no-site-file \
+      --no-site-lisp \
+      --no-init-file \
+      --script ${./ci.el} \
+      ${./.emacs.d/init.el} && \
+    touch $out
+  '';
+
+  meta.ci.targets = [ "check" ];
+}