From 708e2ab1f45d5e89152330f99a1978338e487931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kier=C3=A1n=20Meinhardt?= Date: Tue, 21 Feb 2023 11:57:26 +0100 Subject: [PATCH] feat: neomutt -> aerc --- configs/aerc.nix | 320 ++++++++++++++++++++++++++++++++++++++++++++ configs/default.nix | 2 +- configs/neomutt.nix | 172 ------------------------ lib/email.nix | 132 +----------------- 4 files changed, 322 insertions(+), 304 deletions(-) create mode 100644 configs/aerc.nix delete mode 100644 configs/neomutt.nix diff --git a/configs/aerc.nix b/configs/aerc.nix new file mode 100644 index 0000000..88b7dcc --- /dev/null +++ b/configs/aerc.nix @@ -0,0 +1,320 @@ +{ + pkgs, + config, + lib, + ... +}: let + defaults = { + aerc.enable = true; + realName = "Kierán Meinhardt"; + folders.inbox = "INBOX"; + }; + hu-defaults = { + imap.host = "mailbox.cms.hu-berlin.de"; + smtp.host = "mailhost.cms.hu-berlin.de"; + }; + passwordCommandFrom = path: toString (pkgs.writers.writeDash "email-credentials" "echo ${lib.escapeShellArg (lib.strings.fileContents path)}"); +in { + home-manager.users.me = { + accounts.email.accounts = rec { + hu-student = + defaults + // hu-defaults + // rec { + userName = "meinhark"; + address = "kieran.felix.meinhardt@hu-berlin.de"; + aliases = ["${userName}@hu-berlin.de"]; + passwordCommand = passwordCommandFrom ; + }; + hu-student-cs = + defaults + // hu-defaults + // rec { + userName = "meinhark"; + address = "kieran.felix.meinhardt@informatik.hu-berlin.de"; + aliases = ["${userName}@informatik.hu-berlin.de"]; + imap.host = "mailbox.informatik.hu-berlin.de"; + smtp.host = "mailhost.informatik.hu-berlin.de"; + passwordCommand = passwordCommandFrom ; + }; + hu-employee = + defaults + // hu-defaults + // rec { + userName = "meinhaki"; + address = "kieran.meinhardt@hu-berlin.de"; + aliases = ["${userName}@hu-berlin.de"]; + passwordCommand = passwordCommandFrom ; + signature = { + showSignature = "append"; + text = '' + ${defaults.realName} + Studentische Hilfskraft / Administrator ALEW + Humboldt-Universität zu Berlin + + Telefon: +49 (0)30 2093 9634 + Raum 3.212, Dorotheenstraße 24, 10117 Berlin-Mitte + https://alew.hu-berlin.de + ''; + }; + }; + hu-admin = + defaults + // hu-defaults + // rec { + userName = "dslalewa"; + address = "admin.alew.vglsprwi@hu-berlin.de"; + aliases = ["${userName}@hu-berlin.de"]; + passwordCommand = passwordCommandFrom ; + inherit (hu-employee) signature; + }; + hu-fsi = + defaults + // hu-defaults + // rec { + userName = "fsklassp"; + passwordCommand = passwordCommandFrom ; + address = "${userName}@hu-berlin.de"; + realName = "FSI Klassische Philologie"; + signature = { + showSignature = "append"; + text = '' + Fachschafts-Initiative + + Humboldt-Universität zu Berlin + Sprach- und literaturwissenschaftliche Fakultät + Institut für klassische Philologie + Unter den Linden 6 + 10099 Berlin + ''; + }; + }; + fysi = + defaults + // rec { + address = "kieran@fysi.tech"; + userName = address; + passwordCommand = passwordCommandFrom ; + flavor = "fastmail.com"; + }; + cock = + defaults + // rec { + address = "2210@cock.li"; + userName = address; + passwordCommand = passwordCommandFrom ; + realName = ""; + imap.host = "mail.cock.li"; + smtp.host = imap.host; + }; + google-amro = + defaults + // rec { + address = "amroplay@gmail.com"; + userName = address; + passwordCommand = passwordCommandFrom ; + flavor = "gmail.com"; + aerc.enable = false; + }; + google-kieran = + defaults + // rec { + address = "kieran.meinhardt@gmail.com"; + userName = address; + passwordCommand = passwordCommandFrom ; + flavor = "gmail.com"; + aerc.enable = false; + folders = { + drafts = "[Gmail]/Entwürfe"; + sent = "[Gmail]/Gesendet"; + trash = "[Gmail]/Papierkorb"; + }; + }; + posteo = + defaults + // rec { + address = "kieran.meinhardt@posteo.net"; + aliases = ["kmein@posteo.de"]; + userName = address; + imap.host = "posteo.de"; + smtp.host = imap.host; + primary = true; + passwordCommand = passwordCommandFrom ; + # himalaya = { enable = true; backend = "imap"; sender = "smtp"; }; + }; + }; + + # programs.himalaya.enable = true; + + programs.aerc = { + enable = true; + + extraBinds = { + # Binds are of the form = + # To use '=' in a key sequence, substitute it with "Eq": "" + # If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit + global = { + "" = ":prev-tab"; + "" = ":next-tab "; + "" = ":term"; + "?" = ":help keys"; + }; + messages = { + q = ":quit"; + j = ":next "; + "" = ":next"; + "" = ":next 50%"; + "" = ":next 100%"; + "" = ":next 100%"; + k = ":prev "; + "" = ":prev"; + "" = ":prev 50%"; + "" = ":prev 100%"; + "" = ":prev 100%"; + g = ":select 0 "; + G = ":select -1"; + J = ":next-folder "; + K = ":prev-folder"; + H = ":collapse-folder"; + L = ":expand-folder"; + "" = ":read -t"; + v = ":mark -t"; + V = ":mark -v"; + F = ":flag -t"; + T = ":toggle-threads"; + "" = ":view"; + d = ":prompt 'Delete? ' 'delete-message'"; + D = ":move Trash"; + A = ":archive flat"; + C = ":compose"; + rr = ":reply -a"; + rq = ":reply -aq"; + Rr = ":reply"; + Rq = ":reply -q"; + c = ":cf"; + "$" = ":term"; + "!" = ":term"; + "|" = ":pipe"; + "/" = ":search"; + "\\" = ":filter "; + n = ":next-result"; + N = ":prev-result"; + "" = ":clear"; + "*" = ":filter -x Flagged"; + }; + view = { + "/" = ":toggle-key-passthrough /"; + q = ":close"; + O = ":open"; + S = ":save"; + "|" = ":pipe"; + D = ":move Trash"; + A = ":archive flat"; + "" = ":open-link "; + f = ":forward "; + rr = ":reply -a"; + rq = ":reply -aq"; + Rr = ":reply"; + Rq = ":reply -q"; + H = ":toggle-headers"; + "" = ":prev-part"; + "" = ":next-part"; + J = ":next "; + K = ":prev"; + }; + "view::passthrough" = { + "$noinherit" = "true"; + "$ex" = ""; + "" = ":toggle-key-passthrough"; + }; + compose = { + # Keybindings used when the embedded terminal is not selected in the compose + # view + "$noinherit" = "true"; + "$ex" = ""; + "" = ":prev-field"; + "" = ":next-field"; + "" = ":next-field"; + "" = ":prev-tab"; + "" = ":next-tab"; + }; + + "compose::editor" = { + # Keybindings used when the embedded terminal is selected in the compose view + "$noinherit" = "true"; + "$ex" = ""; + "" = ":prev-field"; + "" = ":next-field"; + "" = ":prev-tab"; + "" = ":next-tab"; + }; + + "compose::review" = { + # Keybindings used when reviewing a message to be sent + y = ":send "; + n = ":abort"; + p = ":postpone"; + q = ":choose -o d discard abort -o p postpone postpone"; + e = ":edit"; + a = ":attach"; + d = ":detach"; + }; + + terminal = { + "$noinherit" = "true"; + "$ex" = ""; + "" = ":prev-tab"; + "" = ":next-tab"; + }; + }; + + extraConfig = { + ui.sort = "-r date"; + ui.timestamp-format = "2006-01-02 15:04"; + ui.mouse-enabled = true; + ui.spinner = ". , ."; + general.unsafe-accounts-conf = true; + general.pgp-provider = "gpg"; + viewer = {pager = "${pkgs.less}/bin/less -R";}; + compose = { + address-book-cmd = "khard email --parsable '%s'"; + no-attachment-warning = "(attach|attached|attachments?|anbei|Anhang|angehängt)"; + }; + filters = { + "text/plain" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/share/aerc/filters/colorize"; + "text/calendar" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/share/aerc/filters/calendar"; + "text/html" = "${pkgs.aerc}/share/aerc/filters/html"; # Requires w3m, dante + # "text/html" = + # "${pkgs.aerc}/share/aerc/filters/html | ${pkgs.aerc}/share/aerc/filters/colorize"; + # "text/*" = + # ''${pkgs.bat}/bin/bat -fP --file-name="$AERC_FILENAME "''; + "message/delivery-status" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/share/aerc/filters/colorize"; + "message/rfc822" = "${pkgs.gawk}/bin/awk -f ${pkgs.aerc}/share/aerc/filters/colorize"; + "application/x-sh" = "${pkgs.bat}/bin/bat -fP -l sh"; + }; + openers = let + as-pdf = pkgs.writers.writeDash "as-pdf" '' + d=$(mktemp -d) + trap clean EXIT + clean() { + rm -rf "$d" + } + ${pkgs.libreoffice}/bin/libreoffice --headless --convert-to pdf "$1" --outdir "$d" + ${pkgs.zathura}/bin/zathura "$d"/*.pdf + ''; + in { + "image/*" = "${pkgs.nsxiv}/bin/nsxiv"; + "application/pdf" = "${pkgs.zathura}/bin/zathura"; + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" = toString as-pdf; + "application/vnd.oasis.opendocument.text" = toString as-pdf; + "video/*" = "${pkgs.mpv}/bin/mpv"; + "audio/*" = "${pkgs.mpv}/bin/mpv"; + }; + }; + + templates = { + # new_message = "hello!"; + }; + }; + }; +} diff --git a/configs/default.nix b/configs/default.nix index b94f5a6..3bbf7e8 100644 --- a/configs/default.nix +++ b/configs/default.nix @@ -219,6 +219,7 @@ in { ./bash.nix ./beets.nix ./bluetooth.nix + ./aerc.nix ./ccc.nix ./khal.nix ./chromium.nix @@ -241,7 +242,6 @@ in { ./mpv.nix ./mime.nix ./neovim.nix - ./neomutt.nix ./nix.nix ./newsboat.nix ./flameshot-once.nix diff --git a/configs/neomutt.nix b/configs/neomutt.nix deleted file mode 100644 index 27da3d7..0000000 --- a/configs/neomutt.nix +++ /dev/null @@ -1,172 +0,0 @@ -{ - pkgs, - lib, - ... -}: let - mainMailbox = "posteo"; - - accounts = import {inherit lib mainMailbox;}; - - neomuttConfig = emailAccounts: let - as-pdf = pkgs.writers.writeDash "as-pdf" '' - d=$(mktemp -d) - trap clean EXIT - clean() { - rm -rf "$d" - } - ${pkgs.libreoffice}/bin/libreoffice --headless --convert-to pdf "$1" --outdir "$d" - ${pkgs.zathura}/bin/zathura "$d"/*.pdf - ''; - in '' - set mailcap_path = ${ - pkgs.writeText "mailcap" '' - text/plain; $EDITOR %s ; - text/html; ${pkgs.lynx}/bin/lynx -assume_charset=%{charset} -display_charset=utf-8 -dump %s; nametemplate=%s.html; copiousoutput; - image/*; ${pkgs.nsxiv}/bin/nsxiv %s ; - video/*; ${pkgs.util-linux}/bin/setsid ${pkgs.mpv}/bin/mpv --quiet %s &; copiousoutput - audio/*; ${pkgs.mpv}/bin/mpv %s ; - application/pdf; ${pkgs.zathura}/bin/zathura %s ; - application/pgp-encrypted; ${pkgs.gnupg}/bin/gpg -d '%s'; copiousoutput; - application/pgp-keys; ${pkgs.gnupg}/bin/gpg --import '%s'; copiousoutput; - application/vnd.openxmlformats-officedocument.wordprocessingml.document; ${as-pdf} %s; - application/vnd.oasis.opendocument.text; ${as-pdf} %s; - application/vnd.openxmlformats*; ${pkgs.libreoffice}/bin/soffice '%s'; - '' - }:$mailcap_path - - set sidebar_visible - set sidebar_format = "%D%?F? [%F]?%* %?N?%N/?%S" - set sidebar_width = 25 # Plenty of space - set sidebar_divider_char = '│' # Pretty line-drawing character - set mail_check_stats - - set index_format="%2C %Z %D %-15.15L %s" - set date_format="%F %R" - - set sort = 'reverse-date' - set sleep_time = 0 # Pause 0 seconds for informational messages - set markers = no # Disables the `+` displayed at line wraps - set mark_old = no # Unread mail stay unread until read - set wait_key = no # mutt won't ask "press key to continue" - set fast_reply # skip to compose when replying - set forward_format = "Fwd: %s" # format of subject when forwarding - set reverse_name # reply as whomever it was to - set include=ask-no # don't include message in replies - auto_view text/html # automatically show html (mailcap uses lynx) - auto_view application/pgp-encrypted - alternative_order text/plain text/enriched text/html - - set abort_noattach abort_noattach_regex="\<(attach|attached|attachments?|anbei|Anhang|angehängt)\>" - set attach_save_dir=/tmp - set fast_reply - - set narrow_tree # narrow threads for more depth - - bind index,pager B sidebar-toggle-visible # Use 'B' to switch the Sidebar on and off - bind index,pager \Ck sidebar-prev - bind index,pager \Cj sidebar-next - bind index,pager \Co sidebar-open - bind index,pager \Cp sidebar-prev-new - bind index,pager \Cn sidebar-next-new - - macro index * ~F\r - macro index + all\r - - set query_command = "khard email --parsable %s" - bind editor complete-query - bind editor ^T complete - - set mail_check = 90 - set timeout = 15 - # set imap_check_subscribed - set use_from - - - set header_cache="~/.cache/mutt" message_cachedir="~/.cache/mutt" - - source ${ - pkgs.writeText "accounts.neomuttrc" '' - set realname = "Kierán Meinhardt" - account-hook . 'unset imap_user imap_pass smtp_user smtp_pass' - # set accordingly: postponed trash record - ${ - lib.concatStringsSep "\n\n" (lib.mapAttrsToList (name: account: let - imapRoot = "imaps://${account.user}@${account.imap}"; - in '' - account-hook ${account.user}@${account.imap} 'set imap_user="${account.user}" imap_pass="${account.password}"' - account-hook ${account.user}@${account.smtp} 'set smtp_user="${account.user}" smtp_pass="${account.password}"' - folder-hook ${account.user}@${account.imap} 'set smtp_url="${account.smtpSettings "${account.user}@${account.smtp}"}" from="${account.address}" record="${imapRoot}/${account.folders.sent}" postponed="${imapRoot}/${account.folders.drafts}" trash="${imapRoot}/${account.folders.trash}"' - named-mailboxes "${name}←" "${imapRoot}" "${name}→" "${imapRoot}/${account.folders.sent}" - '') - emailAccounts) - } - '' - } - - set spoolfile="${mainMailbox}" - - source ${ - pkgs.writeText "colors.neomuttrc" '' - # Default index colors: - color index_number blue default - color index red default '.*' - color index_flags lightcyan default '.*' - color index_author yellow default '.*' - color index_subject default default '.*' - - # New mail is boldened: - color index_author lightyellow default "~N" - color index_subject lightwhite default "~N" - - # Flagged mail is highlighted: - color index_flags lightmagenta default '~F' - - # Other colors and aesthetic settings: - mono bold bold - mono underline underline - mono error bold - mono indicator reverse - # color sidebar_flagged red black - mono sidebar_new bold - color error red default - color message cyan default - color search brightmagenta default - color hdrdefault lightblack default - color quoted green default - color quoted1 blue default - color quoted2 cyan default - color quoted3 yellow default - color quoted4 red default - color quoted5 brightred default - color signature lightblack default - color tree color235 default - - # Regex highlighting: - color header red default "^(Date)" - color header yellow default "^(From)" - color header white default "^(B?CC)" - color header brightwhite default "^(Subject)" - color body cyan default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses - color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL - color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow - color body red default "(BAD signature)|^gpg: BAD signature from.*" - color body brightgreen default "(Good signature)|^gpg: Good signature .*" - color body brightyellow default "^gpg: " - mono body bold "^gpg: Good signature" - mono body bold "^gpg: BAD signature from.*" - color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]" - '' - } - ''; -in { - environment.systemPackages = [pkgs.neomutt]; - environment.shellAliases = - lib.mapAttrs' (accountName: account: - lib.nameValuePair - "mua-${accountName}" - "${pkgs.neomutt}/bin/neomutt -F ${pkgs.writeText "neomuttrc-${accountName}" (neomuttConfig {"${accountName}" = accounts.${accountName};})}") - accounts - // {mua = "${pkgs.neomutt}/bin/neomutt -f ${mainMailbox}←";}; - - home-manager.users.me.xdg.configFile."neomutt/neomuttrc".text = neomuttConfig accounts; -} diff --git a/lib/email.nix b/lib/email.nix index 36f1ee0..933707c 100644 --- a/lib/email.nix +++ b/lib/email.nix @@ -1,92 +1,4 @@ -{ - lib, - mainMailbox ? "posteo", - ... -}: { - uni = { - user = "meinhark"; - password = lib.strings.fileContents ; - address = "kieran.felix.meinhardt@hu-berlin.de"; - imap = "mailbox.cms.hu-berlin.de"; - smtp = "mailhost.cms.hu-berlin.de"; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - uni-old = { - user = "meinhark"; - password = lib.strings.fileContents ; - address = "meinhark@informatik.hu-berlin.de"; - imap = "mailbox.informatik.hu-berlin.de"; - smtp = "mailhost.informatik.hu-berlin.de"; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - work-uni = { - user = "meinhaki"; - password = lib.strings.fileContents ; - address = "kieran.meinhardt@hu-berlin.de"; - imap = "mailbox.cms.hu-berlin.de"; - smtp = "mailhost.cms.hu-berlin.de"; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - work-admin = { - user = "dslalewa"; - password = lib.strings.fileContents ; - address = "admin.alew.vglsprwi@hu-berlin.de"; - imap = "mailbox.cms.hu-berlin.de"; - smtp = "mailhost.cms.hu-berlin.de"; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - uni-fsi = { - user = "fsklassp"; - password = lib.strings.fileContents ; - address = "fsklassp@hu-berlin.de"; - imap = "mailbox.cms.hu-berlin.de"; - smtp = "mailhost.cms.hu-berlin.de"; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - work-fysi = rec { - user = "kieran@fysi.tech"; - address = user; - password = lib.strings.fileContents ; - imap = "imap.fastmail.com"; - smtp = "smtp.fastmail.com"; - smtpSettings = smtp: "smtps://${smtp}:465"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - +{lib, ...}: { cock = rec { user = "2210@cock.li"; address = user; @@ -100,46 +12,4 @@ trash = "Trash"; }; }; - - "${mainMailbox}" = rec { - user = "kieran.meinhardt@posteo.net"; - address = user; - password = lib.strings.fileContents ; - imap = "posteo.de"; - smtp = imap; - smtpSettings = smtp: "smtp://${smtp}"; - folders = { - drafts = "Drafts"; - sent = "Sent"; - trash = "Trash"; - }; - }; - - google-amro = rec { - user = "amroplay@gmail.com"; - address = user; - password = lib.strings.fileContents ; - imap = "imap.gmail.com"; - smtp = "smtp.gmail.com"; - smtpSettings = smtp: "smtps://${smtp}:465"; - folders = { - drafts = "[Gmail]/Drafts"; - sent = "[Gmail]/Sent Mail"; - trash = "[Gmail]/Bin"; - }; - }; - - google-kieran = rec { - user = "kieran.meinhardt@gmail.com"; - address = user; - password = lib.strings.fileContents ; - imap = "imap.gmail.com"; - smtp = "smtp.gmail.com"; - smtpSettings = smtp: "smtps://${smtp}:465"; - folders = { - drafts = "[Gmail]/Entwürfe"; - sent = "[Gmail]/Gesendet"; - trash = "[Gmail]/Papierkorb"; - }; - }; }