doomemacs/modules/email/mu4e/config.el

230 lines
8.5 KiB
EmacsLisp
Raw Normal View History

;;; email/mu4e/config.el -*- lexical-binding: t; -*-
2017-04-08 01:31:20 -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
;;
;;; Packages
2017-04-08 01:31:20 -04:00
(use-package! mu4e
:commands mu4e mu4e-compose-new
2018-01-24 15:08:43 -05:00
:init
(provide 'html2text) ; disable obsolete package
(when (or (not (require 'mu4e-meta nil t))
(version< mu4e-mu-version "1.4"))
(setq mu4e-maildir "~/.mail"
mu4e-user-mail-address-list nil))
(setq mu4e-attachment-dir
(lambda (&rest _)
(expand-file-name ".attachments" (mu4e-root-maildir))))
2017-04-08 01:31:20 -04:00
:config
(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
2020-09-23 00:22:04 +08:00
mu4e-view-use-gnus t ; the way of the future: https://github.com/djcb/mu/pull/1442#issuecomment-591695814
2017-04-08 01:31:20 -04:00
;; configuration for sending mail
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
;; use helm/ivy/vertico
2018-01-24 15:08:43 -05:00
mu4e-completing-read-function
(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
;; remove 'lists' column
mu4e-headers-fields
'((:account . 12)
(:human-date . 12)
(:flags . 4)
(:from . 25)
2018-01-24 15:08:43 -05:00
(:subject)))
;; set mail user agent
(setq mail-user-agent 'mu4e-user-agent)
2020-09-23 00:23:01 +08:00
;; Set the icons only when a graphical frame has been created
(if (display-graphic-p)
(mu4e~initialise-icons)
;; When it's the server, wait till the first graphical frame
(add-hook! 'server-after-make-frame-hook
(defun mu4e~initialise-icons-hook ()
(when (display-graphic-p)
(mu4e~initialise-icons)
(remove-hook #'mu4e~initialise-icons-hook)))))
;; Header view
(setq mu4e-headers-fields
'((:account . 12)
(:human-date . 8)
(:flags . 6) ; 3 icon flags
(:from . 25)
(:subject))
(plist-put (cdr (assoc :flags mu4e-header-info)) :shortname " Flags") ; default=Flgs
(defvar mu4e~header-colourised-faces
'(all-the-icons-lblue
all-the-icons-purple
all-the-icons-blue-alt
all-the-icons-green
all-the-icons-maroon
all-the-icons-yellow
all-the-icons-orange))
;; Add a column to display what email account the email belongs to.
(setq 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)))
(mu4e-header-colourise
(replace-regexp-in-string
"^gmail"
(propertize "g" 'face 'bold-italic)
(format "%s"
(substring maildir 1
(string-match-p "/" maildir 1)))))))))
(:recipnum .
(:name "Number of recipients"
:shortname ""
:help "Number of recipients for this message"
:function
(lambda (msg)
(propertize (format "%2d"
(+ (length (mu4e-message-field msg :to))
(length (mu4e-message-field msg :cc))))
'face 'mu4e-footer-face)))))))
;; Marks usually affect the current view
(defadvice! +mu4e--refresh-current-view-a (&rest _)
:after #'mu4e-mark-execute-all (mu4e-headers-rerun-search))
;; 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
;; Html mails might be better rendered in a browser
(add-to-list 'mu4e-view-actions '("View in browser" . mu4e-action-view-in-browser))
;; The header view needs a certain amount of horizontal space to
;; actually show you all the information you want to see
;; so if the header view is entered from a narrow frame,
;; it's probably worth trying to expand it
(defvar mu4e-min-header-frame-width 120
"Minimum reasonable with for the header view.")
(defun mu4e-widen-frame-maybe ()
"Expand the frame with if it's less than `mu4e-min-header-frame-width'."
(when (< (frame-width) mu4e-min-header-frame-width)
(set-frame-width (selected-frame) mu4e-min-header-frame-width)))
(add-hook 'mu4e-headers-mode-hook #'mu4e-widen-frame-maybe)
2017-04-08 01:31:20 -04:00
(when (fboundp 'imagemagick-register-types)
(imagemagick-register-types))
(map! :map mu4e-headers-mode-map
:e "l" #'mu4e-msg-to-agenda)
(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)
;; Due to evil, none of the marking commands work when making a visual selection in
;; the headers view of mu4e. Without overriding any evil commands we may actually
;; want to use in and evil selection, this can be easily fixed.
(when (featurep! :editor evil)
(map! :map mu4e-headers-mode-map
:v "*" #'mu4e-headers-mark-for-something
:v "!" #'mu4e-headers-mark-for-read
:v "?" #'mu4e-headers-mark-for-unread
:v "u" #'mu4e-headers-mark-for-unmark
:vn "l" #'mu4e-msg-to-agenda))
(add-hook 'mu4e-compose-pre-hook 'my-mu4e-set-account)
(advice-add #'mu4e~main-action-str :override #'mu4e~main-action-prettier-str))
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
;;
;;; 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"))
(delq! 'delete mu4e-marks #'assq)
(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)
(list :char '("r" . "")
:prompt "rrefile"
:dyn-target (lambda (_target msg) (mu4e-get-refile-folder msg))
: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.
(add-hook! 'mu4e-mark-execute-pre-hook
(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")))))))