From d3ea8b3667a9be01f6320e901d53121c33f7dec4 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 22 Jan 2025 21:01:34 -0500 Subject: [PATCH 1/3] Introduce a plainmacs emacs install flavor. --- nix/configuration/hosts/neelix/default.nix | 1 + nix/configuration/hosts/odo/default.nix | 1 + nix/configuration/roles/emacs/default.nix | 152 +++++++++++++-------- 3 files changed, 100 insertions(+), 54 deletions(-) diff --git a/nix/configuration/hosts/neelix/default.nix b/nix/configuration/hosts/neelix/default.nix index 926d60c..870e21e 100644 --- a/nix/configuration/hosts/neelix/default.nix +++ b/nix/configuration/hosts/neelix/default.nix @@ -28,4 +28,5 @@ me.kodi.enable = true; me.bluetooth.enable = true; + me.emacs_flavor = "plainmacs"; } diff --git a/nix/configuration/hosts/odo/default.nix b/nix/configuration/hosts/odo/default.nix index 5690f4d..defc7df 100644 --- a/nix/configuration/hosts/odo/default.nix +++ b/nix/configuration/hosts/odo/default.nix @@ -34,4 +34,5 @@ me.sway.enable = true; me.ansible.enable = true; + me.emacs_flavor = "full"; } diff --git a/nix/configuration/roles/emacs/default.nix b/nix/configuration/roles/emacs/default.nix index 86c862b..695ce9c 100644 --- a/nix/configuration/roles/emacs/default.nix +++ b/nix/configuration/roles/emacs/default.nix @@ -39,69 +39,113 @@ let e_shorthand = pkgs.writeShellScriptBin "e" '' exec ${pkgs.emacs_full}/bin/emacs "''${@}" ''; + plain_e_shorthand = pkgs.writeShellScriptBin "e" '' + exec ${pkgs.emacs29-pgtk}/bin/emacs "''${@}" + ''; in { imports = [ ]; - config = lib.mkMerge [ - { - environment.systemPackages = with pkgs; [ - plainmacs - e_shorthand - emacs_full - ]; + options.me.emacs_flavor = lib.mkOption { + type = lib.types.nullOr ( + lib.types.enum [ + "full" + "plainmacs" + ] + ); + default = null; + example = "full"; + description = "What flavor of emacs to set up."; + }; - nixpkgs.overlays = [ - (final: prev: { - emacs_full = pkgs.symlinkJoin { - name = "emacs_full"; - paths = [ pkgs.emacs29-pgtk ]; - buildInputs = [ pkgs.makeWrapper ]; - postBuild = '' - wrapProgram $out/bin/emacs --prefix PATH : ${ - lib.makeBinPath [ - (pkgs.aspellWithDicts ( - dicts: with dicts; [ - en - en-computers + config = + lib.mkIf config.me.emacs_flavor != null ( + lib.mkMerge [ + (lib.mkIf (config.me.emacs_flavor == "full") { + environment.systemPackages = with pkgs; [ + plainmacs + e_shorthand + emacs_full + ]; + + nixpkgs.overlays = [ + (final: prev: { + emacs_full = pkgs.symlinkJoin { + name = "emacs_full"; + paths = [ pkgs.emacs29-pgtk ]; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/emacs --prefix PATH : ${ + lib.makeBinPath [ + (pkgs.aspellWithDicts ( + dicts: with dicts; [ + en + en-computers + ] + )) + pkgs.nixd # nix language server + pkgs.nixfmt-rfc-style # auto-formatting nix files through nixd + pkgs.clang # To compile tree-sitter grammars + pkgs.shellcheck ] - )) - pkgs.nixd # nix language server - pkgs.nixfmt-rfc-style # auto-formatting nix files through nixd - pkgs.clang # To compile tree-sitter grammars - ] - } - ''; + } + ''; + }; + }) + ]; + + home-manager.users.talexander = + { pkgs, ... }: + { + home.file.".config/emacs" = { + source = ./files/emacs; + recursive = true; + }; + }; + + environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { + hideMounts = true; + users.talexander = { + directories = [ + ".config/emacs/eln-cache" # Installed packages + ".config/emacs/elpa" # Installed packages + ".config/emacs/private" # For recentf + ".config/emacs/tree-sitter" # Compiled tree-sitter grammars + ]; + files = [ + ".config/emacs/history" # For savehist + ".config/emacs/.last-package-update-day" # For use-package + ]; + }; }; + + environment.variables.EDITOR = "${plainmacs}/bin/plainmacs"; }) - ]; + (lib.mkIf (config.me.emacs_flavor == "plainmacs") { + environment.systemPackages = with pkgs; [ + emacs29-pgtk + plainmacs + plain_e_shorthand + ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/emacs" = { - source = ./files/emacs; - recursive = true; + environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { + hideMounts = true; + users.talexander = { + directories = [ + ".config/emacs/eln-cache" # Installed packages + ".config/emacs/elpa" # Installed packages + ".config/emacs/private" # For recentf + ".config/emacs/tree-sitter" # Compiled tree-sitter grammars + ]; + files = [ + ".config/emacs/history" # For savehist + ".config/emacs/.last-package-update-day" # For use-package + ]; + }; }; - }; - environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { - hideMounts = true; - users.talexander = { - directories = [ - ".config/emacs/eln-cache" # Installed packages - ".config/emacs/elpa" # Installed packages - ".config/emacs/private" # For recentf - ".config/emacs/tree-sitter" # Compiled tree-sitter grammars - ]; - files = [ - ".config/emacs/history" # For savehist - ".config/emacs/.last-package-update-day" # For use-package - ]; - }; - }; - - environment.variables.EDITOR = "${plainmacs}/bin/plainmacs"; - } - ]; + environment.variables.EDITOR = "${plainmacs}/bin/plainmacs"; + }) + ] + ); } From 054e056d007d717a2be0c3720d24529b4c602fcc Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Wed, 22 Jan 2025 21:26:14 -0500 Subject: [PATCH 2/3] Switch to buildEnv instead of symlinkJoin for better control over the joining process. --- nix/configuration/roles/emacs/default.nix | 230 +++++++++++----------- 1 file changed, 115 insertions(+), 115 deletions(-) diff --git a/nix/configuration/roles/emacs/default.nix b/nix/configuration/roles/emacs/default.nix index 695ce9c..93fb2dc 100644 --- a/nix/configuration/roles/emacs/default.nix +++ b/nix/configuration/roles/emacs/default.nix @@ -6,42 +6,43 @@ }: let - plainmacs = pkgs.writeShellScriptBin "plainmacs" '' - INIT_SCRIPT=$(cat < Date: Thu, 23 Jan 2025 01:52:37 -0500 Subject: [PATCH 3/3] Add support for non-graphical emacs. --- nix/configuration/roles/emacs/default.nix | 46 +++++++++++++++-------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/nix/configuration/roles/emacs/default.nix b/nix/configuration/roles/emacs/default.nix index 93fb2dc..ce89404 100644 --- a/nix/configuration/roles/emacs/default.nix +++ b/nix/configuration/roles/emacs/default.nix @@ -63,9 +63,9 @@ in lib.mkMerge [ { environment.systemPackages = with pkgs; [ - emacs29-pgtk - (plainmacs emacs29-pgtk) - (e_shorthand emacs29-pgtk) + my_emacs + (plainmacs my_emacs) + (e_shorthand my_emacs) ]; environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { @@ -84,35 +84,49 @@ in }; }; - environment.variables.EDITOR = "${pkgs.emacs29-pgtk}/bin/plainmacs"; + environment.variables.EDITOR = "${pkgs.my_emacs}/bin/plainmacs"; } + (lib.mkIf (config.me.graphical) { + nixpkgs.overlays = [ + (final: prev: { + my_emacs = final.emacs29-pgtk; + }) + ]; + }) + (lib.mkIf (!config.me.graphical) { + nixpkgs.overlays = [ + (final: prev: { + my_emacs = final.emacs-nox; + }) + ]; + }) (lib.mkIf (config.me.emacs_flavor == "full") { nixpkgs.overlays = [ (final: prev: { - emacs29-pgtk = pkgs.buildEnv { - name = prev.emacs29-pgtk.name; + my_emacs = pkgs.buildEnv { + name = prev.my_emacs.name; paths = with prev; [ - emacs29-pgtk + my_emacs ]; extraOutputsToInstall = [ "man" "doc" "info" ]; - buildInputs = [ pkgs.makeWrapper ]; + buildInputs = [ final.makeWrapper ]; postBuild = '' wrapProgram $out/bin/emacs --prefix PATH : ${ lib.makeBinPath [ - (pkgs.aspellWithDicts ( + (final.aspellWithDicts ( dicts: with dicts; [ en en-computers ] )) - pkgs.nixd # nix language server - pkgs.nixfmt-rfc-style # auto-formatting nix files through nixd - pkgs.clang # To compile tree-sitter grammars - pkgs.shellcheck + final.nixd # nix language server + final.nixfmt-rfc-style # auto-formatting nix files through nixd + final.clang # To compile tree-sitter grammars + final.shellcheck ] } ''; @@ -132,10 +146,10 @@ in (lib.mkIf (config.me.emacs_flavor == "plainmacs") { nixpkgs.overlays = [ (final: prev: { - emacs29-pgtk = pkgs.buildEnv { - name = prev.emacs29-pgtk.name; + my_emacs = pkgs.buildEnv { + name = prev.my_emacs.name; paths = with prev; [ - emacs29-pgtk + my_emacs ]; extraOutputsToInstall = [ "man"