To use the Notmuch emacs mode, first add the following line to your
`.emacs` rc file:
- (require 'notmuch)
+ (autoload 'notmuch "notmuch" "notmuch mail" t)
-or you can load the package via autoload:
+or if you always want to load notmuch when you start emacs:
- (autoload 'notmuch "notmuch" "notmuch mail" t)
+ (require 'notmuch)
Then, either run "emacs -f notmuch", or execute the command `M-x
notmuch` from within a running emacs.
+### Notmuch Emacs configuration file:
+
+(Since Notmuch 0.18)
+
+After notmuch is loaded `notmuch-init-file` (typically
+ `~/.emacs.d/notmuch-config.el`) is checked out. If such file exists
+it is loaded. Most emacs lisp based configuration not suitable via
+customization can be put there instead of `~/.emacs`. As this is so new
+feature rest of this emacstips file is not yet adjusted to refer this
+file instead of .emacs.
+
## Navigating & reading mails
When first starting notmuch in emacs, you will be presented with the
# Advanced tips and tweaks
-## Use separate emacs lisp file for notmuch configuration
-
-Instead of adding notmuch configuration code to `.emacs`, there
-is an option to collect those to a separate file (which is only
-loaded when `notmuch` is invoked). To do this, write, for example
-a file called `~/.emacs.d/my-notmuch.el`:
-
- ;;; my-notmuch.el -- my notmuch mail configuration
- ;;;
-
- ;;; add here stuff required to be configured *before*
- ;;; notmuch is loaded;
-
- ;; uncomment and modify in case some elisp files are not found in load-path
- ;; (add-to-list 'load-path "~/vc/ext/notmuch/emacs")
-
- ;;; load notmuch
- (require 'notmuch)
-
- ;;; add here stuff required to be configured *after*
- ;;; notmuch is loaded;
-
- ;; uncomment & modify if you want to use external smtp server to send mail
- ;; (setq smtpmail-smtp-server "smtp.server.tld"
- ;; message-send-mail-function 'message-smtpmail-send-it)
- ;; uncomment to debug smtp sending problems
- ;; (setq smtpmail-debug-info t)
-
-Then, add to `.emacs`:
-
- (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t)
-
## Initial cursor position in notmuch 0.15 hello window
In notmuch version 0.15 emacs client the handling of cursor position in
## Add a key binding to add/remove/toggle a tag
-The `notmuch-{search,show}-{add,remove}-tag` functions are very useful
-for making quick tag key bindings. For instance, here's an example
-of how to make a key binding to add the "spam" tag and remove the
-"inbox" tag in notmuch-show-mode:
+The `notmuch-{search,show,tree}-tag` functions are very useful for
+making quick tag key bindings. The arguments to these functions have
+changed as notmuch has evolved but the following should work on all
+versions of notmuch from 0.13 on. These functions take a list of
+tag changes as argument. For example, an argument of (list "+spam"
+"-inbox) adds the tag spam and deletes the tag inbox. Note the
+argument must be a list even if there is only a single tag change
+e.g., use (list "+deleted") to add the deleted tag.
-In notmuch versions up to 0.11.x
+For instance, here's an example of how to make a key binding to add
+the "spam" tag and remove the "inbox" tag in notmuch-show-mode:
(define-key notmuch-show-mode-map "S"
(lambda ()
"mark message as spam"
(interactive)
- (notmuch-show-add-tag "spam")
- (notmuch-show-remove-tag "inbox")))
-
-Starting from notmuch 0.12 the functions `notmuch-show-add-tag` and
-`notmuch-show-remove-tag` have changed to be more versatile and lost
-noninteractive use. When upgrading to 0.12 the above needs to be
-changed to this:
-
- (define-key notmuch-show-mode-map "S"
- (lambda ()
- "mark message as spam"
- (interactive)
- (notmuch-show-tag-message "+spam" "-inbox")))
+ (notmuch-show-tag (list "+spam" "-inbox"))))
You can do the same for threads in `notmuch-search-mode` by just
-replacing "show" with "search" in the called functions.
+replacing "show" with "search" in the keymap and called functions, or
+for messages in `notmuch-tree-mode` by replacing "show" by "tree". If
+you want to tag a whole thread in `notmuch-tree-mode` use
+`notmuch-tree-tag-thread` instead of `notmuch-tree-tag`.
-Starting from notmuch 0.12 use `notmuch-search-tag-thread` instead:
+You may also want the function in search mode apply to the all threads
+in the selected region (if there is one). For notmuch prior to 0.17
+this behaviour will occur automatically with the functions given
+above. To get this behaviour on 0.17+ do the following:
(define-key notmuch-search-mode-map "S"
- (lambda ()
- "mark messages in thread as spam"
- (interactive)
- (notmuch-show-tag-thread "+spam" "-inbox")))
-
-Starting from notmuch 0.13 use `notmuch-search-tag` -- it has a little
-different usage syntax:
+ (lambda (&optional beg end)
+ "mark thread as spam"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+spam" "-inbox") beg end)))
- (define-key notmuch-search-mode-map "S"
- (lambda ()
- "mark messages in thread as spam"
- (interactive)
- (notmuch-search-tag '("+spam" "-inbox"))))
+The analogous functionality in notmuch-tree is currently missing.
-The definition above makes use of a lambda function, but you could
+The definitions above make use of a lambda function, but you could
also define a separate function first:
(defun notmuch-show-tag-spam ()
"mark message as spam"
(interactive)
- (notmuch-show-add-tag "spam")
- (notmuch-show-remove-tag "inbox")))
- (define-key notmuch-show-mode-map "S" 'notmuch-show-tag-spam)
+ (notmuch-show-add-tag (list "+spam" "-inbox")))
-(See above for analogy how to apply this for notmuch 0.12 and later)
+ (define-key notmuch-show-mode-map "S" 'notmuch-show-tag-spam)
Here's a more complicated example of how to add a toggle "deleted"
key:
"toggle deleted tag for message"
(interactive)
(if (member "deleted" (notmuch-show-get-tags))
- (notmuch-show-remove-tag "deleted")
- (notmuch-show-add-tag "deleted"))))
-
-And version for notmuch 0.12
-
- (define-key notmuch-show-mode-map "d"
- (lambda ()
- "toggle deleted tag for message"
- (interactive)
- (notmuch-show-tag-message
- (if (member "deleted" (notmuch-show-get-tags))
- "-deleted" "+deleted"))))
+ (notmuch-show-tag (list "-deleted"))
+ (notmuch-show-tag (list "+deleted")))))
## Adding many tagging keybindings
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)
+
+## Viewing diffs in notmuch
+
+The following code allows you to view an inline patch in diff-mode
+directly from notmuch. This means that normal diff-mode commands like
+refine, next hunk etc all work.
+
+ (defun my-notmuch-show-view-as-patch ()
+ "View the the current message as a patch."
+ (interactive)
+ (let* ((id (notmuch-show-get-message-id))
+ (subject (concat "Subject: " (notmuch-show-get-subject) "\n"))
+ (diff-default-read-only t)
+ (buf (get-buffer-create (concat "*notmuch-patch-" id "*")))
+ (map (make-sparse-keymap)))
+ (define-key map "q" 'notmuch-kill-this-buffer)
+ (switch-to-buffer buf)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (insert subject)
+ (insert (notmuch-get-bodypart-internal id 1 nil)))
+ (set-buffer-modified-p nil)
+ (diff-mode)
+ (lexical-let ((new-ro-bind (cons 'buffer-read-only map)))
+ (add-to-list 'minor-mode-overriding-map-alist new-ro-bind))
+ (goto-char (point-min))))
+
+and then this function needs to bound into the keymap with something like
+
+ (define-key 'notmuch-show-mode-map "D" 'my-notmuch-show-view-as-patch)