diff --git a/modules/dev/emacs/common.nix b/modules/dev/emacs/common.nix index dca8aca..86186b3 100644 --- a/modules/dev/emacs/common.nix +++ b/modules/dev/emacs/common.nix @@ -24,8 +24,20 @@ let inherit (pkgs) xdotool; } ); + doomDir = ../../../dotfiles/doom; + templateFiles = { + "events.org" = ../../../dotfiles/doom/templates/events.org; + "default.org" = ../../../dotfiles/doom/templates/default.org; + "programming.org" = ../../../dotfiles/doom/templates/programming.org; + }; + templateDataFiles = { + "doom/templates/events.org".source = templateFiles."events.org"; + "doom/templates/default.org".source = templateFiles."default.org"; + "doom/templates/programming.org".source = templateFiles."programming.org"; + }; in { + inherit doomDir templateDataFiles templateFiles; packages = linuxWindowPackages ++ clipboardPackages diff --git a/modules/dev/emacs/home.nix b/modules/dev/emacs/home.nix index 523f872..6aadfb0 100644 --- a/modules/dev/emacs/home.nix +++ b/modules/dev/emacs/home.nix @@ -33,11 +33,7 @@ in } (lib.mkIf cfg.enable { home.packages = emacs.packages; - xdg.dataFile = { - "doom/templates/events.org".source = ../../../dotfiles/doom/templates/events.org; - "doom/templates/default.org".source = ../../../dotfiles/doom/templates/default.org; - "doom/templates/programming.org".source = ../../../dotfiles/doom/templates/programming.org; - }; + xdg.dataFile = emacs.templateDataFiles; services = { lorri.enable = pkgs.stdenv.isLinux; emacs = { @@ -51,7 +47,7 @@ in }; programs.doom-emacs = { enable = true; - doomDir = ../../../dotfiles/doom; + inherit (emacs) doomDir; doomLocalDir = "${config.xdg.dataHome}/nix-doom"; tangleArgs = "--all config.org"; inherit (emacs) extraPackages; diff --git a/modules/dev/emacs/portable.nix b/modules/dev/emacs/portable.nix new file mode 100644 index 0000000..dec8eba --- /dev/null +++ b/modules/dev/emacs/portable.nix @@ -0,0 +1,109 @@ +{ + inputs, + pkgs, + ... +}: +let + emacs = import ./common.nix { + lib = pkgs.lib; + inherit pkgs; + stylixEnabled = false; + emacsExtraConfig = ""; + emacsExtraPackages = _epkgs: [ ]; + }; + portableFonts = + let + customFonts = pkgs.stdenvNoCC.mkDerivation { + name = "portable-emacs-fonts"; + src = inputs.fonts; + installPhase = '' + mkdir -p $out/share/fonts + find $src -type f \( \ + -name "*.ttf" -o \ + -name "*.otf" -o \ + -name "*.woff" -o \ + -name "*.woff2" \ + \) -exec cp {} $out/share/fonts/ \; + ''; + }; + in + builtins.attrValues { + inherit customFonts; + inherit (pkgs.nerd-fonts) + comic-shanns-mono + iosevka + caskaydia-cove + ; + }; + portableHome = inputs.home-manager.lib.homeManagerConfiguration { + inherit pkgs; + modules = [ + ../../../modules/home-manager.nix + ../../../config/home-manager.nix + { + home = { + username = "portable"; + homeDirectory = if pkgs.stdenv.isDarwin then "/Users/portable" else "/home/portable"; + stateVersion = "23.05"; + }; + programs.home-manager.enable = true; + nixpkgs.config.allowUnfree = true; + my = { + emacs.enable = true; + dev = { + nix.enable = true; + python.enable = true; + sh.enable = true; + }; + shell.tools.enable = true; + }; + } + ]; + extraSpecialArgs = { + inherit inputs; + outputs = inputs.self; + osConfig = null; + preferredShell = "zsh"; + userEmail = "danilo.reyes.251@proton.me"; + }; + }; + templateFarm = pkgs.linkFarm "portable-emacs-templates" ( + builtins.attrNames emacs.templateFiles + |> map (name: { + inherit name; + path = emacs.templateFiles.${name}; + }) + ); + fontConfig = pkgs.makeFontsConf { + fontDirectories = map (font: "${font}/share/fonts") portableFonts; + }; + package = pkgs.writeShellApplication { + name = "doom-emacs"; + runtimeInputs = [ + portableHome.config.programs.doom-emacs.finalEmacsPackage + ] + ++ portableHome.config.home.packages; + text = '' + export HOME="''${HOME:?HOME must be set}" + export XDG_CONFIG_HOME="''${XDG_CONFIG_HOME:-$HOME/.config}" + export XDG_CACHE_HOME="''${XDG_CACHE_HOME:-$HOME/.cache}" + export XDG_STATE_HOME="''${XDG_STATE_HOME:-$HOME/.local/state}" + export XDG_DATA_HOME="''${XDG_DATA_HOME:-$HOME/.local/share}" + export DOOMDIR="${emacs.doomDir}" + export DOOMLOCALDIR="$XDG_DATA_HOME/nix-doom" + export FONTCONFIG_FILE="${fontConfig}" + mkdir -p "$XDG_DATA_HOME/doom/templates" "$DOOMLOCALDIR" "$XDG_CACHE_HOME" "$XDG_STATE_HOME" + ln -sfn "${templateFarm}/events.org" "$XDG_DATA_HOME/doom/templates/events.org" + ln -sfn "${templateFarm}/default.org" "$XDG_DATA_HOME/doom/templates/default.org" + ln -sfn "${templateFarm}/programming.org" "$XDG_DATA_HOME/doom/templates/programming.org" + exec ${portableHome.config.programs.doom-emacs.finalEmacsPackage}/bin/emacs "$@" + ''; + }; +in +{ + inherit package; + app = { + type = "app"; + program = "${package}/bin/doom-emacs"; + }; +} diff --git a/parts/packages.nix b/parts/packages.nix index 4ab3614..9c9b2ec 100644 --- a/parts/packages.nix +++ b/parts/packages.nix @@ -3,6 +3,9 @@ perSystem = { system, pkgs, ... }: let + portableEmacs = import ../modules/dev/emacs/portable.nix { + inherit inputs pkgs; + }; mcpServerPkg = pkgs.python3Packages.buildPythonPackage { pname = "nixos-mcp-server"; version = "0.1.0"; @@ -52,9 +55,11 @@ }; in { + apps.doom-emacs = portableEmacs.app; packages = (inputs.jawz-scripts.packages.${system} or { }) // { + doom-emacs = portableEmacs.package; mcp-tests = mcpTests; nixos-mcp = nixosMcp; nixos-mcp-server = mcpServerPkg;