+[[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
# Tips and Tricks for using notmuch with Emacs
One of the more popular notmuch message reading clients is
interface (using the `[save]` button next to a previous search) or by
customising the variable `notmuch-saved-searches`.
-An example setting might be:
+An example setting for notmuch versions up to 0.17.x might be:
(setq notmuch-saved-searches '(("inbox" . "tag:inbox")
("unread" . "tag:inbox AND tag:unread")
("notmuch" . "tag:inbox AND to:notmuchmail.org")))
+Starting from notmuch 0.18 the variable changed. It is backwards
+compatible so the above will still work but the new style will be used
+if you use customize and there are some new features available. The above would become
+
+ (setq notmuch-saved-searches '((:name "inbox" :query "tag:inbox")
+ (:name "unread" :query "tag:inbox AND tag:unread")
+ (:name "notmuch" :query "tag:inbox AND to:notmuchmail.org")))
+
+The additional features are the possibility to set the search order
+for the search, and the possibility to specify a different query for
+displaying the count for the saved-search. For example
+
+ (setq notmuch-saved-searches '((:name "inbox"
+ :query "tag:inbox"
+ :count-query "tag:inbox and tag:unread"
+ :sort-order 'oldest-first)))
+
+specifies a single saved search for inbox, but the number displayed by
+the search will be the number of unread messages in the inbox, and the
+sort order for this search will be oldest-first.
+
Of course, you can have any number of saved searches, each configured
-with any supported search terms (see "notmuch help search-terms").
+with any supported search terms (see "notmuch help search-terms"), and
+in the new style variable they can each have different count-queries
+and sort orders.
Some users find it useful to add `and not tag:delete` to those
searches, as they use the `delete` tag to mark messages as
You can also use the notmuch database as a mail address book itself.
To do this you need a command line tool that outputs likely address
-candidates based on a search string. There are currently three
+candidates based on a search string. There are currently four
available:
* The python tool `notmuch_address.py` (`git clone
cc -o addrlookup addrlookup.c `pkg-config --cflags --libs gobject-2.0` -lnotmuch
- * Shell/fgrep/perl combination [nottoomuch-addresses.sh](http://www.iki.fi/too/nottoomuch/nottoomuch-addresses/).
+ * Shell/fgrep/perl combination [nottoomuch-addresses.sh](https://github.com/domo141/nottoomuch/blob/master/nottoomuch-addresses.rst).
This tools maintains it's own address "database" gathered from email
files notmuch knows and search from that "database" is done by `fgrep(1)`.
+ * python/sqlite combination [notmuch-abook](https://github.com/guyzmo/notmuch-abook/)
+ This tools also maintains an address database in sqlite after harvesting
+ from notmuch. It also includes a vim plugin.
+
You can perform tab-completion using any of these programs.
Just add the following to your .emacs:
You can add the sender of a message to Google Contacts by piping the message
(`notmuch-show-pipe-message`) to `goobook add`.
+### Akonadi
+
+ git clone https://github.com/mmehnert/akonadimailsearch
+
+Install the development packages for kdepim on your system.
+Enter the cloned repository and create a build directory:
+
+ mkdir build
+ cd build
+ cmake ..; make;
+
+You will find the akonadimailsearch binary in the build/src directory.
+Create a ~/bin/akonadimailsearch.sh file with the following content and make it executable:
+(Adjust the path for the akonadimailsearch binary.)
+
+ #!/bin/sh
+ akonadimailsearch "$@" 2>/dev/null
+
+As described above, you can now add the following settings to your ~/.emacs file:
+
+ (require 'notmuch-address)
+ (setq notmuch-address-command "~/bin/akonadimailsearch.sh")
+ (notmuch-address-message-insinuate)
+
+
+
## How to sign/encrypt messages with gpg
Messages can by signed using gpg by invoking
;; Use "home" identity by default
(setq gnus-alias-default-identity "home")
;; Define rules to match work identity
- (setq gnus-alias-identity-rules
+ (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)
Support for linking to notmuch messages is distributed with org-mode,
but as a contrib file, so you might have to work a bit to load it.
-In Debian and derivitives,
+In Debian and derivatives,
(add-to-list 'load-path "/usr/share/org-mode/lisp")
-
+
Then
(require 'org-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)
+
+## 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)