327 lines
12 KiB
Org Mode
327 lines
12 KiB
Org Mode
#+TITLE: Mu4e layer
|
|
|
|
#+TAGS: e-mail|layer
|
|
|
|
* Table of Contents :TOC_5_gh:noexport:
|
|
- [[#description][Description]]
|
|
- [[#features][Features:]]
|
|
- [[#install][Install]]
|
|
- [[#commands][Commands]]
|
|
- [[#global-bindings][Global bindings]]
|
|
- [[#headers-mode][Headers mode]]
|
|
- [[#view-mode][View mode]]
|
|
- [[#compose-mode][Compose mode]]
|
|
- [[#configuration][Configuration]]
|
|
- [[#maildirs-extension][Maildirs extension]]
|
|
- [[#multiple-accounts][Multiple Accounts]]
|
|
- [[#async-mode][Async mode]]
|
|
- [[#attachment-directory][Attachment directory]]
|
|
- [[#example-configuration][Example configuration]]
|
|
- [[#notifications][Notifications]]
|
|
- [[#os-notifications][OS notifications]]
|
|
- [[#mode-line-notifications][Mode-line notifications]]
|
|
- [[#spacemacs-layout-integration][Spacemacs layout integration]]
|
|
- [[#org-mu4e-integration][Org-mu4e integration]]
|
|
- [[#mu4e-link-support-in-org-mode][Mu4e link support in Org mode]]
|
|
- [[#composing-org-mode-messages-in-mu4e][Composing Org mode messages in mu4e]]
|
|
- [[#see-also][See also]]
|
|
|
|
* Description
|
|
This layer adds support for the =Mu4e= email client.
|
|
|
|
** Features:
|
|
- Search, read, reply, move, and delete email.
|
|
- Search-based: no folders, only queries.
|
|
- UI optimized for speed: quick keystrokes for common actions.
|
|
- Very extendable and customizable.
|
|
- Integration with Helm.
|
|
- Maildir summary using [[https://github.com/agpchil/mu4e-maildirs-extension][mu4e-mailidirs-extension]]
|
|
- Notifications using [[https://github.com/iqbalansari/mu4e-alert][mu4e-alert]]
|
|
|
|
* Install
|
|
In order to use this layer you must install =mu= and =mu4e= separately.
|
|
Typically =mu4e= will be bundled with =mu= (this is the case on many Linux
|
|
distributions).
|
|
|
|
If you're on macOS and install =mu= using Homebrew, you must specify the
|
|
location of your Emacs binary at install time using the EMACS environment
|
|
variable, as well as passing the =--with-emacs= option:
|
|
|
|
#+BEGIN_SRC shell
|
|
brew install mu --with-emacs
|
|
#+END_SRC
|
|
|
|
If the installation directory of =mu4e= is not in Emacs' load path, you can set
|
|
the layer variable =mu4e-installation-path=, for example:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables
|
|
mu4e-installation-path "/usr/share/emacs/site-lisp")))
|
|
#+END_SRC
|
|
|
|
Then add this layer to your =~/.spacemacs=. You will need to add =mu4e= to the
|
|
existing =dotspacemacs-configuration-layers= list in this file.
|
|
|
|
* Commands
|
|
** Global bindings
|
|
|
|
| Key binding | Command |
|
|
|------------------------+---------------------------------|
|
|
| ~SPC a e m~ | Start mu4e |
|
|
| ~SPC m S~ or ~SPC m /~ | Search emails (requires helm) |
|
|
| ~SPC m C~ | Search contacts (requires helm) |
|
|
| ~C-x m~ | Compose new message |
|
|
|
|
** Headers mode
|
|
|
|
| Key binding | Command |
|
|
|-------------+-------------------------------------------------------------|
|
|
| ~J~ | Go to next unread thread marking other mail read on the way |
|
|
| ~C-j~ | Next header |
|
|
| ~C-k~ | Previous header |
|
|
|
|
** View mode
|
|
|
|
| Key binding | Command |
|
|
|-------------+-------------------------------------------------------------|
|
|
| ~J~ | Go to next unread thread marking other mail read on the way |
|
|
| ~C-j~ | Next header |
|
|
| ~C-k~ | Previous header |
|
|
|
|
** Compose mode
|
|
|
|
| Key binding | Command |
|
|
|------------------------+--------------------------------|
|
|
| ~SPC m c~ or ~SPC m ,~ | Send the message and exit |
|
|
| ~SPC m k~ or ~SPC m a~ | Kill the message buffer |
|
|
| ~SPC m s~ | Auto-save and bury the message |
|
|
| ~SPC m f~ | Add file as attachment |
|
|
| ~SPC m o~ | Compose in Org-mode syntax |
|
|
|
|
* Configuration
|
|
Configuration varies too much to give precise instructions. What follows is one
|
|
example configuration. Refer to =mu4e='s manual for more detailed configuration
|
|
instructions.
|
|
|
|
** Maildirs extension
|
|
The [[https://github.com/agpchil/mu4e-maildirs-extension][maildirs extension]] adds a list of all your maildirs to the main =mu4e= view
|
|
that by default shows the unread and total mail counts for all your mail under
|
|
your base mail directory.
|
|
|
|
The maildirs extension is not enabled by default. To activate it, change the
|
|
variable =mu4e-use-maildirs-extension= to a non-nil value:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables
|
|
mu4e-use-maildirs-extension t)))
|
|
#+END_SRC
|
|
|
|
** Multiple Accounts
|
|
With =mu 0.9.16=, =mu4e= comes with a native contexts feature for managing
|
|
multiple accounts.
|
|
|
|
The following example is taken from the manual:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq mu4e-contexts
|
|
`( ,(make-mu4e-context
|
|
:name "Private"
|
|
:enter-func (lambda () (mu4e-message "Switch to the Private context"))
|
|
;; leave-func not defined
|
|
:match-func (lambda (msg)
|
|
(when msg
|
|
(mu4e-message-contact-field-matches msg
|
|
:to "aliced@home.example.com")))
|
|
:vars '( ( user-mail-address . "aliced@home.example.com" )
|
|
( user-full-name . "Alice Derleth" )
|
|
( mu4e-compose-signature .
|
|
(concat
|
|
"Alice Derleth\n"
|
|
"Lauttasaari, Finland\n"))))
|
|
,(make-mu4e-context
|
|
:name "Work"
|
|
:enter-func (lambda () (mu4e-message "Switch to the Work context"))
|
|
;; leave-fun not defined
|
|
:match-func (lambda (msg)
|
|
(when msg
|
|
(mu4e-message-contact-field-matches msg
|
|
:to "aderleth@miskatonic.example.com")))
|
|
:vars '( ( user-mail-address . "aderleth@miskatonic.example.com" )
|
|
( user-full-name . "Alice Derleth" )
|
|
( mu4e-compose-signature .
|
|
(concat
|
|
"Prof. Alice Derleth\n"
|
|
"Miskatonic University, Dept. of Occult Sciences\n"))))))
|
|
|
|
;; set `mu4e-context-policy` and `mu4e-compose-policy` to tweak when mu4e should
|
|
;; guess or ask the correct context, e.g.
|
|
|
|
;; start with the first (default) context;
|
|
;; default is to ask-if-none (ask when there's no context yet, and none match)
|
|
;; (setq mu4e-context-policy 'pick-first)
|
|
|
|
;; compose with the current context is no context matches;
|
|
;; default is to ask
|
|
;; (setq mu4e-compose-context-policy nil)
|
|
#+END_SRC
|
|
|
|
Note: We used to have a hack to support multiple accounts with older version of
|
|
=mu= but we removed it to encourage people to update their version and use the
|
|
new contexts feature.
|
|
|
|
** Async mode
|
|
=mu4e= can send mails in async mode, which speeds up sending as you do not have
|
|
to wait for the email to be sent. This is off by default but you can enable
|
|
it by setting the ~mu4e-enable-async-operations~ variable when including the
|
|
layer.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables
|
|
mu4e-enable-async-operations t)))
|
|
#+END_SRC
|
|
|
|
** Attachment directory
|
|
By default =mu4e= will save attachment files to =$HOME=, but this layer changes
|
|
that to =$HOME/Downloads= if it exists. You can override this in your
|
|
=dotspacemacs/user-config=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq mu4e-attachment-dir "~/files")
|
|
#+END_SRC
|
|
|
|
** Example configuration
|
|
#+BEGIN_SRC emacs-lisp
|
|
;;; Set up some common mu4e variables
|
|
(setq mu4e-maildir "~/.mail"
|
|
mu4e-trash-folder "/Trash"
|
|
mu4e-refile-folder "/Archive"
|
|
mu4e-get-mail-command "mbsync -a"
|
|
mu4e-update-interval nil
|
|
mu4e-compose-signature-auto-include nil
|
|
mu4e-view-show-images t
|
|
mu4e-view-show-addresses t)
|
|
|
|
;;; Mail directory shortcuts
|
|
(setq mu4e-maildir-shortcuts
|
|
'(("/gmail/INBOX" . ?g)
|
|
("/college/INBOX" . ?c)))
|
|
|
|
;;; Bookmarks
|
|
(setq mu4e-bookmarks
|
|
`(("flag:unread AND NOT flag:trashed" "Unread messages" ?u)
|
|
("date:today..now" "Today's messages" ?t)
|
|
("date:7d..now" "Last 7 days" ?w)
|
|
("mime:image/*" "Messages with images" ?p)
|
|
(,(mapconcat 'identity
|
|
(mapcar
|
|
(lambda (maildir)
|
|
(concat "maildir:" (car maildir)))
|
|
mu4e-maildir-shortcuts) " OR ")
|
|
"All inboxes" ?i)))
|
|
#+END_SRC
|
|
|
|
** Notifications
|
|
=mu4e-alert= is an extension that provides desktop notifications and adds the
|
|
count of unread messages to the modeline.
|
|
|
|
[[https://raw.githubusercontent.com/iqbalansari/mu4e-alert/master/screenshots/mu4e-alert-in-action.png]]
|
|
|
|
For an extended documentation of the available customizations please refer to
|
|
[[https://github.com/iqbalansari/mu4e-alert#user-content-customizations][mu4e-alert's documentation]]
|
|
|
|
*** OS notifications
|
|
To enable notifications about new messages, add the following line to your
|
|
=dotspacemacs/user-config=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq mu4e-enable-notifications t)
|
|
#+END_SRC
|
|
|
|
or use layer variables when you add the layer to
|
|
=dotspacemacs-configuration-layers=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(mu4e :variables mu4e-enable-notifications t)
|
|
#+END_SRC
|
|
|
|
By default, notifications will be shown in the =*Messages*= buffer. To enable
|
|
desktop notifications about new messages, add the following lines to
|
|
your =dotspacemacs/user-config=, according to your operating system and the
|
|
installed libraries:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(with-eval-after-load 'mu4e-alert
|
|
;; Enable Desktop notifications
|
|
(mu4e-alert-set-default-style 'notifications)) ; For Linux.
|
|
;; (mu4e-alert-set-default-style 'libnotify)) ; Alternative for Linux
|
|
;; (mu4e-alert-set-default-style 'notifier)) ; For macOS (through the
|
|
; terminal notifier app).
|
|
;; (mu4e-alert-set-default-style 'growl)) ; Alternative for macOS.
|
|
#+END_SRC
|
|
|
|
*** Mode-line notifications
|
|
To enable mode-line display about new messages, add the following line to
|
|
your =dotspacemacs/user-config=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq mu4e-enable-mode-line t)
|
|
#+END_SRC
|
|
|
|
or use layer variables when you add the layer to
|
|
=dotspacemacs-configuration-layers=:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(mu4e :variables mu4e-enable-mode-line t)
|
|
#+END_SRC
|
|
|
|
** Spacemacs layout integration
|
|
A [[https://github.com/syl20bnr/spacemacs/blob/develop/doc/DOCUMENTATION.org#layouts-and-workspaces][Spacemacs custom layout]] is defined by the layer. The name and the key binding
|
|
for it can be customized with the following layer variables:
|
|
- =mu4e-spacemacs-layout-name= for the layout name,
|
|
- =mu4e-spacemacs-layout-binding= for the key binding.
|
|
- =mu4e-spacemacs-kill-layout-on-exit= for automatically removing layout when
|
|
quitting =mu4e=.
|
|
|
|
By default the values are:
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables mu4e-spacemacs-layout-name "@Mu4e"
|
|
mu4e-spacemacs-layout-binding "m"
|
|
mu4e-spacemacs-kill-layout-on-exit t)))
|
|
#+END_SRC
|
|
|
|
** Org-mu4e integration
|
|
*** Mu4e link support in Org mode
|
|
Feature ~mu4e-org~ supports links to mu4e messages in Org mode in the form of
|
|
~[[mu4e:msgid::***][link text]]~. Enabled by default. You can disable it by
|
|
setting the ~mu4e-org-link-support~ variable when including the layer.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables
|
|
mu4e-org-link-support nil)))
|
|
#+END_SRC
|
|
|
|
*** Composing Org mode messages in mu4e
|
|
Feature ~org-mu4e~ supports composing emails in Org mode format. Disabled by
|
|
default. You can enable it by setting the ~mu4e-org-compose-support~ variable
|
|
when including the layer.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
(setq-default dotspacemacs-configuration-layers
|
|
'((mu4e :variables
|
|
mu4e-org-compose-support t)))
|
|
#+END_SRC
|
|
|
|
Then when composing, hit keys ~SPC m o~ to enable the
|
|
~org-mu4e-compose-org-mode~ mode. Note that you need to set the variable
|
|
~org-mu4e-convert-to-html~ if you want the message to be converted before
|
|
sending.
|
|
|
|
* See also
|
|
Refer to the official =mu= and =mu4e= documentation for additional info.
|
|
- [[http://www.djcbsoftware.nl/code/mu/mu4e/index.html][mu4e Manual]]
|