From 1bedcc8740b9aa2f7d3e1312a6c88baf00909f54 Mon Sep 17 00:00:00 2001 From: Garklein Date: Fri, 15 May 2026 09:53:28 -0400 Subject: [PATCH] exwm: add module adapted from nixpkgs's exwm service --- .../misc/news/2026/05/2026-05-15_09-37-08.nix | 8 +++ modules/services/window-managers/default.nix | 1 + modules/services/window-managers/exwm.nix | 62 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 modules/misc/news/2026/05/2026-05-15_09-37-08.nix create mode 100644 modules/services/window-managers/exwm.nix diff --git a/modules/misc/news/2026/05/2026-05-15_09-37-08.nix b/modules/misc/news/2026/05/2026-05-15_09-37-08.nix new file mode 100644 index 000000000..426f473f2 --- /dev/null +++ b/modules/misc/news/2026/05/2026-05-15_09-37-08.nix @@ -0,0 +1,8 @@ +{ + time = "2026-05-15T13:37:08+00:00"; + condition = true; + message = '' + A new module is available: `xsession.windowManager.exwm`. This + provides configuration for the Emacs X Window Manager. + ''; +} diff --git a/modules/services/window-managers/default.nix b/modules/services/window-managers/default.nix index 43f132c02..f4fb544cf 100644 --- a/modules/services/window-managers/default.nix +++ b/modules/services/window-managers/default.nix @@ -2,6 +2,7 @@ imports = [ ./awesome.nix ./bspwm + ./exwm.nix ./fluxbox.nix ./herbstluftwm.nix ./hyprland.nix diff --git a/modules/services/window-managers/exwm.nix b/modules/services/window-managers/exwm.nix new file mode 100644 index 000000000..24dfb9c94 --- /dev/null +++ b/modules/services/window-managers/exwm.nix @@ -0,0 +1,62 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + meta.maintainers = [ lib.hm.maintainers.garklein ]; + + options = { + xsession.windowManager.exwm = { + enable = lib.mkEnableOption "exwm"; + + loadScript = lib.mkOption { + default = "(require 'exwm)"; + type = lib.types.lines; + example = '' + (require 'exwm) + (exwm-enable) + ''; + description = '' + Emacs lisp code to be run after loading the user's init + file. + ''; + }; + + package = lib.mkPackageOption pkgs "emacs" { + example = [ "emacs-gtk" ]; + }; + + extraPackages = lib.mkOption { + type = lib.types.functionTo (lib.types.listOf lib.types.package); + default = _epkgs: [ ]; + defaultText = lib.literalExpression "epkgs: []"; + example = lib.literalExpression '' + epkgs: [ + epkgs.emms + epkgs.magit + epkgs.proof-general + ] + ''; + description = '' + Extra packages available to Emacs. The value must be a + function which receives the attrset defined in + {var}`emacs.pkgs` as the sole argument. + ''; + }; + }; + }; + + config = + let + cfg = config.xsession.windowManager.exwm; + exwm-emacs = cfg.package.pkgs.withPackages (epkgs: cfg.extraPackages epkgs ++ [ epkgs.exwm ]); + in + lib.mkIf cfg.enable { + home.packages = [ exwm-emacs ]; + xsession.windowManager.command = '' + ${exwm-emacs}/bin/emacs -l ${pkgs.writeText "emacs-exwm-load" "${cfg.loadScript}"} + ''; + }; +}