X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=emacstips.mdwn;h=c0f7617c47ac6acf500fb93951902322b7723d98;hb=4d8eabd655775484081a3f270f53f6b94b34404b;hp=ac59e1008ba1ebaaba19a7a45739c47e500826ee;hpb=2a2e5ac828f3b6b0a41fd37ae9265b95b753866c;p=notmuch-wiki
diff --git a/emacstips.mdwn b/emacstips.mdwn
index ac59e10..3f217fe 100644
--- a/emacstips.mdwn
+++ b/emacstips.mdwn
@@ -1,63 +1,787 @@
[[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
-#Tips and Tricks for using notmuch with Emacs
-
-* How to do FCC/BCC...
-
- Any notmuch reply will automatically include your primary email
- address in a BCC so that any messages you send will (eventually) end
- up in your mail store as well.
-
- But this doesn't do anything for messages that you compose that are
- not replies. So we need to get sane message-mode FCC figured
- out. Some investigation is still needed here.
-
-* How to customize notmuch-folders
-
- There's a "notmuch-folder" command available in the emacs client
- that displays a list of "folders" and the number of messages in
- each. Each folder is simply a named search specification. To
- configure this mode, edit your ${HOME}/.emacs file and include text
- something like the following:
-
- (setq notmuch-folders '(("inbox" . "tag:inbox")
- ("unread" . "tag:inbox AND tag:unread")
- ("notmuch" . "tag:inbox AND to:notmuchmail.org")))
-
- Of course, you can have any number of folders, each configured
- with any supported search terms (see "notmuch help search-terms").
-
-* Viewing HTML messages with an external viewer
-
- The emacs client can often display an HTML message inline, but it
- sometimes fails for one reason or another, (or is perhaps inadequate
- if you really need to see the graphical presentation of the HTML
- message).
-
- In this case, it can be 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=3D`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
- necessary. Then within the emacs client, press "|" to pipe the
- current message, then type "view-html".
-
- Keith mentions the following caveat, "Note that if iceweasel isn't
- already running, it seems to shut down when the script exits. I
- don't know why."
+# 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 (notmuch-emacs in Debian). This page goes over some usage
+tips for using notmuch with Emacs.
+
+[[!toc levels=2]]
+
+## Setup
+
+Have a look at the [Howto](http://notmuchmail.org/howto/) for
+prerequisites. Be sure you have done the general setup using the
+notmuch cli command!
+
+To use the Notmuch emacs mode, first add the following line to your
+`.emacs` rc file:
+
+ (autoload 'notmuch "notmuch" "notmuch mail" t)
+
+or if you always want to load notmuch when you start emacs:
+
+ (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`.
+
+## Navigating & reading mails
+
+When first starting notmuch in emacs, you will be presented with the
+notmuch "hello" page. If it exits with an error after writing
+"Welcome to notmutch. You have" you need to do the basic notmuch setup
+first (see above).
+From here you can do searches, see lists of recent
+searches, saved searches, message tags, help information, etc.
+
+Executing a search will open a new buffer in `notmuch-search-mode`
+displaying the search results. Each line in the search results
+represents a message thread. Hitting the '?' key will show help for
+this mode.
+
+In general, the 'q' will kill the current notmuch buffer and return
+you to the previous buffer (sort of like a 'pop').
+
+In search mode, navigating to a thread and hitting return will then
+open a new buffer in `notmuch-show-mode`, which will show the actual
+message contents of the thread.
+
+## Sending mail
+
+In any notmuch mode, you can start a new message by hitting the 'm'
+key. To reply to a message or thread, just hit the 'r' key.
+
+When composing new messages, you will be entered in emacs's
+`message-mode`, which is a powerful mode for composing and sending
+messages. When in message mode, you can type `C-c ?` for help.
+
+If you would like to use address autocompletion when composing
+messages, see [address completion](#address_completion).
+
+When you are ready to send a message, type `C-c C-c`. By default
+message mode will use your sendmail command to send mail, so make sure
+that works. One annoying standard configuration of message mode is
+that it will hide the sent mail in your emacs frame stack, but it will
+not close it. If you type several mails in an emacs session they will
+accumulate and make switching between buffers more annoying. You can
+avoid that behavior by adding `(setq message-kill-buffer-on-exit t)`
+in your `.emacs` file
+(or doing `M-x customize-variablemessage-kill-buffer-on-exit`)
+which will really close the mail window after sending it.
+
+## Attaching files
+
+Using the `M-x mml-attach-file` command, you can attach any file to be
+sent with your mail. By default this command is bound to the menu item
+*Attachments--Attach File* with the key binding `C-c C-a`. The
+variable `mml-dnd-attach-options` (`M-x
+customize-variablemml-dnd-attach-options`) can be set to
+allow the prompting for various attachment options (such as
+inline/attachment) if you want to do that.
+
+For those who prefer a more graphical interface, you can also simply
+drag and drop files from a file manager into a mail composition window
+to have them attached. In Ubuntu this works without any modifications
+if files are dragged from the file manager.
+
+And for those who prefer working from command line, the following
+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 [ $# -gt 0 ]; do
+ fullpath=$(readlink --canonicalize "$1")
+ attach_cmds="$attach_cmds (mml-attach-file \"$fullpath\")"
+ shift
+ done
+ emacsclient -a '' -c -e "(progn (compose-mail) $attach_cmds)"
+
+## Controlling external handlers for attachements
+
+You can choose e.g. which pdf viewer to invoke from notmuch-show mode by
+adding a .mailcap file in your home directory. Here is an example:
+
+ application/pdf; /usr/bin/mupdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf
+ application/x-pdf; /usr/bin/mupdf %s; test=test "$DISPLAY" != ""; description=Portable Document Format; nametemplate=%s.pdf
+
+## Issues with Emacs 24
+
+If notmuch-show-mode behaves badly for you in emacs 24.x try adding one of
+
+ (setq gnus-inhibit-images nil)
+
+or
+
+ (require 'gnus-art)
+
+to your .emacs file.
+
+-----
+
+# Advanced tips and tweaks
+
+## Initial cursor position in notmuch 0.15 hello window
+
+In notmuch version 0.15 emacs client the handling of cursor position in
+notmuch hello window has been simplified to a version which suits best
+most cases.
+
+Initially the cursor is positioned at the beginning of buffer.
+
+Some users liked the "ancient" version where cursor was moved to the
+first `Saved searches` button.
+
+Add the following code to your notmuch emacs configuration file in
+case you want this behaviour:
+
+ (add-hook 'notmuch-hello-refresh-hook
+ (lambda ()
+ (if (and (eq (point) (point-min))
+ (search-forward "Saved searches:" nil t))
+ (progn
+ (forward-line)
+ (widget-forward 1))
+ (if (eq (widget-type (widget-at)) 'editable-field)
+ (beginning-of-line)))))
+
+## Add a key binding to add/remove/toggle a tag
+
+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.
+
+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-tag (list "+spam" "-inbox"))))
+
+You can do the same for threads in `notmuch-search-mode` by just
+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`.
+
+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 (&optional beg end)
+ "mark thread as spam"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+spam" "-inbox") beg end)))
+
+The analogous functionality in notmuch-tree is currently missing.
+
+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 (list "+spam" "-inbox")))
+
+ (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:
+
+ (define-key notmuch-show-mode-map "d"
+ (lambda ()
+ "toggle deleted tag for message"
+ (interactive)
+ (if (member "deleted" (notmuch-show-get-tags))
+ (notmuch-show-tag (list "-deleted"))
+ (notmuch-show-tag (list "+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
+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...
+
+The Emacs interface to notmuch will automatically add an `Fcc`
+header to your outgoing mail so that any messages you send will also
+be saved in your mail store. You can control where this copy of the
+message is saved by setting the variable `notmuch-fcc-dirs` which defines the
+subdirectory relative to the `database.path` setting from your
+notmuch configuration in which to save the mail. Enter a directory
+(without the maildir `/cur` ending which will be appended
+automatically). Additional information can be found as usual using:
+
+ M-x describe-variable notmuch-fcc-dirs
+
+An additional variable that can affect FCC settings in some cases is
+`message-directory`. Emacs message-mode uses this variable for
+postponed messages.
+
+To customize both variables at the same time, use the fancy command:
+
+ 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`
+address. Please see the documentation for the variable
+`notmuch-fcc-dirs` in the customization window for how to arrange
+this.
+
+## How to customize `notmuch-saved-searches`
+
+When starting notmuch, a list of saved searches and message counts is
+displayed, replacing the older `notmuch-folders` command. The set of
+saved searches displayed can be modified directly from the notmuch
+interface (using the `[save]` button next to a previous search) or by
+customising the variable `notmuch-saved-searches`.
+
+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"), 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
+deleted. This causes messages that are marked as deleted to be removed
+from the commonly used views of messages. Use whatever seems most
+useful to you.
+
+## Viewing HTML messages with an external viewer
+
+The emacs client can display an HTML message inline using either the
+`html2text` library or some text browser, like w3m or lynx. This is
+controlled by the `mm-text-html-renderer` variable.
+
+The first option is theorically better, because it can generate
+strings formatted for emacs and do whatever you want, e.g., substitute
+text inside <b> tags for bold text in the buffer. The library, however
+is still in a very early development phase and cannot yet process
+properly many elements, like tables and