@@ -1,10 +1,8 @@ | |||||
.POSIX: | .POSIX: | ||||
OS = $(shell uname -s) | OS = $(shell uname -s) | ||||
ifeq ($(OS), Darwin) | |||||
ifndef PREFIX | |||||
PREFIX = /usr/local | PREFIX = /usr/local | ||||
else | |||||
PREFIX = /usr | |||||
endif | endif | ||||
MANPREFIX = $(PREFIX)/share/man | MANPREFIX = $(PREFIX)/share/man | ||||
@@ -15,19 +13,26 @@ install: | |||||
chmod 755 $(DESTDIR)$(PREFIX)/$$script; \ | chmod 755 $(DESTDIR)$(PREFIX)/$$script; \ | ||||
done | done | ||||
mkdir -p $(DESTDIR)$(PREFIX)/share/mutt-wizard | mkdir -p $(DESTDIR)$(PREFIX)/share/mutt-wizard | ||||
chmod 755 $(DESTDIR)$(PREFIX)/share/mutt-wizard | |||||
for shared in share/*; do \ | for shared in share/*; do \ | ||||
cp -f $$shared $(DESTDIR)$(PREFIX)/share/mutt-wizard; \ | cp -f $$shared $(DESTDIR)$(PREFIX)/share/mutt-wizard; \ | ||||
chmod 644 $(DESTDIR)$(PREFIX)/share/mutt-wizard/$$(basename $(notdir $$shared)); \ | |||||
done | done | ||||
if [ "$(OS)" = "Darwin" ]; then \ | |||||
sed -iba 's/\/usr\//\/usr\/local\//' $(DESTDIR)$(PREFIX)/share/mutt-wizard/mutt-wizard.muttrc; \ | |||||
rm $(DESTDIR)$(PREFIX)/share/mutt-wizard/mutt-wizard.muttrcba; \ | |||||
fi | |||||
mkdir -p $(DESTDIR)$(MANPREFIX)/man1 | mkdir -p $(DESTDIR)$(MANPREFIX)/man1 | ||||
cp -f mw.1 $(DESTDIR)$(MANPREFIX)/man1/mw.1 | cp -f mw.1 $(DESTDIR)$(MANPREFIX)/man1/mw.1 | ||||
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/mw.1 | |||||
if [ "$(PREFIX)" ]; then \ | |||||
sed -iba 's:/usr/local:$(PREFIX):' $(DESTDIR)$(PREFIX)/share/mutt-wizard/mutt-wizard.muttrc; \ | |||||
rm -f $(DESTDIR)$(PREFIX)/share/mutt-wizard/mutt-wizard.muttrcba; \ | |||||
sed -iba 's:/usr/local:$(PREFIX):' $(DESTDIR)$(PREFIX)/bin/mw; \ | |||||
rm -f $(DESTDIR)$(PREFIX)/bin/mwba; \ | |||||
sed -iba 's:/usr/local:$(PREFIX):' $(DESTDIR)$(MANPREFIX)/man1/mw.1; \ | |||||
rm -f $(DESTDIR)$(MANPREFIX)/man1/mw.1ba; \ | |||||
fi | |||||
uninstall: | uninstall: | ||||
for script in bin/*; do \ | for script in bin/*; do \ | ||||
rm -f $(DESTDIR)$(PREFIX)/bin/$$script; \ | |||||
rm -f $(DESTDIR)$(PREFIX)/$$script; \ | |||||
done | done | ||||
rm -rf $(DESTDIR)$(PREFIX)/share/mutt-wizard | rm -rf $(DESTDIR)$(PREFIX)/share/mutt-wizard | ||||
rm -f $(DESTDIR)$(MANPREFIX)/man1/mw.1 | rm -f $(DESTDIR)$(MANPREFIX)/man1/mw.1 | ||||
@@ -52,7 +52,7 @@ There's a chance of errors if you use a slow-release distro like Ubuntu, Debian | |||||
### Optional | ### Optional | ||||
- `w3m` - view HTML email and images in neomutt. | |||||
- `lynx` - view HTML email in neomutt. | |||||
- `notmuch` - index and search mail. Install it and run `notmuch setup`, tell it that your mail is in `~/.local/share/mail/` (although `mw` will do this automatically if you haven't set notmuch up before). You can run it in mutt with `ctrl-f`. Run `notmuch new` to process new mail, although the included `mailsync` script does this for you. | - `notmuch` - index and search mail. Install it and run `notmuch setup`, tell it that your mail is in `~/.local/share/mail/` (although `mw` will do this automatically if you haven't set notmuch up before). You can run it in mutt with `ctrl-f`. Run `notmuch new` to process new mail, although the included `mailsync` script does this for you. | ||||
- `libnotify`/`libnotify-bin` - allows notifications when syncthing mail with `mailsync` | - `libnotify`/`libnotify-bin` - allows notifications when syncthing mail with `mailsync` | ||||
- `abook` - a terminal-based address book. Pressing tab while typing an address to send mail to will suggest contacts that are in your abook. | - `abook` - a terminal-based address book. Pressing tab while typing an address to send mail to will suggest contacts that are in your abook. | ||||
@@ -20,7 +20,7 @@ command -v notify-send >/dev/null || echo "Note that \`libnotify\` or \`libnotif | |||||
if [ "$(uname)" = "Darwin" ]; then | if [ "$(uname)" = "Darwin" ]; then | ||||
notify() { osascript -e "display notification \"$2 in $1\" with title \"You've got Mail\" subtitle \"Account: $account\"" && sleep 2 ;} | notify() { osascript -e "display notification \"$2 in $1\" with title \"You've got Mail\" subtitle \"Account: $account\"" && sleep 2 ;} | ||||
else | else | ||||
notify() { notify-send "mutt-wizard" "📬 $2 new mail(s) in \`$1\` account." ;} | |||||
notify() { notify-send --app-name="mutt-wizard" "mutt-wizard" "📬 $2 new mail(s) in \`$1\` account." ;} | |||||
fi | fi | ||||
# Check account for new mail. Notify if there is new content. | # Check account for new mail. Notify if there is new content. | ||||
@@ -35,7 +35,7 @@ syncandnotify() { | |||||
# Extract subject and sender from mail. | # Extract subject and sender from mail. | ||||
from=$(awk '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | awk '{ $1=""; if (NF>=3)$NF=""; print $0 }' | sed 's/^[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//') | from=$(awk '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | awk '{ $1=""; if (NF>=3)$NF=""; print $0 }' | sed 's/^[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//') | ||||
subject=$(awk '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | head -n-1 | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | sed 's/^Subject: //' | sed 's/^{[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//' | tr -d '\n') | subject=$(awk '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | head -n-1 | perl -CS -MEncode -ne 'print decode("MIME-Header", $_)' | sed 's/^Subject: //' | sed 's/^{[[:blank:]]*[\"'\''\<]*//;s/[\"'\''\>]*[[:blank:]]*$//' | tr -d '\n') | ||||
notify-send "📧$from:" "$subject" & | |||||
notify-send --app-name="mutt-wizard" "📧$from:" "$subject" & | |||||
done | done | ||||
fi | fi | ||||
} | } | ||||
@@ -48,7 +48,7 @@ else | |||||
fi | fi | ||||
echo " 🔃" > /tmp/imapsyncicon_"$USER" | echo " 🔃" > /tmp/imapsyncicon_"$USER" | ||||
pkill -RTMIN+12 i3blocks >/dev/null 2>&1 | |||||
pkill -RTMIN+12 "${STATUSBAR:?}" >/dev/null 2>&1 | |||||
# Parallelize multiple accounts | # Parallelize multiple accounts | ||||
for account in $accounts | for account in $accounts | ||||
@@ -58,7 +58,7 @@ done | |||||
wait | wait | ||||
rm -f /tmp/imapsyncicon_"$USER" | rm -f /tmp/imapsyncicon_"$USER" | ||||
pkill -RTMIN+12 i3blocks >/dev/null 2>&1 | |||||
pkill -RTMIN+12 "${STATUSBAR:?}" >/dev/null 2>&1 | |||||
notmuch new 2>/dev/null | notmuch new 2>/dev/null | ||||
@@ -1,9 +1,9 @@ | |||||
#!/bin/bash | |||||
#!/usr/bin/env bash | |||||
#get image resolution | #get image resolution | ||||
resolution=$(identify $1 | awk '{print $3}') | resolution=$(identify $1 | awk '{print $3}') | ||||
IFS='x' # x is set as delimiter | IFS='x' # x is set as delimiter | ||||
read -ra ADDR <<< "$resolution" | |||||
read -ra ADDR <<< "$resolution" | |||||
width=${ADDR[0]} | width=${ADDR[0]} | ||||
height=${ADDR[1]} | height=${ADDR[1]} | ||||
@@ -1,4 +1,4 @@ | |||||
#!/bin/sh | |||||
#!/usr/bin/env sh | |||||
command -V gpg >/dev/null 2>&1 && GPG="gpg" || GPG="gpg2" | command -V gpg >/dev/null 2>&1 && GPG="gpg" || GPG="gpg2" | ||||
[ -z ${PASSWORD_STORE_DIR+x} ] && PASSWORD_STORE_DIR="$HOME/.password-store" | [ -z ${PASSWORD_STORE_DIR+x} ] && PASSWORD_STORE_DIR="$HOME/.password-store" | ||||
[ -r "$PASSWORD_STORE_DIR/.gpg-id" ] && | [ -r "$PASSWORD_STORE_DIR/.gpg-id" ] && | ||||
@@ -8,11 +8,7 @@ command -V gpg >/dev/null 2>&1 && GPG="gpg" || GPG="gpg2" | |||||
} | } | ||||
! command -v mbsync >/dev/null && printf "\`mbsync\` must be installed to run mutt-wizard.\\n" && exit | ! command -v mbsync >/dev/null && printf "\`mbsync\` must be installed to run mutt-wizard.\\n" && exit | ||||
case "$(uname)" in | |||||
Linux) prefix="/usr" ;; | |||||
*) prefix="/usr/local" ;; | |||||
esac | |||||
prefix="/usr/local" | |||||
muttdir="$HOME/.config/mutt" # Main mutt config location | muttdir="$HOME/.config/mutt" # Main mutt config location | ||||
accdir="$muttdir/accounts" # Directory for account settings | accdir="$muttdir/accounts" # Directory for account settings | ||||
maildir="$HOME/.local/share/mail" # Location of mail storage | maildir="$HOME/.local/share/mail" # Location of mail storage | ||||
@@ -73,6 +69,7 @@ Patterns * !\"[Gmail]/All Mail\" | |||||
Create Both | Create Both | ||||
SyncState * | SyncState * | ||||
MaxMessages $maxmes | MaxMessages $maxmes | ||||
ExpireUnread no | |||||
# End profile | # End profile | ||||
" | " | ||||
@@ -242,7 +239,7 @@ finalize() { \ | |||||
trash=$(echo "$boxes" | grep -i -m 1 trash | sed 's/=/+/g') | trash=$(echo "$boxes" | grep -i -m 1 trash | sed 's/=/+/g') | ||||
sed -ibu "/^mailboxes\|^set record\|^set postponed\|^set trash\|^set spoolfile/d" "$accdir/$idnum-$title.muttrc" ; rm -f "$accdir/$idnum-$title.muttrcbu" | sed -ibu "/^mailboxes\|^set record\|^set postponed\|^set trash\|^set spoolfile/d" "$accdir/$idnum-$title.muttrc" ; rm -f "$accdir/$idnum-$title.muttrcbu" | ||||
{ echo "set spoolfile = \"$spoolfile\""; echo "set record = \"$record\""; echo "set postponed = \"$postponed\""; echo "set trash = \"$trash\""; } >> "$accdir/$idnum-$title.muttrc" | { echo "set spoolfile = \"$spoolfile\""; echo "set record = \"$record\""; echo "set postponed = \"$postponed\""; echo "set trash = \"$trash\""; } >> "$accdir/$idnum-$title.muttrc" | ||||
echo "mailboxes =$title ===================== $(echo "$boxes" | sed -e "s/^\|$/\"/g" | tr "\n" " ")" >> "$accdir/$idnum-$title.muttrc" | |||||
echo "mailboxes $(echo "$boxes" | sed -e "s/^\|$/\"/g" | tr "\n" " ")" >> "$accdir/$idnum-$title.muttrc" | |||||
printf "Setting up your keyboard shortcuts for jumping between mailboxes...\\n" | printf "Setting up your keyboard shortcuts for jumping between mailboxes...\\n" | ||||
sed -ibu "/# mw-autogenerated/d" "$accdir/$idnum-$title.muttrc" ; rm -f "$accdir/$idnum-$title.muttrcbu" | sed -ibu "/# mw-autogenerated/d" "$accdir/$idnum-$title.muttrc" ; rm -f "$accdir/$idnum-$title.muttrcbu" | ||||
echo "$boxes" | grep -i inbox | head -n 1 | formatShortcut i inbox | echo "$boxes" | grep -i inbox | head -n 1 | formatShortcut i inbox | ||||
@@ -1,4 +1,4 @@ | |||||
#!/bin/sh | |||||
#!/usr/bin/env sh | |||||
# Helps open a file with xdg-open from mutt in a external program without weird side effects. | # Helps open a file with xdg-open from mutt in a external program without weird side effects. | ||||
[ $(uname) = "Darwin" ] && opener="open" || opener="setsid xdg-open" | [ $(uname) = "Darwin" ] && opener="open" || opener="setsid xdg-open" | ||||
mkdir -p "/tmp/$USER-mutt-tmp" | mkdir -p "/tmp/$USER-mutt-tmp" | ||||
@@ -60,10 +60,10 @@ will delete downloaded mail for for safety (and time)'s sake. If you want to del | |||||
.TP | .TP | ||||
.B Default settings | .B Default settings | ||||
The mutt-wizard has many default settings that focus on making it aesthetically pleasing and supplying more vim-like bindings. These can be found in | The mutt-wizard has many default settings that focus on making it aesthetically pleasing and supplying more vim-like bindings. These can be found in | ||||
.I /usr/share/mutt-wizard/mutt-wizard.muttrc | |||||
.I /usr/local/share/mutt-wizard/mutt-wizard.muttrc | |||||
and the default mailcap file can be found in | and the default mailcap file can be found in | ||||
.I | .I | ||||
/usr/share/mutt-wizard/mailcap. | |||||
/usr/local/share/mutt-wizard/mailcap. | |||||
Any of these settings can be overwritten in | Any of these settings can be overwritten in | ||||
.I ~/.config/mutt/muttrc, | .I ~/.config/mutt/muttrc, | ||||
but be mindful that your overriding binds should appear after the | but be mindful that your overriding binds should appear after the | ||||
@@ -73,7 +73,7 @@ file is sourced. | |||||
.TP | .TP | ||||
.B Detecting server settings | .B Detecting server settings | ||||
mutt-wizard has a repository of email services and their server information kept in | mutt-wizard has a repository of email services and their server information kept in | ||||
.I /usr/share/mutt-wizard/domains.csv | |||||
.I /usr/local/share/mutt-wizard/domains.csv | |||||
which is used to automatically configure email settings. | which is used to automatically configure email settings. | ||||
If your email provider is not found there, it will prompt you to input your email service's IMAP and SMTP server information which can usually be found by searching online. | If your email provider is not found there, it will prompt you to input your email service's IMAP and SMTP server information which can usually be found by searching online. | ||||
@@ -1,4 +1,5 @@ | |||||
ADDRESS,IMAP,imap port,SMTP,smtp port | ADDRESS,IMAP,imap port,SMTP,smtp port | ||||
icloud.com,imap.mail.me.com,993,smtp.mail.me.com,587 | |||||
420blaze.it,mail.cock.li,993,mail.cock.li,587 | 420blaze.it,mail.cock.li,993,mail.cock.li,587 | ||||
8chan.co,mail.cock.li,993,mail.cock.li,587 | 8chan.co,mail.cock.li,993,mail.cock.li,587 | ||||
aaathats3as.com,mail.cock.li,993,mail.cock.li,587 | aaathats3as.com,mail.cock.li,993,mail.cock.li,587 | ||||
@@ -278,3 +279,4 @@ yandex.ua,imap.yandex.com,993,smtp.yandex.com,587 | |||||
zoho.com,imap.zoho.com,993,smtp.zoho.com,465 | zoho.com,imap.zoho.com,993,smtp.zoho.com,465 | ||||
polito.it,mail.polito.it,993,mail.polito.it,465 | polito.it,mail.polito.it,993,mail.polito.it,465 | ||||
studio.unibo.it,outlook.office365.com,993,smtp.office365.com,587 | studio.unibo.it,outlook.office365.com,993,smtp.office365.com,587 | ||||
hs-mittweida.de,mail.hs-mittweida.de,993,mail.hs-mittweida.de,465 |
@@ -1,6 +1,6 @@ | |||||
text/plain; $EDITOR %s ; | text/plain; $EDITOR %s ; | ||||
text/html; openfile %s ; nametemplate=%s.html | text/html; openfile %s ; nametemplate=%s.html | ||||
text/html; w3m -I %{charset} -T text/html; copiousoutput; | |||||
text/html; lynx -assume_charset=%{charset} -display_charset=utf-8 -dump %s; nametemplate=%s.html; copiousoutput; | |||||
image/*; muttimage %s ; copiousoutput | image/*; muttimage %s ; copiousoutput | ||||
video/*; setsid mpv --quiet %s &; copiousoutput | video/*; setsid mpv --quiet %s &; copiousoutput | ||||
application/pdf; openfile %s ; | application/pdf; openfile %s ; | ||||
@@ -3,7 +3,7 @@ | |||||
# mutt-wizard will have this file sourced from your muttrc. | # mutt-wizard will have this file sourced from your muttrc. | ||||
# In the interest of seamless updating, do not edit this file. | # In the interest of seamless updating, do not edit this file. | ||||
# If you want to override any settings, set those in your muttrc. | # If you want to override any settings, set those in your muttrc. | ||||
set mailcap_path = /usr/share/mutt-wizard/mailcap | |||||
set mailcap_path = /usr/local/share/mutt-wizard/mailcap | |||||
set date_format="%y/%m/%d %I:%M%p" | set date_format="%y/%m/%d %I:%M%p" | ||||
set index_format="%2C %zs %?X?A& ? %D %-15.15F %s (%-4.4c)" | set index_format="%2C %zs %?X?A& ? %D %-15.15F %s (%-4.4c)" | ||||
set sort = 'reverse-date' | set sort = 'reverse-date' | ||||
@@ -44,6 +44,7 @@ bind index U undelete-message | |||||
bind index L limit | bind index L limit | ||||
bind index h noop | bind index h noop | ||||
bind index l display-message | bind index l display-message | ||||
bind index <space> tag-entry | |||||
#bind browser h goto-parent | #bind browser h goto-parent | ||||
macro browser h '<change-dir><kill-line>..<enter>' "Go to parent folder" | macro browser h '<change-dir><kill-line>..<enter>' "Go to parent folder" | ||||
bind index,pager H view-raw-message | bind index,pager H view-raw-message | ||||
@@ -62,7 +63,7 @@ bind editor <Tab> complete-query | |||||
macro index,pager a "<enter-command>set my_pipe_decode=\$pipe_decode pipe_decode<return><pipe-message>abook --add-email<return><enter-command>set pipe_decode=\$my_pipe_decode; unset my_pipe_decode<return>" "add the sender address to abook" | macro index,pager a "<enter-command>set my_pipe_decode=\$pipe_decode pipe_decode<return><pipe-message>abook --add-email<return><enter-command>set pipe_decode=\$my_pipe_decode; unset my_pipe_decode<return>" "add the sender address to abook" | ||||
macro index \Cr "T~U<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>" "mark all messages as read" | macro index \Cr "T~U<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>" "mark all messages as read" | ||||
macro index O "<shell-escape>mailsync -Va<enter>" "run mbsync to sync all mail" | |||||
macro index O "<shell-escape>mbsync -a<enter>" "run mbsync to sync all mail" | |||||
macro index \Cf "<enter-command>unset wait_key<enter><shell-escape>read -p 'Enter a search term to find with notmuch: ' x; echo \$x >~/.cache/mutt_terms<enter><limit>~i \"\`notmuch search --output=messages \$(cat ~/.cache/mutt_terms) | head -n 600 | perl -le '@a=<>;s/\^id:// for@a;$,=\"|\";print@a' | perl -le '@a=<>; chomp@a; s/\\+/\\\\+/ for@a;print@a' \`\"<enter>" "show only messages matching a notmuch pattern" | macro index \Cf "<enter-command>unset wait_key<enter><shell-escape>read -p 'Enter a search term to find with notmuch: ' x; echo \$x >~/.cache/mutt_terms<enter><limit>~i \"\`notmuch search --output=messages \$(cat ~/.cache/mutt_terms) | head -n 600 | perl -le '@a=<>;s/\^id:// for@a;$,=\"|\";print@a' | perl -le '@a=<>; chomp@a; s/\\+/\\\\+/ for@a;print@a' \`\"<enter>" "show only messages matching a notmuch pattern" | ||||
macro index A "<limit>all\n" "show all messages (undo limit)" | macro index A "<limit>all\n" "show all messages (undo limit)" | ||||
@@ -91,6 +92,11 @@ color index brightyellow black "~N" | |||||
color index_author brightred black "~N" | color index_author brightred black "~N" | ||||
color index_subject brightcyan black "~N" | color index_subject brightcyan black "~N" | ||||
# Tagged mail is highlighted: | |||||
color index brightyellow blue "~T" | |||||
color index_author brightred blue "~T" | |||||
color index_subject brightcyan blue "~T" | |||||
# Other colors and aesthetic settings: | # Other colors and aesthetic settings: | ||||
mono bold bold | mono bold bold | ||||
mono underline underline | mono underline underline | ||||