{ config, pkgs, lib, ... }: let inherit (pkgs) stdenv; editorScript = pkgs.writeScriptBin "edit" '' #!${pkgs.runtimeShell} if [ -z "$1" ]; then exec ${config.programs.emacs.finalPackage}/bin/emacsclient --create-frame --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs else exec ${config.programs.emacs.finalPackage}/bin/emacsclient --alternate-editor ${config.programs.emacs.finalPackage}/bin/emacs "$@" fi ''; desktopApplicationFile = pkgs.writeTextFile { name = "emacsclient.desktop"; destination = "/share/applications/emacsclient.desktop"; text = '' [Desktop Entry] Name=Emacsclient GenericName=Text Editor Comment=Edit text MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++; Exec=${editorScript}/bin/edit %F Icon=emacs Type=Application Terminal=false Categories=Development;TextEditor; StartupWMClass=Emacs Keywords=Text;Editor; ''; }; in { programs.emacs = { enable = true; extraPackages = epkgs: (with epkgs; [ ace-link all-the-icons almost-mono-themes add-node-modules-path ag all-the-icons amx auto-async-byte-compile avy basic-theme bash-completion caddyfile-mode company company-web company-tabnine counsel counsel-projectile crux docker-compose-mode dockerfile-mode dired-git-info editorconfig eink-theme eldoc-box emmet-mode esh-autosuggest esh-buf-stack esh-help eshell-fringe-status eshell-toggle eshell-up evil evil-collection evil-commentary evil-magit evil-mu4e evil-org evil-quickscope evil-space evil-surround eyebrowse feature-mode fish-completion flycheck general git-gutter-fringe git-messenger git-timemachine gitattributes-mode gitconfig-mode gitignore-mode gitlab-ci-mode gitlab-ci-mode-flycheck goto-chg haskell-mode helpful ivy-hydra jinja2-mode js2-mode json-mode k8s-mode # kubernetes # kubernetes-evil ledger-mode lsp-mode lsp-ui lsp-haskell lsp-treemacs magit markdown-mode minions monotropic-theme moody nginx-mode nix-mode nix-update org-journal paredit php-mode posframe prettier-js projectile projectile-ripgrep quickrun rainbow-mode relative-buffers restclient ripgrep rjsx-mode scss-mode spacemacs-theme swiper toml-mode typescript-mode undo-tree use-package web-mode wgrep-ag ws-butler which-key yaml-mode ] ++ lib.optionals (!stdenv.isDarwin) [ pkgs.mu ]); }; home.packages = [ editorScript ]; home.sessionVariables = { EDITOR = "${editorScript}/bin/edit"; }; home.file.".emacs.d/init.el" = { source = ../emacs/.emacs.d/init.el; onChange = '' ${config.programs.emacs.finalPackage}/bin/emacs -batch -f batch-byte-compile .emacs.d/init.el ''; }; home.file.".emacs.d/eshell/" = { recursive = true; source = ../emacs/.emacs.d/eshell; }; home.file.".local/share/applications/emacsclient.desktop".source = desktopApplicationFile; }