]> git.cworth.org Git - notmuch-wiki/blobdiff - emacstips.mdwn
Add quotes in notmuch-attach script to handle correctly filenames with spaces
[notmuch-wiki] / emacstips.mdwn
index 5cf885d64225601c7e9c590545de3511536187cf..070edba3b653a318e2a515d5fcdf44bd1cf92c3e 100644 (file)
@@ -1,3 +1,5 @@
+<!-- -*- mode: text; indent-tabs-mode: nil -*- -->
+
 [[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
 #Tips and Tricks for using notmuch with Emacs
 
@@ -12,7 +14,11 @@ included in the notmuch package.
 To use the Notmuch emacs mode, first add the following line to your
 `.emacs` rc file:
 
-       (require 'notmuch)
+        (require 'notmuch)
+
+or you can load the package via autoload:
+
+        (autoload 'notmuch "notmuch" "notmuch mail" t)
 
 Then, either run "emacs -f notmuch", or execute the command `M-x
 notmuch` from within a running emacs.
@@ -78,20 +84,54 @@ script opens new emacs window with empty message and attaches files
 mentioned as script arguments. (Note: The script expects that you have
 `(server-start)` in your `.emacs` file.)
 
-    #!/bin/sh
-    attach_cmds=""
-    while [ "$1" ]; do
-        fullpath=$(readlink --canonicalize $1)
-        attach_cmds="$attach_cmds (mml-attach-file \"$fullpath\")"
-        shift
-    done
-    emacsclient -a '' -c -e "(progn (compose-mail) $attach_cmds)"
+        #!/bin/sh
+        attach_cmds=""
+        while [ "$1" ]; do
+            fullpath=$(readlink --canonicalize "$1")
+            attach_cmds="$attach_cmds (mml-attach-file \"$fullpath\")"
+            shift
+        done
+        emacsclient -a '' -c -e "(progn (compose-mail) $attach_cmds)"
 
 
 -----
 
 # 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;
+
+        ;(setq user-mail-address (notmuch-user-primary-email)
+        ;      user-full-name (notmuch-user-name))
+
+        ; 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`:
+
+        (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t)
+
+
 ## Add a key binding to add/remove/toggle a tag
 
 The `notmuch-{search,show}-{add,remove}-tag` functions are very useful
@@ -99,36 +139,77 @@ 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:
 
-               (define-key notmuch-show-mode-map "S"
-                 (lambda ()
-                   "mark message as spam"
-                   (interactive)
-                   (notmuch-show-add-tag "spam")
-                   (notmuch-show-remove-tag "inbox")))
+In notmuch versions up to 0.11.x
+
+        (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 (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:
+
+        (define-key notmuch-show-mode-map "S"
+          (lambda ()
+            "mark message as spam"
+            (interactive)
+            (notmuch-show-tag-message "+spam" "-inbox")))
 
 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)
+
 The definition above makes 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)
+        (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)
+
+(See above for analogy how to apply this for notmuch 0.12 and later)
 
 Here's a more complicated example of how to add a toggle "deleted"
 key:
 
-               (define-key notmuch-show-mode-map "d"
-                 (lambda ()
-                   "toggle deleted tag for message"
-                   (interactive)
-                   (if (member "deleted" (notmuch-show-get-tags))
-                       (notmuch-show-remove-tag "deleted")
-                     (notmuch-show-add-tag "deleted"))))
+        (define-key notmuch-show-mode-map "d"
+          (lambda ()
+            "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 (not released yet)
+
+        (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"))))
+
+## Restore reply-to-all key binding to 'r'
+
+Starting from notmuch 0.12 the 'r' key is bound to reply-to-sender instead of
+reply-to-all. Here's how to swap the reply to sender/all bindings in show mode:
+
+        (define-key notmuch-show-mode-map "r" 'notmuch-show-reply)
+        (define-key notmuch-show-mode-map "R" 'notmuch-show-reply-sender)
+
+And in search mode:
+
+        (define-key notmuch-search-mode-map "r" 'notmuch-search-reply-to-thread)
+        (define-key notmuch-search-mode-map "R" 'notmuch-search-reply-to-thread-sender)
+
 
 ## How to do FCC/BCC...
 
@@ -142,7 +223,7 @@ mail. Enter a directory (without the maildir `/cur` ending which
 will be appended automatically). To customize both variables at the
 same time, use the fancy command:
 
-               M-x customize-apropos<RET>\(notmuch-fcc-dirs\)\|\(message-directory\)
+        M-x customize-apropos<RET>\(notmuch-fcc-dirs\)\|\(message-directory\)
 
 This mechanism also allows you to select different folders to be
 used for the outgoing mail depending on your selected `From`
@@ -160,9 +241,9 @@ customising the variable `notmuch-saved-searches`.
 
 An example setting might be:
 
-               (setq notmuch-saved-searches '(("inbox" . "tag:inbox")
-                               ("unread" . "tag:inbox AND tag:unread")
-                               ("notmuch" . "tag:inbox AND to:notmuchmail.org")))
+        (setq notmuch-saved-searches '(("inbox" . "tag:inbox")
+                        ("unread" . "tag:inbox AND tag:unread")
+                        ("notmuch" . "tag:inbox AND to:notmuchmail.org")))
 
 Of course, you can have any number of saved searches, each configured
 with any supported search terms (see "notmuch help search-terms").
@@ -196,21 +277,21 @@ useful to display the message in an external viewer, such as a web
 browser. Here's a little script that Keith Packard wrote, which he
 calls `view-html`:
 
-               #!/bin/sh
-               dir=`mktemp -d`
-               trap "rm -r $dir" 0
-               cat "$@" > "$dir"/msg
-               if munpack -C "$dir" -t < "$dir"/msg 2>&1 | grep 'Did not find'; then
-                   sed -n '/[Hh][Tt][Mm][Ll]/,$p' "$dir"/msg > $dir/part1.html
-                   rm "$dir"/msg
-               fi
-               for i in "$dir"/part*; do
-                   if grep -q -i -e '<html>' -e 'text/html' "$i"; then
-                       iceweasel "$i" &
-                       sleep 3
-                       exit 0
-                   fi
-               done
+        #!/bin/sh
+        dir=`mktemp -d`
+        trap "rm -r $dir" 0
+        cat "$@" > "$dir"/msg
+        if munpack -C "$dir" -t < "$dir"/msg 2>&1 | grep 'Did not find'; then
+            sed -n '/[Hh][Tt][Mm][Ll]/,$p' "$dir"/msg > $dir/part1.html
+            rm "$dir"/msg
+        fi
+        for i in "$dir"/part*; do
+            if grep -q -i -e '<html>' -e 'text/html' "$i"; then
+                iceweasel "$i" &
+                sleep 3
+                exit 0
+            fi
+        done
 
 Save that script somewhere in your `${PATH}`, make it executable,
 and change the invocation of `iceweasel` to any other HTML viewer if
@@ -253,8 +334,8 @@ the rest will go to the default account.
 If you have a hard time getting the above to work for you, as I did,
 it's also possible to add a message-send-mail-hook in your .emacs to
 send the from header explicitly as an argument to msmtp as described
-[here on the
-emacswiki](http://www.emacswiki.org/cgi-bin/wiki/GnusMSMTP#toc2)
+[here](http://www.emacswiki.org/cgi-bin/wiki/GnusMSMTP#toc2) on the
+emacswiki.
 
 
 ## <span id="address_completion">Address completion when composing</span>
@@ -267,7 +348,7 @@ address autocompletion.
 
 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 two
+candidates based on a search string.  There are currently three
 available:
 
   * The python tool `notmuch_address.py` (`git clone
@@ -281,13 +362,17 @@ available:
     `http://github.com/spaetz/vala-notmuch/raw/static-sources/src/addrlookup.c`
     and build it with:
 
-                    cc -o addrlookup addrlookup.c `pkg-config --cflags --libs gobject-2.0` -lnotmuch
+            cc -o addrlookup addrlookup.c `pkg-config --cflags --libs gobject-2.0` -lnotmuch
 
-You can perform tab-completion using either of these programs. Just add the following to your .emacs:
+  * Shell/fgrep/perl combination [nottoomuch-addresses.sh](http://www.iki.fi/too/nottoomuch/nottoomuch-addresses/). 
+    This tools maintains it's own address "database" gathered from email
+    files notmuch knows and search from that "database" is done by fgrep(1).
 
-    (require 'notmuch-address)
-    (setq notmuch-address-command "/path/to/address_fetching_program")
-    (notmuch-address-message-insinuate)
+You can perform tab-completion using any of these programs. Just add the following to your .emacs:
+
+        (require 'notmuch-address)
+        (setq notmuch-address-command "/path/to/address_fetching_program")
+        (notmuch-address-message-insinuate)
 
 
 ## How to sign/encrypt messages with gpg
@@ -299,8 +384,8 @@ 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:
 
-                    ;; Sign messages by default.
-                    (add-hook 'message-setup-hook 'mml-secure-sign-pgpmime)
+        ;; Sign messages by default.
+        (add-hook 'message-setup-hook 'mml-secure-sign-pgpmime)
 
 This inserts the required `<#part sign=pgpmime>` into the beginning
 of the mail text body and will be converted into a pgp signature
@@ -310,3 +395,11 @@ is not required).
 Alternatively, you may prefer to use `mml-secure-message-sign-pgpmime` instead
 of `mml-secure-sign-pgpmime` to sign the whole message instead of just one
 part.
+
+### Troubleshooting message-mode gpg support
+
+- If you have trouble with expired subkeys, you may have encountered
+  emacs bug #7931.  This is fixed in git commit 301ea744c on
+  2011-02-02.  Note that if you have the Debian package easypg
+  installed, it will shadow the fixed version of easypg included with
+  emacs.