1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.xserver.windowManager.exwm; 7 loadScript = pkgs.writeText "emacs-exwm-load" '' 8 ${cfg.loadScript} 9 ${optionalString cfg.enableDefaultConfig '' 10 (require 'exwm-config) 11 (exwm-config-default) 12 ''} 13 ''; 14 packages = epkgs: cfg.extraPackages epkgs ++ [ epkgs.exwm ]; 15 exwm-emacs = pkgs.emacsWithPackages packages; 16in 17 18{ 19 options = { 20 services.xserver.windowManager.exwm = { 21 enable = mkEnableOption "exwm"; 22 loadScript = mkOption { 23 default = "(require 'exwm)"; 24 type = types.lines; 25 example = literalExample '' 26 (require 'exwm) 27 (exwm-enable) 28 ''; 29 description = '' 30 Emacs lisp code to be run after loading the user's init 31 file. If enableDefaultConfig is true, this will be run 32 before loading the default config. 33 ''; 34 }; 35 enableDefaultConfig = mkOption { 36 default = true; 37 type = lib.types.bool; 38 description = "Enable an uncustomised exwm configuration."; 39 }; 40 extraPackages = mkOption { 41 type = types.functionTo (types.listOf types.package); 42 default = self: []; 43 example = literalExample '' 44 epkgs: [ 45 epkgs.emms 46 epkgs.magit 47 epkgs.proofgeneral 48 ] 49 ''; 50 description = '' 51 Extra packages available to Emacs. The value must be a 52 function which receives the attrset defined in 53 <varname>emacs.pkgs</varname> as the sole argument. 54 ''; 55 }; 56 }; 57 }; 58 59 config = mkIf cfg.enable { 60 services.xserver.windowManager.session = singleton { 61 name = "exwm"; 62 start = '' 63 ${exwm-emacs}/bin/emacs -l ${loadScript} 64 ''; 65 }; 66 environment.systemPackages = [ exwm-emacs ]; 67 }; 68}