diff options
Diffstat (limited to 'users/wpcarro/emacs/default.nix')
-rw-r--r-- | users/wpcarro/emacs/default.nix | 177 |
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" ]; +} |