X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=emacstips.mdwn;h=5a71aef7617c3908989c11f04b63a1bfde135ee3;hb=b1c61b1e31075fac94dbf6b6ce4ec01737ef8bc9;hp=6275f18fb0f680a4b270b080ea6f1d340543a0e3;hpb=84e85c9029de268dd9df15e4b054dc2047ad107d;p=notmuch-wiki diff --git a/emacstips.mdwn b/emacstips.mdwn index 6275f18..5a71aef 100644 --- a/emacstips.mdwn +++ b/emacstips.mdwn @@ -1,3 +1,5 @@ + + [[!img notmuch-logo.png alt="Notmuch logo" class="left"]] #Tips and Tricks for using notmuch with Emacs @@ -12,11 +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) + (autoload 'notmuch "notmuch" "notmuch mail" t) Then, either run "emacs -f notmuch", or execute the command `M-x notmuch` from within a running emacs. @@ -82,14 +84,14 @@ 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)" ----- @@ -103,31 +105,31 @@ 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; + ;; 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") - ; 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) - ;; load notmuch - (require 'notmuch) + ;; add here stuff required to be configured *after* + ;; notmuch is loaded; - ;; 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)) + ;(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) + ; 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, add to `.emacs`: +Then, adto `.emacs`: - (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t) + (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t) ## Add a key binding to add/remove/toggle a tag @@ -137,49 +139,103 @@ 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")))) + +## 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. + + (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 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) + (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) + (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... @@ -194,7 +250,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\(notmuch-fcc-dirs\)\|\(message-directory\) + M-x customize-apropos\(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` @@ -212,9 +268,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"). @@ -248,21 +304,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 '' -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 '' -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 @@ -311,12 +367,16 @@ emacswiki. ## Address completion when composing -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 @@ -333,7 +393,7 @@ 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 * 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 @@ -341,10 +401,23 @@ available: 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) + (require 'notmuch-address) + (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 @@ -355,8 +428,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 @@ -369,7 +442,7 @@ part. ### Troubleshooting message-mode gpg support -- If you have trouble with expired subkeys, you may have encounted +- 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