aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/programs/alot.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/programs/alot.nix')
-rw-r--r--home-manager/modules/programs/alot.nix342
1 files changed, 203 insertions, 139 deletions
diff --git a/home-manager/modules/programs/alot.nix b/home-manager/modules/programs/alot.nix
index 2b28f34caa3..e907cd3e0ac 100644
--- a/home-manager/modules/programs/alot.nix
+++ b/home-manager/modules/programs/alot.nix
@@ -7,167 +7,231 @@ let
cfg = config.programs.alot;
- alotAccounts = filter (a: a.notmuch.enable)
- (attrValues config.accounts.email.accounts);
+ alotAccounts =
+ filter (a: a.notmuch.enable) (attrValues config.accounts.email.accounts);
boolStr = v: if v then "True" else "False";
- accountStr = account: with account;
- concatStringsSep "\n" (
- [ "[[${name}]]" ]
- ++ mapAttrsToList (n: v: n + "=" + v) (
- {
- address = address;
- realname = realName;
- sendmail_command =
- optionalString (alot.sendMailCommand != null) alot.sendMailCommand;
- sent_box = "maildir" + "://" + maildir.absPath + "/" + folders.sent;
- draft_box = "maildir" + "://"+ maildir.absPath + "/" + folders.drafts;
- }
- // optionalAttrs (aliases != []) {
- aliases = concatStringsSep "," aliases;
- }
- // optionalAttrs (gpg != null) {
- gpg_key = gpg.key;
- encrypt_by_default = if gpg.encryptByDefault then "all" else "none";
- sign_by_default = boolStr gpg.signByDefault;
- }
- // optionalAttrs (signature.showSignature != "none") {
- signature = pkgs.writeText "signature.txt" signature.text;
- signature_as_attachment =
- boolStr (signature.showSignature == "attach");
- }
- )
- ++ [ alot.extraConfig ]
- ++ [ "[[[abook]]]" ]
- ++ mapAttrsToList (n: v: n + "=" + v) alot.contactCompletion
- );
-
- configFile =
- let
- bindingsToStr = attrSet:
- concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${v}") attrSet);
- in
- ''
- # Generated by Home Manager.
- # See http://alot.readthedocs.io/en/latest/configuration/config_options.html
-
- ${cfg.extraConfig}
-
- [bindings]
- ${bindingsToStr cfg.bindings.global}
-
- [[bufferlist]]
- ${bindingsToStr cfg.bindings.bufferlist}
- [[search]]
- ${bindingsToStr cfg.bindings.search}
- [[envelope]]
- ${bindingsToStr cfg.bindings.envelope}
- [[taglist]]
- ${bindingsToStr cfg.bindings.taglist}
- [[thread]]
- ${bindingsToStr cfg.bindings.thread}
-
- [accounts]
-
- ${concatStringsSep "\n\n" (map accountStr alotAccounts)}
- '';
-
-in
-
-{
- options.programs.alot = {
- enable = mkOption {
- type = types.bool;
- default = false;
- example = true;
- description = ''
- Whether to enable the Alot mail user agent. Alot uses the
- Notmuch email system and will therefore be automatically
- enabled for each email account that is managed by Notmuch.
- '';
- };
+ mkKeyValue = key: value:
+ let value' = if isBool value then boolStr value else toString value;
+ in "${key} = ${value'}";
+
+ mk2ndLevelSectionName = name: "[" + name + "]";
+
+ tagSubmodule = types.submodule {
+ options = {
+ translated = mkOption {
+ type = types.nullOr types.str;
+ description = ''
+ Fixed string representation for this tag. The tag can be
+ hidden from view, if the key translated is set to
+ <literal>""</literal>, the empty string.
+ '';
+ };
- hooks = mkOption {
- type = types.lines;
- default = "";
- description = ''
- Content of the hooks file.
- '';
- };
+ translation = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ A pair of strings that define a regular substitution to
+ compute the string representation on the fly using
+ <literal>re.sub</literal>.
+ '';
+ };
- bindings = mkOption {
- type = types.submodule {
- options = {
- global = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Global keybindings.";
- };
+ normal = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ example = "'','', 'white','light red', 'white','#d66'";
+ description = ''
+ How to display the tag when unfocused.
+ See <link xlink:href="https://alot.readthedocs.io/en/latest/configuration/theming.html#tagstring-formatting"/>.
+ '';
+ };
- bufferlist = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Bufferlist mode keybindings.";
- };
+ focus = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = "How to display the tag when focused.";
+ };
+ };
+ };
- search = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Search mode keybindings.";
- };
+ accountStr = account:
+ with account;
+ concatStringsSep "\n" ([ "[[${name}]]" ]
+ ++ mapAttrsToList (n: v: n + "=" + v) ({
+ address = address;
+ realname = realName;
+ sendmail_command =
+ optionalString (alot.sendMailCommand != null) alot.sendMailCommand;
+ sent_box = "maildir" + "://" + maildir.absPath + "/" + folders.sent;
+ draft_box = "maildir" + "://" + maildir.absPath + "/" + folders.drafts;
+ } // optionalAttrs (aliases != [ ]) {
+ aliases = concatStringsSep "," aliases;
+ } // optionalAttrs (gpg != null) {
+ gpg_key = gpg.key;
+ encrypt_by_default = if gpg.encryptByDefault then "all" else "none";
+ sign_by_default = boolStr gpg.signByDefault;
+ } // optionalAttrs (signature.showSignature != "none") {
+ signature = pkgs.writeText "signature.txt" signature.text;
+ signature_as_attachment = boolStr (signature.showSignature == "attach");
+ }) ++ [ alot.extraConfig ] ++ [ "[[[abook]]]" ]
+ ++ mapAttrsToList (n: v: n + "=" + v) alot.contactCompletion);
+
+ configFile = let
+ bindingsToStr = attrSet:
+ concatStringsSep "\n" (mapAttrsToList (n: v: "${n} = ${v}") attrSet);
+ in ''
+ # Generated by Home Manager.
+ # See http://alot.readthedocs.io/en/latest/configuration/config_options.html
+
+ ${generators.toKeyValue { inherit mkKeyValue; } cfg.settings}
+ ${cfg.extraConfig}
+ [tags]
+ '' + (let
+ submoduleToAttrs = m:
+ filterAttrs (name: v: name != "_module" && v != null) m;
+ in generators.toINI { mkSectionName = mk2ndLevelSectionName; }
+ (mapAttrs (name: x: submoduleToAttrs x) cfg.tags)) + ''
+ [bindings]
+ ${bindingsToStr cfg.bindings.global}
+
+ [[bufferlist]]
+ ${bindingsToStr cfg.bindings.bufferlist}
+ [[search]]
+ ${bindingsToStr cfg.bindings.search}
+ [[envelope]]
+ ${bindingsToStr cfg.bindings.envelope}
+ [[taglist]]
+ ${bindingsToStr cfg.bindings.taglist}
+ [[thread]]
+ ${bindingsToStr cfg.bindings.thread}
+
+ [accounts]
+
+ ${concatStringsSep "\n\n" (map accountStr alotAccounts)}
+ '';
+
+in {
+ options = {
+ programs.alot = {
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ example = true;
+ description = ''
+ Whether to enable the Alot mail user agent. Alot uses the
+ Notmuch email system and will therefore be automatically
+ enabled for each email account that is managed by Notmuch.
+ '';
+ };
- envelope = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Envelope mode keybindings.";
- };
+ hooks = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Content of the hooks file.
+ '';
+ };
- taglist = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Taglist mode keybindings.";
+ bindings = mkOption {
+ type = types.submodule {
+ options = {
+ global = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Global keybindings.";
+ };
+
+ bufferlist = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Bufferlist mode keybindings.";
+ };
+
+ search = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Search mode keybindings.";
+ };
+
+ envelope = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Envelope mode keybindings.";
+ };
+
+ taglist = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Taglist mode keybindings.";
+ };
+
+ thread = mkOption {
+ type = types.attrsOf types.str;
+ default = { };
+ description = "Thread mode keybindings.";
+ };
};
+ };
+ default = { };
+ description = ''
+ Keybindings.
+ '';
+ };
- thread = mkOption {
- type = types.attrsOf types.str;
- default = {};
- description = "Thread mode keybindings.";
- };
+ tags = mkOption {
+ type = types.attrsOf tagSubmodule;
+ default = { };
+ description = "How to display the tags.";
+ };
+
+ settings = mkOption {
+ type = with types;
+ let primitive = either (either (either str int) bool) float;
+ in attrsOf primitive;
+ default = {
+ initial_command = "search tag:inbox AND NOT tag:killed";
+ auto_remove_unread = true;
+ handle_mouse = true;
+ prefer_plaintext = true;
};
+ example = literalExample ''
+ {
+ auto_remove_unread = true;
+ ask_subject = false;
+ thread_indent_replies = 2;
+ }
+ '';
+ description = ''
+ Configuration options added to alot configuration file.
+ '';
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra lines added to alot configuration file.
+ '';
};
- default = {};
- description = ''
- Keybindings.
- '';
};
- extraConfig = mkOption {
- type = types.lines;
- default = ''
- auto_remove_unread = True
- ask_subject = False
- handle_mouse = True
- initial_command = "search tag:inbox AND NOT tag:killed"
- input_timeout = 0.3
- prefer_plaintext = True
- thread_indent_replies = 4
- '';
- description = ''
- Extra lines added to alot configuration file.
- '';
+ accounts.email.accounts = mkOption {
+ type = with types; attrsOf (submodule (import ./alot-accounts.nix pkgs));
};
};
config = mkIf cfg.enable {
- home.packages = [ pkgs.alot ];
+ home.packages = [ pkgs.alot ];
xdg.configFile."alot/config".text = configFile;
- xdg.configFile."alot/hooks.py".text =
- ''
+ xdg.configFile."alot/hooks.py" = mkIf (cfg.hooks != "") {
+ text = ''
# Generated by Home Manager.
- ''
- + cfg.hooks;
+ '' + cfg.hooks;
+ };
};
}