2019-05-05 14:11:59 -04:00
|
|
|
;;; email/mu4e/config.el -*- lexical-binding: t; -*-
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2019-05-05 14:11:59 -04:00
|
|
|
(defvar +mu4e-backend 'mbsync
|
2018-01-24 15:08:43 -05:00
|
|
|
"Which backend to use. Can either be offlineimap, mbsync or nil (manual).")
|
2017-04-08 01:31:20 -04:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
2019-05-05 14:11:59 -04:00
|
|
|
;;; Packages
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! mu4e
|
2019-07-23 12:30:47 +02:00
|
|
|
:commands mu4e mu4e-compose-new
|
2018-01-24 15:08:43 -05:00
|
|
|
:init
|
2018-04-04 18:22:13 -04:00
|
|
|
(provide 'html2text) ; disable obsolete package
|
2020-04-27 14:08:36 -04:00
|
|
|
(when (or (not (require 'mu4e-meta nil t))
|
|
|
|
(version< mu4e-mu-version "1.4"))
|
2020-04-22 23:38:07 +02:00
|
|
|
(setq mu4e-maildir "~/.mail"
|
|
|
|
mu4e-user-mail-address-list nil))
|
2020-05-25 02:26:38 -04:00
|
|
|
(setq mu4e-attachment-dir
|
2020-05-26 13:23:02 -04:00
|
|
|
(lambda (&rest _)
|
|
|
|
(expand-file-name ".attachments" (mu4e-root-maildir))))
|
2017-04-08 01:31:20 -04:00
|
|
|
:config
|
2019-05-05 14:11:59 -04:00
|
|
|
(pcase +mu4e-backend
|
2018-01-24 15:08:43 -05:00
|
|
|
(`mbsync
|
|
|
|
(setq mu4e-get-mail-command "mbsync -a"
|
|
|
|
mu4e-change-filenames-when-moving t))
|
|
|
|
(`offlineimap
|
|
|
|
(setq mu4e-get-mail-command "offlineimap -o -q")))
|
|
|
|
|
|
|
|
(setq mu4e-update-interval nil
|
2017-04-08 01:31:20 -04:00
|
|
|
mu4e-compose-format-flowed t ; visual-line-mode + auto-fill upon sending
|
|
|
|
mu4e-view-show-addresses t
|
2018-01-24 15:08:43 -05:00
|
|
|
mu4e-sent-messages-behavior 'sent
|
|
|
|
mu4e-hide-index-messages t
|
2017-04-08 01:31:20 -04:00
|
|
|
;; try to show images
|
|
|
|
mu4e-view-show-images t
|
|
|
|
mu4e-view-image-max-width 800
|
|
|
|
;; configuration for sending mail
|
2017-04-17 02:17:10 -04:00
|
|
|
message-send-mail-function #'smtpmail-send-it
|
2017-04-08 01:31:20 -04:00
|
|
|
smtpmail-stream-type 'starttls
|
2018-01-24 15:08:43 -05:00
|
|
|
message-kill-buffer-on-exit t ; close after sending
|
2017-04-08 01:31:20 -04:00
|
|
|
;; start with the first (default) context;
|
|
|
|
mu4e-context-policy 'pick-first
|
|
|
|
;; compose with the current context, or ask
|
|
|
|
mu4e-compose-context-policy 'ask-if-none
|
2021-07-09 20:16:11 +03:00
|
|
|
;; use helm/ivy/vertico
|
2018-01-24 15:08:43 -05:00
|
|
|
mu4e-completing-read-function
|
2021-07-09 20:16:11 +03:00
|
|
|
(cond ((featurep! :completion ivy) #'ivy-completing-read)
|
|
|
|
((featurep! :completion helm) #'completing-read)
|
|
|
|
((featurep! :completion vertico) #'completing-read)
|
2018-01-24 15:08:43 -05:00
|
|
|
(t #'ido-completing-read))
|
2017-04-08 01:31:20 -04:00
|
|
|
;; no need to ask
|
2018-10-03 09:05:36 +13:00
|
|
|
mu4e-confirm-quit nil
|
2017-04-09 17:42:17 -04:00
|
|
|
;; remove 'lists' column
|
2017-04-14 02:36:36 -04:00
|
|
|
mu4e-headers-fields
|
|
|
|
'((:account . 12)
|
|
|
|
(:human-date . 12)
|
|
|
|
(:flags . 4)
|
|
|
|
(:from . 25)
|
2018-01-24 15:08:43 -05:00
|
|
|
(:subject)))
|
|
|
|
|
2019-01-21 16:10:27 -08:00
|
|
|
;; set mail user agent
|
|
|
|
(setq mail-user-agent 'mu4e-user-agent)
|
|
|
|
|
2018-01-24 15:08:43 -05:00
|
|
|
;; Use fancy icons
|
2020-03-24 14:12:10 +01:00
|
|
|
(setq mu4e-use-fancy-chars t
|
2018-08-17 12:40:47 +02:00
|
|
|
mu4e-headers-draft-mark '("D" . "")
|
|
|
|
mu4e-headers-flagged-mark '("F" . "")
|
|
|
|
mu4e-headers-new-mark '("N" . "")
|
|
|
|
mu4e-headers-passed-mark '("P" . "")
|
|
|
|
mu4e-headers-replied-mark '("R" . "")
|
|
|
|
mu4e-headers-seen-mark '("S" . "")
|
|
|
|
mu4e-headers-trashed-mark '("T" . "")
|
|
|
|
mu4e-headers-attach-mark '("a" . "")
|
|
|
|
mu4e-headers-encrypted-mark '("x" . "")
|
|
|
|
mu4e-headers-signed-mark '("s" . "")
|
|
|
|
mu4e-headers-unread-mark '("u" . ""))
|
2017-04-18 21:04:25 -04:00
|
|
|
|
|
|
|
;; Add a column to display what email account the email belongs to.
|
2017-06-11 00:59:02 +02:00
|
|
|
(add-to-list 'mu4e-header-info-custom
|
|
|
|
'(:account
|
|
|
|
:name "Account"
|
|
|
|
:shortname "Account"
|
|
|
|
:help "Which account this email belongs to"
|
|
|
|
:function
|
|
|
|
(lambda (msg)
|
|
|
|
(let ((maildir (mu4e-message-field msg :maildir)))
|
|
|
|
(format "%s" (substring maildir 1 (string-match-p "/" maildir 1)))))))
|
2017-04-09 17:42:17 -04:00
|
|
|
|
2019-07-23 17:24:56 +02:00
|
|
|
(defadvice! +mu4e--refresh-current-view-a (&rest _)
|
|
|
|
:after #'mu4e-mark-execute-all (mu4e-headers-rerun-search))
|
2017-04-18 21:04:25 -04:00
|
|
|
|
2017-04-09 22:10:41 -04:00
|
|
|
;; Wrap text in messages
|
2018-10-24 01:09:17 -04:00
|
|
|
(setq-hook! 'mu4e-view-mode-hook truncate-lines nil)
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2020-05-03 18:05:31 +02:00
|
|
|
;; Html mails might be better rendered in a browser
|
|
|
|
(add-to-list 'mu4e-view-actions '("View in browser" . mu4e-action-view-in-browser))
|
|
|
|
|
2017-04-08 01:31:20 -04:00
|
|
|
(when (fboundp 'imagemagick-register-types)
|
2017-04-19 13:18:03 -04:00
|
|
|
(imagemagick-register-types))
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2019-10-21 02:01:37 +02:00
|
|
|
(map! :localleader
|
|
|
|
:map mu4e-compose-mode-map
|
|
|
|
:desc "send and exit" "s" #'message-send-and-exit
|
|
|
|
:desc "kill buffer" "d" #'message-kill-buffer
|
|
|
|
:desc "save draft" "S" #'message-dont-send
|
|
|
|
:desc "attach" "a" #'mail-add-attachment))
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2020-09-23 00:00:39 +08:00
|
|
|
(when (featurep! :lang org)
|
|
|
|
(use-package! org-msg
|
|
|
|
:hook (org-load . org-msg-mode)
|
|
|
|
:config
|
|
|
|
(setq org-msg-startup "inlineimages"
|
|
|
|
org-msg-greeting-name-limit 3
|
|
|
|
org-msg-text-plain-alternative t)))
|
2017-04-16 21:24:18 -04:00
|
|
|
|
2017-04-08 01:31:20 -04:00
|
|
|
|
2018-01-24 15:08:43 -05:00
|
|
|
|
|
|
|
;;
|
2019-05-05 14:11:59 -04:00
|
|
|
;;; Gmail integration
|
|
|
|
|
|
|
|
(when (featurep! +gmail)
|
|
|
|
(after! mu4e
|
|
|
|
;; don't save message to Sent Messages, Gmail/IMAP takes care of this
|
|
|
|
(setq mu4e-sent-messages-behavior 'delete
|
|
|
|
|
|
|
|
;; don't need to run cleanup after indexing for gmail
|
|
|
|
mu4e-index-cleanup nil
|
|
|
|
|
|
|
|
;; because gmail uses labels as folders we can use lazy check since
|
|
|
|
;; messages don't really "move"
|
|
|
|
mu4e-index-lazy-check t)
|
|
|
|
|
|
|
|
;; In my workflow, emails won't be moved at all. Only their flags/labels are
|
|
|
|
;; changed. Se we redefine the trash and refile marks not to do any moving.
|
|
|
|
;; However, the real magic happens in `+mu4e|gmail-fix-flags'.
|
|
|
|
;;
|
|
|
|
;; Gmail will handle the rest.
|
|
|
|
(defun +mu4e--mark-seen (docid _msg target)
|
|
|
|
(mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N"))
|
|
|
|
|
2019-07-23 12:30:47 +02:00
|
|
|
(delq! 'delete mu4e-marks #'assq)
|
2019-05-05 14:11:59 -04:00
|
|
|
(setf (alist-get 'trash mu4e-marks)
|
|
|
|
(list :char '("d" . "▼")
|
|
|
|
:prompt "dtrash"
|
|
|
|
:dyn-target (lambda (_target msg) (mu4e-get-trash-folder msg))
|
|
|
|
:action #'+mu4e--mark-seen)
|
|
|
|
;; Refile will be my "archive" function.
|
|
|
|
(alist-get 'refile mu4e-marks)
|
2019-11-30 22:26:27 +08:00
|
|
|
(list :char '("r" . "▼")
|
|
|
|
:prompt "rrefile"
|
|
|
|
:dyn-target (lambda (_target msg) (mu4e-get-refile-folder msg))
|
2019-05-05 14:11:59 -04:00
|
|
|
:action #'+mu4e--mark-seen))
|
|
|
|
|
|
|
|
;; This hook correctly modifies gmail flags on emails when they are marked.
|
|
|
|
;; Without it, refiling (archiving), trashing, and flagging (starring) email
|
|
|
|
;; won't properly result in the corresponding gmail action, since the marks
|
|
|
|
;; are ineffectual otherwise.
|
2019-07-26 19:57:13 +02:00
|
|
|
(add-hook! 'mu4e-mark-execute-pre-hook
|
2019-07-23 12:30:47 +02:00
|
|
|
(defun +mu4e-gmail-fix-flags-h (mark msg)
|
|
|
|
(pcase mark
|
|
|
|
(`trash (mu4e-action-retag-message msg "-\\Inbox,+\\Trash,-\\Draft"))
|
|
|
|
(`refile (mu4e-action-retag-message msg "-\\Inbox"))
|
|
|
|
(`flag (mu4e-action-retag-message msg "+\\Starred"))
|
|
|
|
(`unflag (mu4e-action-retag-message msg "-\\Starred")))))))
|