{ pkgs, ... }: { programs.emacs = { enable = true; # install with tree sitter enabled package = (pkgs.emacs-pgtk.override { withTreeSitter = true; }); extraPackages = epkgs: [ # also install all tree sitter grammars epkgs.manualPackages.treesit-grammars.with-all-grammars epkgs.nerd-icons # nerd fonts support epkgs.doom-modeline # model line epkgs.diminish # hides modes from modeline epkgs.eldoc # doc support epkgs.pulsar # pulses the cursor when jumping about epkgs.which-key # help porcelain epkgs.expreg # expand region epkgs.vundo # undo tree epkgs.puni # structured editing epkgs.avy # jumping utility epkgs.consult # emacs right click epkgs.vertico # minibuffer completion epkgs.marginalia # annotations for completions epkgs.crux # utilities epkgs.magit # git porcelain epkgs.nerd-icons-corfu # nerd icons for completion epkgs.corfu # completion epkgs.cape # completion extensions epkgs.orderless # search paradigm epkgs.yasnippet # snippets support epkgs.yasnippet-snippets # commonly used snippets epkgs.rg # ripgrep epkgs.exec-path-from-shell # load env and path epkgs.eat # better shell epkgs.rust-mode # rust mode (when rust-ts doesn't cut it) epkgs.rustic # more rust things epkgs.nix-mode # nix lang epkgs.hcl-mode # hashicorp file mode epkgs.shell-pop # quick shell popup epkgs.envrc # support for loading .envrc epkgs.nixpkgs-fmt # format nix files epkgs.f # string + file utilities epkgs.gptel # llm chat (mainly claude) epkgs.catppuccin-theme # catppuccin theme epkgs.eldoc-box # docs in a box epkgs.sideline # mainly for flymake errors on the side epkgs.sideline-flymake # mainly for flymake errors on the side epkgs.sideline-eglot # mainly for flymake errors on the side ]; }; home.sessionVariables = { EDITOR = "emacs"; XDG_SCREENSHOTS_DIR = "~/screenshots"; }; home.file = { emacs-init = { source = ./early-init.el; target = ".emacs.d/early-init.el"; }; emacs = { source = ./init.el; target = ".emacs.d/init.el"; }; }; services.nextcloud-client = { enable = true; }; }