wip
This commit is contained in:
parent
f7dad7ef24
commit
0fa829cd11
|
@ -383,6 +383,7 @@ in
|
||||||
(import ../programs/astroid-accounts.nix)
|
(import ../programs/astroid-accounts.nix)
|
||||||
(import ../programs/mbsync-accounts.nix)
|
(import ../programs/mbsync-accounts.nix)
|
||||||
(import ../programs/msmtp-accounts.nix)
|
(import ../programs/msmtp-accounts.nix)
|
||||||
|
(import ../programs/neomutt-accounts.nix)
|
||||||
(import ../programs/notmuch-accounts.nix)
|
(import ../programs/notmuch-accounts.nix)
|
||||||
(import ../programs/offlineimap-accounts.nix)
|
(import ../programs/offlineimap-accounts.nix)
|
||||||
]);
|
]);
|
||||||
|
|
42
modules/programs/neomutt-accounts.nix
Normal file
42
modules/programs/neomutt-accounts.nix
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
{
|
||||||
|
options.neomutt = {
|
||||||
|
enable = mkOption {
|
||||||
|
type = types.enum [ "none" "maildir" "imap" ];
|
||||||
|
default = "none";
|
||||||
|
description = ''
|
||||||
|
Whether to enable this account in NeoMutt and which
|
||||||
|
account protocol to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
imap.idle = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
If set, NeoMutt will attempt to use the IDLE extension.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mailboxes = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [];
|
||||||
|
example = ["github" "Lists/nix" "Lists/haskell-cafe"];
|
||||||
|
description = ''
|
||||||
|
A list of mailboxes.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = mkOption {
|
||||||
|
type = types.lines;
|
||||||
|
default = "";
|
||||||
|
example = "color status cyan default";
|
||||||
|
description = ''
|
||||||
|
Extra lines to add to the folder hook for this account.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -77,11 +77,15 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
yesno = x: if x then "yes" else "no";
|
yesno = x: if x then "yes" else "no";
|
||||||
setOption = n: v: if v == null then "unset ${n}" else "set ${n}=${v}";
|
setOption = n: v: if v == null then "unset ${n}" else "set ${n}=${v}";
|
||||||
escape = replaceStrings ["%"] ["%25"];
|
escape = replaceStrings ["%"] ["%25"];
|
||||||
|
|
||||||
|
# Path to the file that will contain the account folder-hook
|
||||||
|
# settings.
|
||||||
|
genAccountFileName = accountName:
|
||||||
|
"${config.xdg.configHome}/neomutt/account-${accountName}";
|
||||||
|
|
||||||
genCommonFolderHooks = account: with account;
|
genCommonFolderHooks = account: with account;
|
||||||
let
|
let
|
||||||
smtpProto = if smtp.tls.enable then "smtps" else "smtp";
|
smtpProto = if smtp.tls.enable then "smtps" else "smtp";
|
||||||
|
@ -103,25 +107,35 @@ let
|
||||||
smtp_pass = "'`${passCmd}`'";
|
smtp_pass = "'`${passCmd}`'";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
genFolderHookFile = account: customConf: with account;
|
||||||
|
{
|
||||||
|
target = genAccountFileName name;
|
||||||
|
source = pkgs.writeText "neomutt-account-${name}" (
|
||||||
|
concatStringsSep "\n" (
|
||||||
|
[ "# Generated by Home Manager.\n" ]
|
||||||
|
++ mapAttrsToList setOption (genCommonFolderHooks account // customConf)
|
||||||
|
++ optional (neomutt.extraConfig != "") neomutt.extraConfig
|
||||||
|
)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
genMaildirAccountConfig = account: with account;
|
genMaildirAccountConfig = account: with account;
|
||||||
let
|
let
|
||||||
folderHook =
|
accountFileName = genAccountFileName name;
|
||||||
mapAttrsToList setOption (
|
|
||||||
genCommonFolderHooks account
|
|
||||||
// {
|
|
||||||
folder = "'${account.maildir.absPath}'";
|
|
||||||
}
|
|
||||||
)
|
|
||||||
++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
|
|
||||||
in
|
in
|
||||||
''
|
{
|
||||||
mailboxes ${account.maildir.absPath}/${folders.inbox}
|
mainConfig = ''
|
||||||
folder-hook ${account.maildir.absPath}/ " \
|
mailboxes ${account.maildir.absPath}/${folders.inbox}
|
||||||
${concatStringsSep "; \\\n " folderHook}"
|
folder-hook ${account.maildir.absPath}/ source ${accountFileName}
|
||||||
''
|
''
|
||||||
+ optionalString account.primary ''
|
+ optionalString account.primary ''
|
||||||
${concatStringsSep "\n" folderHook}
|
source ${genAccountFileName name}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
folderHookFile = genFolderHookFile account {
|
||||||
|
folder = "'${account.maildir.absPath}'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
genImapAccountConfig = account: with account;
|
genImapAccountConfig = account: with account;
|
||||||
let
|
let
|
||||||
|
@ -130,30 +144,29 @@ let
|
||||||
imapBaseUrlEscape = "${imapProto}://${escape userName}@${imap.host}";
|
imapBaseUrlEscape = "${imapProto}://${escape userName}@${imap.host}";
|
||||||
passCmd = concatStringsSep " " passwordCommand;
|
passCmd = concatStringsSep " " passwordCommand;
|
||||||
|
|
||||||
folderHook =
|
accountFileName = genAccountFileName name;
|
||||||
mapAttrsToList setOption (
|
|
||||||
genCommonFolderHooks account
|
|
||||||
// {
|
|
||||||
imap_user="'${userName}'";
|
|
||||||
imap_pass="'`${passCmd}`'";
|
|
||||||
imap_idle = yesno neomutt.imap.idle;
|
|
||||||
folder = "'${imapBaseUrlEscape}'";
|
|
||||||
}
|
|
||||||
)
|
|
||||||
++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
|
|
||||||
in
|
in
|
||||||
''
|
{
|
||||||
account-hook '${imapBaseUrl}/' " \
|
mainConfig =
|
||||||
set imap_user='${userName}' \
|
''
|
||||||
set imap_pass='`${passCmd}`' \
|
account-hook '${imapBaseUrl}/' " \
|
||||||
unset tunnel"
|
set imap_user='${userName}' \
|
||||||
mailboxes '${imapBaseUrlEscape}/${folders.inbox}'
|
set imap_pass='`${passCmd}`' \
|
||||||
folder-hook '${imapBaseUrlEscape}/' " \
|
unset tunnel"
|
||||||
${concatStringsSep "; \\\n " folderHook}"
|
mailboxes '${imapBaseUrlEscape}/${folders.inbox}'
|
||||||
''
|
folder-hook '${imapBaseUrlEscape}/' source ${accountFileName}"
|
||||||
+ optionalString account.primary ''
|
''
|
||||||
${concatStringsSep "\n" folderHook}
|
+ optionalString account.primary ''
|
||||||
'';
|
source ${genAccountFileName name}
|
||||||
|
'';
|
||||||
|
|
||||||
|
folderHookFile = genFolderHookFile account {
|
||||||
|
imap_user="'${userName}'";
|
||||||
|
imap_pass="'`${passCmd}`'";
|
||||||
|
imap_idle = yesno neomutt.imap.idle;
|
||||||
|
folder = "'${imapBaseUrlEscape}'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
genAccountConfig = account: with account;
|
genAccountConfig = account: with account;
|
||||||
if account.neomutt.enable == "imap" && account.imap != null then
|
if account.neomutt.enable == "imap" && account.imap != null then
|
||||||
|
@ -161,7 +174,85 @@ let
|
||||||
else if account.neomutt.enable == "maildir" && account.maildir != null then
|
else if account.neomutt.enable == "maildir" && account.maildir != null then
|
||||||
genMaildirAccountConfig account
|
genMaildirAccountConfig account
|
||||||
else
|
else
|
||||||
"";
|
null;
|
||||||
|
|
||||||
|
accountConfigs = map genAccountConfig neomuttAccounts;
|
||||||
|
|
||||||
|
neomuttrcStr =
|
||||||
|
let
|
||||||
|
|
||||||
|
gpgSection = ''
|
||||||
|
set crypt_use_gpgme = yes
|
||||||
|
set crypt_autosign = yes
|
||||||
|
set pgp_use_gpg_agent = yes
|
||||||
|
'';
|
||||||
|
|
||||||
|
sidebarSection = ''
|
||||||
|
# Sidebar
|
||||||
|
set sidebar_visible = yes
|
||||||
|
set sidebar_short_path = ${yesno cfg.sidebar.shortPath}
|
||||||
|
set sidebar_width = ${toString cfg.sidebar.width}
|
||||||
|
set sidebar_format = '${cfg.sidebar.format}'
|
||||||
|
'';
|
||||||
|
|
||||||
|
bindSection =
|
||||||
|
concatMapStringsSep
|
||||||
|
"\n"
|
||||||
|
(bind: "bind ${bind.map} ${bind.key} \"${bind.action}\"")
|
||||||
|
cfg.binds;
|
||||||
|
|
||||||
|
macroSection =
|
||||||
|
concatMapStringsSep
|
||||||
|
"\n"
|
||||||
|
(bind: "macro ${bind.map} ${bind.key} \"${bind.action}\"")
|
||||||
|
cfg.macros;
|
||||||
|
|
||||||
|
accountsSection =
|
||||||
|
concatMapStringsSep "\n" (getAttr "mainConfig") accountConfigs;
|
||||||
|
|
||||||
|
mailCheckSection = ''
|
||||||
|
set mail_check_stats
|
||||||
|
set mail_check_stats_interval = ${toString cfg.checkStatsInterval}
|
||||||
|
'';
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# Some defaults are left unconfigurable
|
||||||
|
''
|
||||||
|
# Generated by Home Manager.
|
||||||
|
|
||||||
|
set ssl_force_tls = yes
|
||||||
|
|
||||||
|
set mbox_type = Maildir
|
||||||
|
set sort = "${cfg.sort}"
|
||||||
|
set header_cache = "${config.xdg.cacheHome}/neomutt/headers/"
|
||||||
|
set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/"
|
||||||
|
set editor = "${cfg.editor}"
|
||||||
|
|
||||||
|
${optionalString cfg.gpg gpgSection}
|
||||||
|
|
||||||
|
${optionalString (cfg.checkStatsInterval != null) mailCheckSection}
|
||||||
|
|
||||||
|
set implicit_autoview = yes
|
||||||
|
|
||||||
|
alternative_order text/enriched text/plain text
|
||||||
|
|
||||||
|
set delete = yes
|
||||||
|
|
||||||
|
# Binds and macros
|
||||||
|
${bindSection}
|
||||||
|
${macroSection}
|
||||||
|
|
||||||
|
${optionalString cfg.sidebar.enable sidebarSection}
|
||||||
|
|
||||||
|
${optionalString (cfg.theme != null) "source ${cfg.theme}"}
|
||||||
|
|
||||||
|
${accountsSection}
|
||||||
|
|
||||||
|
# Extra configuration
|
||||||
|
${cfg.extraConfig}
|
||||||
|
'';
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -241,49 +332,6 @@ in
|
||||||
description = "Extra configuration appended to the end.";
|
description = "Extra configuration appended to the end.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
accounts.email.accounts = mkOption {
|
|
||||||
options = [
|
|
||||||
{
|
|
||||||
neomutt = {
|
|
||||||
enable = mkOption {
|
|
||||||
type = types.enum [ "none" "maildir" "imap" ];
|
|
||||||
default = "none";
|
|
||||||
description = ''
|
|
||||||
Whether to enable this account in NeoMutt and which
|
|
||||||
account protocol to use.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
imap.idle = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
If set, neomutt will attempt to use the IDLE extension.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
mailboxes = mkOption {
|
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [];
|
|
||||||
example = ["github" "Lists/nix" "Lists/haskell-cafe"];
|
|
||||||
description = ''
|
|
||||||
A list of mailboxes.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
extraConfig = mkOption {
|
|
||||||
type = types.lines;
|
|
||||||
default = "";
|
|
||||||
example = "color status cyan default";
|
|
||||||
description = ''
|
|
||||||
Extra lines to add to the folder hook for this account.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
@ -319,79 +367,8 @@ in
|
||||||
|
|
||||||
home.packages = [ pkgs.neomutt ];
|
home.packages = [ pkgs.neomutt ];
|
||||||
|
|
||||||
xdg.configFile."neomutt/neomuttrc".text =
|
home.file = map (getAttr "folderHookFile") accountConfigs;
|
||||||
let
|
|
||||||
|
|
||||||
gpgSection = ''
|
xdg.configFile."neomutt/neomuttrc".text = neomuttrcStr;
|
||||||
set crypt_use_gpgme = yes
|
|
||||||
set crypt_autosign = yes
|
|
||||||
set pgp_use_gpg_agent = yes
|
|
||||||
'';
|
|
||||||
|
|
||||||
sidebarSection = ''
|
|
||||||
# Sidebar
|
|
||||||
set sidebar_visible = yes
|
|
||||||
set sidebar_short_path = ${yesno cfg.sidebar.shortPath}
|
|
||||||
set sidebar_width = ${toString cfg.sidebar.width}
|
|
||||||
set sidebar_format = '${cfg.sidebar.format}'
|
|
||||||
'';
|
|
||||||
|
|
||||||
bindSection =
|
|
||||||
concatMapStringsSep
|
|
||||||
"\n"
|
|
||||||
(bind: "bind ${bind.map} ${bind.key} \"${bind.action}\"")
|
|
||||||
cfg.binds;
|
|
||||||
|
|
||||||
macroSection =
|
|
||||||
concatMapStringsSep
|
|
||||||
"\n"
|
|
||||||
(bind: "macro ${bind.map} ${bind.key} \"${bind.action}\"")
|
|
||||||
cfg.macros;
|
|
||||||
|
|
||||||
accountsSection =
|
|
||||||
concatMapStringsSep "\n" genAccountConfig neomuttAccounts;
|
|
||||||
|
|
||||||
mailCheckSection = ''
|
|
||||||
set mail_check_stats
|
|
||||||
set mail_check_stats_interval = ${toString cfg.checkStatsInterval}
|
|
||||||
'';
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
# Some defaults are left unconfigurable
|
|
||||||
''
|
|
||||||
# Generated by Home Manager.
|
|
||||||
|
|
||||||
set ssl_force_tls = yes
|
|
||||||
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set sort = "${cfg.sort}"
|
|
||||||
set header_cache = "${config.xdg.cacheHome}/neomutt/headers/"
|
|
||||||
set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/"
|
|
||||||
set editor = "${cfg.editor}"
|
|
||||||
|
|
||||||
${optionalString cfg.gpg gpgSection}
|
|
||||||
|
|
||||||
${optionalString (cfg.checkStatsInterval != null) mailCheckSection}
|
|
||||||
|
|
||||||
set implicit_autoview = yes
|
|
||||||
|
|
||||||
alternative_order text/enriched text/plain text
|
|
||||||
|
|
||||||
set delete = yes
|
|
||||||
|
|
||||||
# Binds and macros
|
|
||||||
${bindSection}
|
|
||||||
${macroSection}
|
|
||||||
|
|
||||||
${optionalString cfg.sidebar.enable sidebarSection}
|
|
||||||
|
|
||||||
${optionalString (cfg.theme != null) "source ${cfg.theme}"}
|
|
||||||
|
|
||||||
${accountsSection}
|
|
||||||
|
|
||||||
# Extra configuration
|
|
||||||
${cfg.extraConfig}
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue