[[!toc levels=2]]
-## Issues with Emacs 24
-
-If notmuch-show-mode behaves badly for you in emacs 24.x try adding one of
-
- (setq gnus-inhibit-images nil)
-
-or
-
- (require 'gnus-art)
-
-to your .emacs file.
-
## Controlling external handlers for attachments
You can choose e.g. which pdf viewer to invoke from notmuch-show mode by
application/pdf; /usr/bin/mupdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf
application/x-pdf; /usr/bin/mupdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf
+### Convert ".pdf" and ".docx" to text and pop to buffer
+
+Add the following (hacky but effective!) code to `.emacs.d/notmuch-config.el`;
+the overwritten `defcustom` will change action when pressing RET on top of an
+attachment; ".pdf" and ".docx" attachments are converted to text (using
+"pdf2text" and "docx2txt.pl" commands to do the conversion), saving to file
+(the default action of `notmuch-show-part-button-default-action`) is offered
+to attachments of other types.
+
+ (defun user/mm-pipe-- (handle cmd)
+ ;; conveniently, '-' '-' a args to pdftotext and docx2txt.pl work fine
+ ;; fixme: naming inconsistency (fn name and buffer name)
+ (let ((buffer (get-buffer-create "*attachment-to-text*")))
+ (with-current-buffer buffer
+ (setq buffer-read-only nil)
+ (erase-buffer))
+ (with-temp-buffer
+ ;; "based on mm-pipe-part in mm-decode.el"
+ (mm-with-unibyte-buffer
+ (mm-insert-part handle)
+ (mm-add-meta-html-tag handle)
+ (let ((coding-system-for-write 'binary))
+ (call-process-region (point-min) (point-max)
+ cmd nil buffer nil "-" "-"))))
+ (pop-to-buffer buffer)
+ (goto-char (point-min))
+ (text-mode)
+ (visual-line-mode)
+ (view-mode)))
+
+ (defun user/notmuch-show-pop-attachment-to-buffer ()
+ ;; "based on notmuch-show-apply-to-current-part-handle"
+ (interactive)
+ (let ((handle (notmuch-show-current-part-handle)))
+ ;;(message "%s" handle)
+ (unwind-protect
+ (pcase (car (nth 1 handle))
+ ("application/pdf"
+ (user/mm-pipe-- handle "pdftotext"))
+ ("application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ (user/mm-pipe-- handle "docx2txt.pl"))
+ (_ (notmuch-show-save-part)))
+ (kill-buffer (mm-handle-buffer handle)))))
+
+ (setq notmuch-show-part-button-default-action
+ #'user/notmuch-show-pop-attachment-to-buffer)
+
## Overwriting the sender address
If you want to always use the same sender address, then the following
This command will try to view the message part the point is on with an
external viewer. The mime-type of the part will determine what viewer
will be used. Typically a 'text/html' part will be send to your
-browser.
+browser.
The configuration for this is kept in so called `mailcap`
files. (typically the file is `~/.mailcap` or `/etc/mailcap`) If the
Messages can be signed using gpg by invoking
`M-x mml-secure-sign-pgpmime` (or `M-x mml-secure-encrypt-pgpmime`).
These functions are available via the standard `message-mode` keybindings
-`C-c C-m s p` and `C-c C-m c p`. To sign outgoing mail by default, use the
-`message-setup-hook` in your `.emacs` file:
+`C-c C-m s p` and `C-c C-m c p`.
+
+In Emacs 28 you will be asked whether to sign the message using the
+sender and are offered to remember your choice. In Emacs 27 you will
+get a slightly misleading error and have to manually add the following
+line to you init file. Older Emacsen just do this unconditionally.
+
+ (setq mml-secure-openpgp-sign-with-sender t)
+
+To sign outgoing mail by default, use the `message-setup-hook` in your
+init file:
;; Sign messages by default.
(add-hook 'message-setup-hook 'mml-secure-sign-pgpmime)
;; Use "home" identity by default
(setq gnus-alias-default-identity "home")
;; Define rules to match work identity
- (setq gnus-alias-identity-rules)
- '(("work" ("any" "john.doe@\\(example\\.com\\|help\\.example.com\\)" both) "work"))
+ (setq gnus-alias-identity-rules
+ '(("work" ("any" "john.doe@\\(example\\.com\\|help\\.example.com\\)" both) "work")))
;; Determine identity when message-mode loads
(add-hook 'message-setup-hook 'gnus-alias-determine-identity)
## Multiple identities (and more) with message-templ
Another option for multiple identities is
-[message-templ](http://pivot.cs.unb.ca/git?p=message-templ.git;a=summary)
+[message-templ](http://git.tethera.net/message-templ.git)
(also a available in marmalade). This provides roughly the same
facilities as wanderlust's template facility.
See
-[example.emacs.el](http://pivot.cs.unb.ca/git?p=message-templ.git;a=blob;f=example.emacs.el;hb=HEAD)
+[example.emacs.el](https://git.tethera.net/message-templ.git/tree/example.emacs.el)
for some simple examples of usage.
## Resending (or bouncing) messages
(add-hook 'notmuch-show-markup-headers-hook 'notmuch-show-subject-tabs-to-spaces)
-And in header lines (this will only work with the yet to be released
-notmuch version 0.15):
+And in header lines:
(defun notmuch-show-header-tabs-to-spaces ()
"Replace tabs with spaces in header line."
(loop for p in load-path
do (if (file-accessible-directory-p p)
- (let ((m (directory-files-recursively p "^org-notmuch.el$")))
+ (let ((m (directory-files-recursively p "^ol-notmuch.el$")))
(if m (add-to-list 'load-path (file-name-directory (car m)))))))
Then
- (require 'org-notmuch)
+ (require 'ol-notmuch)
In general it is nice to have a key for org-links (not just for notmuch). For example
- (define-key global-map "\C-cl" 'org-store-link)
+ (define-key global-map "\C-c l" 'org-store-link)
+
+If you're using `use-package` the package can be loaded using the following:
+
+```emacs-lisp
+(use-package ol-notmuch
+ :ensure t
+ :bind
+ ("C-c l" . org-store-link))
+```
+
+Note the package was renamed from `org-notmuch` to `ol-notmuch` in recent
+versions of org-mode. If you're using an old version of notmuch you might want
+to `(require 'org-notmuch)` instead.
## Viewing diffs in notmuch
add the hook to your `~/.emacs.d/notmuch-config.el` file to test
it. Details available (and feedback welcome) in the [relevant
discussion](https://notmuchmail.org/pipermail/notmuch/2018/026414.html).
+
+## Applying patches to git repositories
+
+The `notmuch-extract-thread-patches` and
+`notmuch-extract-message-patches` commands from the `elpa-mailscripts`
+package in Debian (and its derivatives) can do this for you.
+
+## Allow content preference based on message context
+
+The preference for which sub-part of a multipart/alternative part is shown is
+globally set. For example, if you prefer showing the html version over the text
+based, you can set:
+
+ (setq notmuch-multipart/alternative-discouraged '("text/plain" "text/html"))
+
+However, sometimes you might want to adapt your preference depending on the
+context. You can override the default settings on a per-message basis by
+providing a function that has access to the message and which returns the
+discouraged type list. For example:
+
+ (defun my/determine-discouraged (msg)
+ (let* ((headers (plist-get msg :headers))
+ (from (or (plist-get headers :From) "")))
+ (cond
+ ((string-match "whatever@mail.address.com" from)
+ '("text/plain"))
+ (t
+ '("text/html" "multipart/related")))))
+
+ (setq notmuch-multipart/alternative-discouraged
+ 'my/determine-discouraged)
+
+This would discourage text/html and multipart/related generally, but discourage
+text/plain should the message be sent from whatever@mail.address.com.
+
+## See the recipient address instead of your address when listing sent messages
+
+If you like to see your sent messages in unthreaded view, by default you will
+see your address in the authors column, which is maybe not what you want. The
+following code allows for showing the recipients if your email address (an
+arbitrary address, whatever@mail.address.com in the example) is included in the
+From field.
+
+ (defun my/notmuch-unthreaded-show-recipient-if-sent (format-string result)
+ (let* ((headers (plist-get result :headers))
+ (to (plist-get headers :To))
+ (author (plist-get headers :From))
+ (face (if (plist-get result :match)
+ 'notmuch-tree-match-author-face
+ 'notmuch-tree-no-match-author-face)))
+ (propertize
+ (format format-string
+ (if (string-match "whatever@mail.address.com" author)
+ (concat "↦ " (notmuch-tree-clean-address to))
+ (notmuch-tree-clean-address to)
+ author))
+ 'face face)))
+
+ (setq notmuch-unthreaded-result-format
+ '(("date" . "%12s ")
+ (my/notmuch-unthreaded-show-recipient-if-sent . "%-20.20s")
+ ((("subject" . "%s"))
+ . " %-54s ")
+ ("tags" . "(%s)")))
+
+## Issues with Emacs 24 (unsupported since notmuch 0.31 (2020-09-05))
+
+If notmuch-show-mode behaves badly for you in emacs 24.x try adding one of
+
+ (setq gnus-inhibit-images nil)
+
+or
+
+ (require 'gnus-art)
+
+to your .emacs file.