This repository has no description
8.1 kB
212 lines
1{ self, ... }:
2{
3 perSystem =
4 {
5 pkgs,
6 lib,
7 system,
8 ...
9 }:
10 {
11 packages.mutt =
12 let
13 # Mailboxes configuration from mail.nix
14 mailboxes = self.packages.${system}.notmuch.mailboxes;
15 notmuchConfig = self.packages.${system}.notmuch.passthru.config.configFile.path;
16
17 mailcap = pkgs.writeText "mailcap" ''
18 text/html; ${pkgs.elinks}/bin/elinks -dump ; copiousoutput;
19 '';
20
21 msmtprc = pkgs.writeText "msmtprc" ''
22 defaults
23 logfile ~/.msmtp.log
24 account prism
25 host prism.r
26 account c-base
27 from lassulus@c-base.org
28 host c-mail.c-base.org
29 port 465
30 tls on
31 tls_starttls off
32 auth on
33 user lassulus
34 passwordeval pass show c-base/pass
35 account default: prism
36 '';
37
38 msmtp = pkgs.writeShellScriptBin "msmtp" ''
39 # Check if prism.r is reachable, fallback to Tor if not
40 if ping -W2 -c1 prism.r >/dev/null 2>&1; then
41 ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert +sent) | \
42 ${pkgs.msmtp}/bin/msmtp -C ${msmtprc} "$@"
43 else
44 # Build dependencies lazily for Tor fallback
45 echo "Building tornade and clan-cli for Tor fallback..." >&2
46 tornade_path=$(nix build --no-link --print-out-paths "${self}#tornade")
47 clan_path=$(nix build --no-link --print-out-paths "${self}#clan-cli")
48
49 # Get tor hostname using clan CLI
50 tor_hostname=$(CLAN_DIR="${self}" "$clan_path/bin/clan" vars get prism tor-ssh/tor-hostname)
51
52 # Use tornade to send via Tor
53 ${pkgs.coreutils}/bin/tee >(${pkgs.notmuch}/bin/notmuch insert +sent) | \
54 "$tornade_path/bin/tornade" ssh -T lass@"$tor_hostname" "cat | msmtp -C /etc/msmtprc $*"
55 fi
56 '';
57
58 muttrc = pkgs.writeText "muttrc" ''
59 # read html mails
60 auto_view text/html
61 set mailcap_path = ${mailcap}
62
63 # notmuch
64 set folder="$HOME/Maildir"
65 set nm_default_uri = "notmuch://$HOME/Maildir"
66 set nm_record = yes
67 set nm_record_tags = "-inbox me archive"
68 set spoolfile = +Inbox
69 set virtual_spoolfile = yes
70
71 set sendmail="${msmtp}/bin/msmtp"
72 set from="lassulus@lassul.us"
73 alternates ^.*@lassul\.us$ ^.*@.*\.r$
74 unset envelope_from_address
75 set use_envelope_from
76 set reverse_name
77 set markers=no
78
79 set sort=threads
80
81 set index_format="%4C %Z %?GI?%GI& ? %[%y-%m-%d] %-20.20a %?M?(%3M)& ? %s %> %r %g"
82
83 virtual-mailboxes "Unread" "notmuch://?query=tag:unread"
84 virtual-mailboxes "INBOX" "notmuch://?query=tag:inbox"
85 ${lib.concatMapStringsSep "\n" (
86 i: ''${" "}virtual-mailboxes "${i.name}" "notmuch://?query=tag:${i.name}"''
87 ) (lib.mapAttrsToList lib.nameValuePair mailboxes)}
88 virtual-mailboxes "TODO" "notmuch://?query=tag:TODO"
89 virtual-mailboxes "Starred" "notmuch://?query=tag:*"
90 virtual-mailboxes "Archive" "notmuch://?query=tag:archive"
91 virtual-mailboxes "Sent" "notmuch://?query=tag:sent"
92 virtual-mailboxes "Junk" "notmuch://?query=tag:junk"
93 virtual-mailboxes "All" "notmuch://?query=*"
94
95 tag-transforms "junk" "k" \
96 "unread" "u" \
97 "replied" "↻" \
98 "TODO" "T" \
99
100 # notmuch bindings
101 macro index \\\\ "<vfolder-from-query>"
102 macro index + "<modify-labels>+*\n<sync-mailbox>"
103 macro index - "<modify-labels>-*\n<sync-mailbox>"
104
105 # muchsync
106 bind index \Cr noop
107 macro index \Cr \
108 "<enter-command>unset wait_key<enter> \
109 <sync-mailbox> \
110 <shell-escape>${self.packages.${pkgs.system}.muchsync}/bin/muchsync -vv<enter> \
111 <sync-mailbox>
112
113 #killed
114 bind index d noop
115 bind pager d noop
116
117 bind index S noop
118 bind index s noop
119 bind pager S noop
120 bind pager s noop
121 macro index S "<modify-labels-then-hide>-inbox -unread +junk\n"
122 macro index s "<modify-labels>-junk\n"
123 macro pager S "<modify-labels-then-hide>-inbox -unread +junk\n"
124 macro pager s "<modify-labels>-junk\n"
125
126 bind index A noop
127 bind index a noop
128 bind pager A noop
129 bind pager a noop
130 macro index A "<modify-labels>+archive -unread -inbox\n"
131 macro index a "<modify-labels>-archive\n"
132 macro pager A "<modify-labels>+archive -unread -inbox\n"
133 macro pager a "<modify-labels>-archive\n"
134
135 bind index U noop
136 bind index u noop
137 bind pager U noop
138 bind pager u noop
139 macro index U "<modify-labels>+unread\n"
140 macro index u "<modify-labels>-unread\n"
141 macro pager U "<modify-labels>+unread\n"
142 macro pager u "<modify-labels>-unread\n"
143
144 bind index t noop
145 bind pager t noop
146 macro index t "<modify-labels>"
147
148 # top index bar in email view
149 set pager_index_lines=7
150 # top_index_bar toggle
151 macro pager ,@1 "<enter-command> set pager_index_lines=0; macro pager ] ,@2 'Toggle indexbar<Enter>"
152 macro pager ,@2 "<enter-command> set pager_index_lines=3; macro pager ] ,@3 'Toggle indexbar<Enter>"
153 macro pager ,@3 "<enter-command> set pager_index_lines=7; macro pager ] ,@1 'Toggle indexbar<Enter>"
154 macro pager ] ,@1 'Toggle indexbar
155
156 # scan urls from emails
157 macro index,pager \cb "<pipe-message> ${lib.getExe pkgs.urlscan}<Enter>"
158 macro attach,compose \cb "<pipe-entry> ${lib.getExe pkgs.urlscan}<Enter>"
159
160 # sidebar
161 set sidebar_divider_char = '│'
162 set sidebar_delim_chars = "/"
163 set sidebar_short_path
164 set sidebar_folder_indent
165 set sidebar_visible = yes
166 set sidebar_format = '%D%?F? [%F]?%* %?N?%N/? %?S?%S?'
167 set sidebar_width = 20
168 color sidebar_new yellow red
169
170 # sidebar bindings
171 bind index <left> sidebar-prev
172 bind index <right> sidebar-next
173 bind index <space> sidebar-open
174 # sidebar toggle
175 macro index,pager ,@) "<enter-command> set sidebar_visible=no; macro index,pager [ ,@( 'Toggle sidebar'<Enter>"
176 macro index,pager ,@( "<enter-command> set sidebar_visible=yes; macro index,pager [ ,@) 'Toggle sidebar'<Enter>"
177 macro index,pager [ ,@( 'Toggle sidebar'
178
179 # forward with attachment
180 set mime_forward = no
181 set forward_attachments = yes
182
183 # better handling of long URLs
184 set wrap = 0 # don't wrap lines in the pager
185 set markers = no # don't show + markers for wrapped lines
186 set smart_wrap = yes # wrap at word boundaries when displaying
187 set pager_stop = yes # don't jump to next message at end of pager
188 '';
189
190 in
191 self.wrapLib.makeWrapper {
192 pkgs = pkgs;
193 package = pkgs.neomutt;
194 aliases = [ "mutt" ];
195 runtimeInputs = [
196 pkgs.elinks
197 pkgs.msmtp
198 pkgs.notmuch
199 pkgs.urlscan
200 ]
201 ++ lib.optionals pkgs.stdenv.isLinux [
202 pkgs.iputils
203 ];
204 env = {
205 NOTMUCH_CONFIG = notmuchConfig;
206 };
207 flags = {
208 "-F" = "${muttrc}";
209 };
210 };
211 };
212}