about summary refs log blame commit diff
path: root/emacs/default.nix
blob: 22ac6d31e703ad56369e61a65b68d3410093dfc9 (plain) (tree)
1
2
3
4
5
6
7
8
9
              

   



                                                                             
                                                           
                                     




                    

            
     
 
                                                                               
 





                                           

                 
             
              
        
           



                                                                          
              


                     










                                                                               
                    


                                                            





                  













                        
             




















                                                                        
           















                        

        



















                                         
                                                                        
                                                                           
                           


                                    





                                                                       





                                
     


                                                                                
                                                 




                                                                             
{ pkgs, ... }:

let
  # NOTE: I'm trying to keep the list of dependencies herein constrained to a
  # list of generic dependencies (i.e. not project or language specific). For
  # language-specific tooling, I'm intending to use shell.nix alongside lorri
  # and direnv.
  emacsBinPath = pkgs.lib.strings.makeBinPath (with pkgs; [
    tdesktop # native telegram client
    ripgrep
    gitAndTools.hub
    kubectl
    google-cloud-sdk
    xsv
    scrot
    clipmenu
  ]);

  emacsWithPackages = (pkgs.emacsPackagesNgGen pkgs.emacs26).emacsWithPackages;

  wpcarrosEmacs = emacsWithPackages (epkgs:
    (with epkgs.elpaPackages; [
      exwm
    ]) ++

    (with epkgs.melpaPackages; [
      org-bullets
      sly
      notmuch
      elm-mode
      ts
      vterm
      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
      telephone-line
      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
    ]));

  vendorDir = builtins.path {
    path = ./.emacs.d/vendor;
    name = "emacs-vendor";
  };

  wpcDir = builtins.path {
    path = ./.emacs.d/wpc;
    name = "emacs-libs";
  };

  wpcPackageEl = builtins.path {
    path = ./.emacs.d/wpc/wpc-package.el;
    name = "wpc-package.el";
  };

  initEl = builtins.path {
    path = ./.emacs.d/init.el;
    name = "init.el";
  };

  withEmacsPath = emacsBin: pkgs.writeShellScriptBin "wpcarros-emacs" ''
    # TODO: Is this the best way to handle environment variables using Nix?
    export XMODIFIERS=emacs
    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 ${vendorDir} \
      --directory ${wpcDir} \
      --load ${wpcPackageEl} \
      --load ${initEl} \
      --no-init-file \
      $@
  '';
in {
  # Use `nix-env -f '<briefcase>' emacs.glinux` to install `wpcarro-emacs` on
  # gLinux machines. This will ensure that X and GL linkage behaves as expected.
  glinux = withEmacsPath "/usr/bin/google-emacs";

  # Use `nix-env -f '<briefcase>' emacs.nixos` to install `wpcarros-emacs` on
  # NixOS machines.
  nixos = withEmacsPath "${wpcarrosEmacs}/bin/emacs";
}