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}