{ pkgs , config , lib , ... }: with lib; let cfg = config.eboskma.programs.emacs; emacsX11 = with pkgs; ((emacsPackagesFor emacsNativeComp).emacsWithPackages (epkgs: [ epkgs.emacsql epkgs.emacsql-sqlite ])); emacsWayland = with pkgs; ((emacsPackagesFor emacsPgtkNativeComp).emacsWithPackages (epkgs: [ epkgs.emacsql epkgs.emacsql-sqlite ])); orgProtocolDesktop = pkgs.makeDesktopItem { name = "org-protocol"; desktopName = "Emacs Org Protocol Handler"; icon = "emacs"; categories = [ "Development" "TextEditor" ]; keywords = [ "org-protocol" ]; type = "Application"; exec = "${cfg.package}/bin/emacsclient -- %u"; terminal = false; mimeTypes = [ "x-scheme-handler/org-protocol" ]; startupWMClass = "Emacs"; }; valeToINI = generators.toINIWithGlobalSection { mkKeyValue = generators.mkKeyValueDefault { mkValueString = v: if builtins.isList v then builtins.concatStringsSep ", " v else generators.mkValueStringDefault { } v; } " = "; }; in { options.eboskma.programs.emacs = { enable = mkEnableOption "activate emacs"; package = mkOption { description = "The emacs package to install"; type = types.package; default = emacsWayland; }; daemon = mkOption { description = "Whether to enable emacs daemon"; type = types.bool; default = true; example = false; }; }; config = mkIf cfg.enable { programs.emacs = { enable = true; package = cfg.package; }; services.emacs = mkIf cfg.daemon { enable = true; package = cfg.package; client.enable = true; socketActivation.enable = true; }; home.packages = with pkgs; [ (texlive.combine { inherit (texlive) scheme-small wrapfig ulem capt-of; }) orgProtocolDesktop nodePackages.bash-language-server aspell rnix-lsp python310 ] ++ (with aspellDicts; [ en en-computers en-science fy nl ]); }; }