]> git.cworth.org Git - notmuch-wiki/blobdiff - emacstips.mdwn
joo
[notmuch-wiki] / emacstips.mdwn
index 070edba3b653a318e2a515d5fcdf44bd1cf92c3e..18f1c66540de47ee08f9a5848553fb921a29d784 100644 (file)
@@ -1,14 +1,13 @@
-<!-- -*- mode: text; indent-tabs-mode: nil -*- -->
+# Tips and Tricks for using notmuch with Emacs
 
-[[!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
+**notmuch.el**, an [emacs](http://www.gnu.org/software/emacs/) major
+mode for interacting with notmuch.  It is included in the notmuch
+package.  This page goes over some usage tips for using notmuch with
+Emacs.
 
 [[!toc levels=2]]
 
-The main Notmuch message reading client is **notmuch.el**, which is an
-[emacs](http://www.gnu.org/software/emacs/) major mode, and is
-included in the notmuch package.
-
 ## Setup
 
 To use the Notmuch emacs mode, first add the following line to your
@@ -105,29 +104,26 @@ 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
-        ;;
+        ;;; my-notmuch.el -- my notmuch mail configuration
+        ;;;
         
-        ;; add here stuff required to be configured *before*
-        ;; notmuch is loaded;
+        ;;; 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")
+        ;; 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 
+        ;;; load notmuch 
         (require 'notmuch)
 
-        ;; add here stuff required to be configured *after*
-        ;; notmuch is loaded;
-
-        ;(setq user-mail-address (notmuch-user-primary-email)
-        ;      user-full-name (notmuch-user-name))
+        ;;; 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 & 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)
 
-Then, adto `.emacs`:
+Then, adto `.emacs`:
 
         (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t)
 
@@ -148,10 +144,10 @@ In notmuch versions up to 0.11.x
             (notmuch-show-add-tag "spam")
             (notmuch-show-remove-tag "inbox")))
 
-Starting from notmuch 0.12 (not released yet) 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:
+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 ()
@@ -162,12 +158,27 @@ the above needs to be changed to this:
 You can do the same for threads in `notmuch-search-mode` by just
 replacing "show" with "search" in the called functions.
 
-(Starting from notmuch 0.12 use `notmuch-search-tag-thread` instead)
+Starting from notmuch 0.12 use `notmuch-search-tag-thread` instead:
+
+        (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:
+
+        (define-key notmuch-search-mode-map "S"
+          (lambda ()
+            "mark messages in thread as spam"
+            (interactive)
+            (notmuch-search-tag '("+spam" "-inbox"))))
 
 The definition above makes use of a lambda function, but you could
 also define a separate function first:
 
-        (defun notmuch-show-tag-spam()
+        (defun notmuch-show-tag-spam ()
           "mark message as spam"
           (interactive)
           (notmuch-show-add-tag "spam")
@@ -187,7 +198,7 @@ key:
                 (notmuch-show-remove-tag "deleted")
               (notmuch-show-add-tag "deleted"))))
 
-And version for notmuch 0.12 (not released yet)
+And version for notmuch 0.12
 
         (define-key notmuch-show-mode-map "d"
           (lambda ()
@@ -197,6 +208,34 @@ And version for notmuch 0.12 (not released yet)
               (if (member "deleted" (notmuch-show-get-tags))
                   "-deleted" "+deleted"))))
 
+## Adding many tagging keybindings
+
+If you want to have have many tagging keybindings, you can save the typing
+the few lines of  boilerplate for every binding (for versions before 0.12,
+you will need to change notmuch-show-apply-tag-macro).
+
+    (eval-after-load 'notmuch-show
+      '(define-key notmuch-show-mode-map "`" 'notmuch-show-apply-tag-macro))
+
+    (setq notmuch-show-tag-macro-alist
+      (list
+       '("m" "+notmuch::patch" "+notmuch::moreinfo" "-notmuch::needs-review")
+       '("n" "+notmuch::patch" "+notmuch::needs-review" "-notmuch::pushed")
+       '("o" "+notmuch::patch" "+notmuch::obsolete"
+             "-notmuch::needs-review" "-notmuch::moreinfo")
+       '("p" "-notmuch::pushed" "-notmuch::needs-review"
+         "-notmuch::moreinfo" "+pending")
+       '("P" "-pending" "-notmuch::needs-review" "-notmuch::moreinfo" "+notmuch::pushed")
+       '("r" "-notmuch::patch" "+notmuch::review")
+       '("s" "+notmuch::patch" "-notmuch::obsolete" "-notmuch::needs-review" "-notmuch::moreinfo" "+notmuch::stale")
+       '("t" "+notmuch::patch" "-notmuch::needs-review" "+notmuch::trivial")
+       '("w" "+notmuch::patch" "+notmuch::wip" "-notmuch::needs-review")))
+
+    (defun notmuch-show-apply-tag-macro (key)
+      (interactive "k")
+      (let ((macro (assoc key notmuch-show-tag-macro-alist)))
+        (apply 'notmuch-show-tag-message (cdr macro))))
+
 ## Restore reply-to-all key binding to 'r'
 
 Starting from notmuch 0.12 the 'r' key is bound to reply-to-sender instead of
@@ -340,12 +379,16 @@ emacswiki.
 
 ## <span id="address_completion">Address completion when composing</span>
 
-There are currently two solutions to this:
+There are currently three solutions to this:
+
+### bbdb
 
 [bbdb](http://bbdb.sourceforge.net) is a contact database for emacs
 that works quite nicely together with message mode, including
 address autocompletion.
 
+### notmuch database as an address book
+
 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
@@ -374,6 +417,19 @@ You can perform tab-completion using any of these programs. Just add the followi
         (setq notmuch-address-command "/path/to/address_fetching_program")
         (notmuch-address-message-insinuate)
 
+### Google Contacts
+
+[GooBook](http://code.google.com/p/goobook/) is a command-line tool for
+accessing Google Contacts. Install and set it up according to its documentation.
+
+To use GooBook with notmuch, use this wrapper script and set it up like the
+programs above.
+
+        #!/bin/sh
+        goobook query "$*" | sed 's/\(.*\)\t\(.*\)\t.*/\2 \<\1\>/' | sed '/^$/d'
+
+You can add the sender of a message to Google Contacts by piping the message
+(`notmuch-show-pipe-message`) to `goobook add`.
 
 ## How to sign/encrypt messages with gpg