{ pkgs, lib, config, inputs, ... }: let cfg = config.my.graphical.emacs; in { options.my.graphical.emacs = { enable = lib.mkEnableOption null; }; config = lib.mkIf cfg.enable (let inherit (inputs.emacs-overlay.overlays.package null pkgs) emacsPackagesFor; extraEpkgsMap = epkgs: extraEpkgList: map (extraEpkg: extraEpkg epkgs) extraEpkgList; org-modern-indent = epkgs: epkgs.trivialBuild rec { pname = "org-modern-indent"; version = "f2b859bc53107b2a1027b76dbf4aaebf14c03433"; src = pkgs.fetchFromGitHub { owner = "jdtsmith"; repo = pname; rev = version; hash = "sha256-vtbaa3MURnAI1ypLueuSfgAno0l51y3Owb7g+jkK6JU="; }; propagatedUserEnvPkgs = with epkgs; [ compat ]; buildInputs = propagatedUserEnvPkgs; }; eglot-booster = epkgs: epkgs.trivialBuild rec { pname = "eglot-booster"; version = "3f9159a8b7fe87e2f01280a2c4c98ca6dab49d13"; src = pkgs.fetchFromGitHub { owner = "jdtsmith"; repo = pname; rev = version; hash = "sha256-yRZci0foZUw2Thx1SwSoY0iPf2DmkAnRp6U+rdx1Bas="; }; propagatedUserEnvPkgs = []; }; extraPackages = epkgs: with epkgs; [ f dash undo-fu vundo god-mode multiple-cursors expand-region avy lispy ace-window goggles dtrt-indent aggressive-indent rainbow-delimiters highlight-indent-guides which-key eglot-java yasnippet yasnippet-snippets consult consult-yasnippet embark embark-consult orderless marginalia vertico corfu cape all-the-icons all-the-icons-completion treemacs treemacs-all-the-icons doom-modeline minions dirvish pdf-tools engrave-faces org-modern djvu nov auctex pkgs.asymptote ob-asymptote org-pdftools org-alert editorconfig envrc sly sly-asdf sly-named-readtables racket-mode haskell-mode lua-mode nix-mode arduino-mode arduino-cli-mode markdown-mode csv-mode meson-mode jinx minimap magit forge eat mpv lingva mastodon circe circe-notifications elfeed xkcd page-break-lines hl-todo ligature gruvbox-theme catppuccin-theme solaire-mode with-editor nyan-mode mu4e org-msg emacs-everywhere treesit-grammars.with-all-grammars ] ++ extraEpkgsMap epkgs [ eglot-booster org-modern-indent ]; alternateEmacsclient = pkgs.writeShellScript "alternate-emacsclient" '' ${pkgs.systemd}/bin/systemctl --user start emacs.service && \ exec ${config.programs.emacs.finalPackage}/bin/emacsclient -c -a "" "$@" ''; in { programs.emacs = { enable = true; package = (emacsPackagesFor pkgs.emacs29-pgtk).emacsWithPackages extraPackages; }; services.emacs = { enable = true; startWithUserSession = "graphical"; }; home = { sessionVariables.ALTERNATE_EDITOR = alternateEmacsclient; packages = with pkgs; [ emacs-lsp-booster emacs-all-the-icons-fonts gdb nil nodePackages.typescript-language-server hunspellDicts.en-us imagemagick ghostscript (texlive.combine { inherit (texlive) scheme-basic dvisvgm dvipng # Preview and export as html wrapfig amsmath ulem hyperref capt-of fontspec # Export code with engraved backend fvextra etoolbox fancyvrb upquote lineno tcolorbox pgf environ pdfcol xcolor float nopageno # Misc. extra stuff apa6 breakcites apacite natbib paralist booktabs caption threeparttable fancyhdr geometry gettitlestring times zapfchan asymptote titlesec preprint marvosym enumitem metafont ; }) pandoc ]; file.".clang-format".text = '' --- BasedOnStyle: LLVM IndentWidth: 4 TabWidth: 4 UseTab: Always ... ''; }; xdg.desktopEntries = let extendDefault = lib.recursiveUpdate { icon = "emacs"; terminal = false; type = "Application"; settings.Keywords = "emacsclient;"; actions = { new-window.name = "New Window"; new-instance.name = "New Instance"; }; }; in { emacsclient = extendDefault rec { name = "Emacs (Client)"; exec = "${config.programs.emacs.finalPackage}/bin/emacsclient -a ${alternateEmacsclient} -c %F"; genericName = "Text Editor"; comment = "Edit text"; mimeType = ["text/english" "text/plain" ]; categories = [ "Development" "TextEditor" ]; startupNotify = true; settings.StartupWMClass = "Emacs"; actions = { new-window = {inherit exec;}; new-instance.exec = "${config.programs.emacs.finalPackage}/bin/emacs %F"; }; }; emacsclient-mail = extendDefault rec { name = "Emacs (Mail, Client)"; exec = (pkgs.writeShellScript "emacsclient-mail" '' u=''${1//\\/\\\\} u=''${u//\"/\\\"} exec ${config.programs.emacs.finalPackage}/bin/emacsclient -a ${alternateEmacsclient} -c \ --eval "(message-mailto \"$u\")" '') + " %u"; comment = "GNU Emacs is an extensible, customizable text editor - and more"; mimeType = [ "x-scheme-handler/mailto" ]; noDisplay = true; actions = { new-window = {inherit exec;}; new-instance.exec = "${config.programs.emacs.finalPackage}/bin/emacs -f message-mailto %u"; }; }; }; }); }