{ config, lib, pkgs, materusArg, ... }: let packages = epkgs: with epkgs; [ load-relative elcord persp-mode dashboard magit helm avy corfu vterm centaur-tabs projectile company clipetty treemacs treemacs-nerd-icons treemacs-perspective treemacs-icons-dired treemacs-magit treemacs-projectile tree-edit vertico nerd-icons nerd-icons-completion perspective minions telephone-line rainbow-delimiters use-package cmake-mode lsp-mode lsp-java lsp-jedi lsp-haskell lsp-ui lsp-treemacs dap-mode d-mode multiple-cursors org org-rainbow-tags org-roam org-roam-ui org-review markdown-mode json-mode nix-mode minimap moe-theme doom-themes ]; default-config = '' (defvar materus/nix-packages t) (defvar materus/init-from-home nil) (defvar materus/init-from-default nil) (when (not materus/init-from-home) (setq-default materus/home-dir (concat user-emacs-directory "materus/" )) (setq-default materus/init-from-default t) (message "Config loading not from homeDir, need "materus/init-from-home" variable in init.el") ${setNixInit} (require 'materus-config) ) ''; materus-config = epkgs: epkgs.trivialBuild rec { pname = "materus-config"; src = pkgs.symlinkJoin { name = "materus-emacs-config"; paths = [ configPath ]; }; version = "1.0"; packageRequires = (packages epkgs); buildPhase = '' runHook preBuild emacs -L . --batch -f batch-byte-compile **/*.el emacs -L . --batch -f batch-byte-compile *.el runHook postBuild ''; installPhase = '' runHook preInstall LISPDIR=$out/share/emacs/site-lisp install -d $LISPDIR install **.el **.elc $LISPDIR cp -r materus $LISPDIR emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")" runHook postInstall ''; }; cfg = config.materus.profile.editor.emacs; configPath = "${materusArg.cfg.path}" + "/extraFiles/config/emacs/"; emacsPkgs = with pkgs;[ python3 lua multimarkdown git ]; setNixInit = '' (setenv "PATH" (concat (getenv "PATH") ":${lib.makeBinPath emacsPkgs}")) ${builtins.concatStringsSep "\n" (builtins.map (x: "(setq exec-path (append exec-path '(\""+x+"/bin\")))" ) emacsPkgs)} (call-process-shell-command "${pkgs.xorg.xmodmap}/bin/xmodmap -e \"keycode 66 = Hyper_L\" -e \"remove Mod4 = Hyper_L\" -e \"add Mod3 = Hyper_L\" &" nil 0) ''; in { options.materus.profile.editor.emacs.enable = materusArg.pkgs.lib.mkBoolOpt false "Enable emacs with materus cfg"; config = lib.mkIf cfg.enable { home.activation.emacsCompile = lib.hm.dag.entryAfter [ "linkGeneration" ] '' ${config.programs.emacs.finalPackage}/bin/emacs --batch \ --eval '(setq warning-minimum-log-level :error)' \ --eval '(byte-recompile-directory "${config.xdg.configHome}/emacs/materus" 0 t)' \ --eval '(byte-recompile-file "${config.xdg.configHome}/emacs/init.el")' ''; xdg.configFile."emacs/init.el".text = '' (setq inhibit-defaul-init 1) (setq native-comp-speed 3) (defvar materus/nix-packages nil) (defvar materus/init-from-home t) (defvar materus/init-from-default nil) ${setNixInit} (setq-default materus/init-from-home t) (setq-default materus/home-dir (concat user-emacs-directory "materus/" )) (setq-default materus/nix-packages (require 'materus-config nil 'noerror)) (when (not materus/nix-packages) (load (concat user-emacs-directory "materus/init")) (message "Config loaded from user dir") ) ''; xdg.configFile."emacs/materus" = { source = configPath + "materus"; recursive = true; }; programs.emacs = { enable = true; package = with pkgs; lib.mkDefault (emacs29.override { withX = true; withGTK3 = true; withAlsaLib = true; withGconf = true; withImageMagick = true; withXwidgets = true; }); extraPackages = epkgs: ((packages epkgs) ++ [(materus-config epkgs)]); extraConfig = default-config; }; }; }