{ pkgs, config, lib, ... }: with lib; let cfg = config.eboskma.programs.emacs; plantuml-client = pkgs.writeShellApplication { name = "plantuml-client"; runtimeInputs = with pkgs; [ coreutils xh ]; text = '' type= while getopts ":t:" option; do case "''${option}" in t) type="''${OPTARG}";; \?) ;; esac done tempfile=$(mktemp --suffix plantuml) while IFS= read -r line; do echo "''${line}" >> "''${tempfile}" done encoded=$(xh --print=b post http://localhost:5080/plantuml/coder Content-Type:text/plain < "''${tempfile}") rm "''${tempfile}" xh get "http://localhost:5080/plantuml/''${type}/''${encoded}" ''; }; tangleEmacsConfig = initFile: pkgs.runCommand "tangled-emacs-${initFile}" { } '' cp ${./config.org} ./config.org ${cfg.package}/bin/emacs --batch --quick --load org ./config.org --funcall org-babel-tangle cp ${initFile} $out ''; tree-sitter-qml = pkgs.tree-sitter.buildGrammar { language = "tree-sitter-qmljs"; version = "unstable-2024-02-02"; src = pkgs.fetchFromGitHub { owner = "yuja"; repo = "tree-sitter-qmljs"; rev = "9fa49ff3315987f715ce5666ff979a7742fa8a98"; hash = "sha256-q20gLVLs0LpqRpgo/qNRDfExbWXhICWZjM1ux4+AT6M="; }; }; emacsWithPackages = pkgs.emacsWithPackagesFromUsePackage { config = let tangledOrgConfig = tangleEmacsConfig "init.el"; in builtins.readFile tangledOrgConfig; defaultInitFile = true; package = cfg.package; alwaysEnsure = true; alwaysTangle = true; extraEmacsPackages = epkgs: with epkgs; [ vterm (treesit-grammars.with-grammars ( p: with p; [ tree-sitter-bash tree-sitter-c tree-sitter-c-sharp tree-sitter-css tree-sitter-cmake tree-sitter-comment tree-sitter-commonlisp tree-sitter-cpp tree-sitter-css tree-sitter-cuda tree-sitter-devicetree tree-sitter-dockerfile tree-sitter-dot tree-sitter-eex tree-sitter-elisp tree-sitter-elixir tree-sitter-embedded-template tree-sitter-erlang tree-sitter-fish tree-sitter-gleam tree-sitter-glsl tree-sitter-go tree-sitter-gomod tree-sitter-gowork tree-sitter-graphql tree-sitter-haskell tree-sitter-hcl tree-sitter-heex tree-sitter-html tree-sitter-http tree-sitter-javascript tree-sitter-jsdoc tree-sitter-json tree-sitter-latex tree-sitter-llvm tree-sitter-lua tree-sitter-make tree-sitter-markdown tree-sitter-markdown-inline tree-sitter-nix tree-sitter-nu tree-sitter-pioasm tree-sitter-python tree-sitter-qml tree-sitter-query tree-sitter-regex tree-sitter-rst tree-sitter-ruby tree-sitter-rust tree-sitter-scheme tree-sitter-scss tree-sitter-sql tree-sitter-surface tree-sitter-svelte tree-sitter-toml tree-sitter-tsx tree-sitter-typescript tree-sitter-verilog tree-sitter-yaml tree-sitter-zig ] )) ]; }; orgProtocolDesktop = pkgs.makeDesktopItem { name = "org-protocol"; desktopName = "Emacs Org Protocol Handler"; icon = "emacs"; categories = [ "Development" "TextEditor" ]; keywords = [ "org-protocol" ]; type = "Application"; exec = "${emacsWithPackages}/bin/emacsclient -- %u"; terminal = false; mimeTypes = [ "x-scheme-handler/org-protocol" ]; startupWMClass = "Emacs"; }; in { options.eboskma.programs.emacs = { enable = mkEnableOption "activate emacs"; package = mkPackageOption pkgs "emacs" { }; daemon = mkOption { description = "Whether to enable emacs daemon"; type = types.bool; default = true; example = false; }; }; config = mkIf cfg.enable { programs.emacs = { enable = true; package = emacsWithPackages; }; services.emacs = mkIf cfg.daemon { enable = true; package = emacsWithPackages; client.enable = true; socketActivation.enable = true; }; home.file."emacs.d/early-init.el".source = tangleEmacsConfig "early-init.el"; home.packages = with pkgs; [ (texlive.combine { inherit (texlive) scheme-small wrapfig ulem capt-of ; }) orgProtocolDesktop bash-language-server aspell lldb (nil.overrideAttrs (_: { doCheck = false; })) nixfmt-rfc-style python3 plantuml-client ] ++ (with aspellDicts; [ en en-computers en-science fy nl ]); }; }