X-Git-Url: https://git.cworth.org/git?p=notmuch-wiki;a=blobdiff_plain;f=emacstips.mdwn;h=58641771798bd3f61bb34bd8b6bf7613f4f8fb77;hp=36b70293cb7350d6220a5e44ccd4bec06cf8d7e2;hb=HEAD;hpb=915f6b67d0ef9907de86e4a9d6ced4a5f207dbd7 diff --git a/emacstips.mdwn b/emacstips.mdwn index 36b7029..288690c 100644 --- a/emacstips.mdwn +++ b/emacstips.mdwn @@ -1,152 +1,75 @@ [[!img notmuch-logo.png alt="Notmuch logo" class="left"]] -# Tips and Tricks for using notmuch with Emacs +# 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. +Here are some tips and tricks for using Notmuch with Emacs. See the [[Notmuch +Emacs Interface|notmuch-emacs]] page for basics. [[!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: - - (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. - -## 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 [ "$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)" - -## 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 - -## 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; - - ;; 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 to debug smtp sending problems - ;; (setq smtpmail-debug-info t) - -Then, add to `.emacs`: - - (autoload 'notmuch "~/.emacs.d/my-notmuch" "notmuch mail" t) +## Controlling external handlers for attachments + +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 + +### Convert ".pdf" and ".docx" to text and pop to buffer + +Add the following (hacky but effective!) code to `.emacs.d/notmuch-config.el`; +the overwritten `defcustom` will change action when pressing RET on top of an +attachment; ".pdf" and ".docx" attachments are converted to text (using +"pdf2text" and "docx2txt.pl" commands to do the conversion), saving to file +(the default action of `notmuch-show-part-button-default-action`) is offered +to attachments of other types. + + (defun user/mm-pipe-- (handle cmd) + ;; conveniently, '-' '-' a args to pdftotext and docx2txt.pl work fine + ;; fixme: naming inconsistency (fn name and buffer name) + (let ((buffer (get-buffer-create "*attachment-to-text*"))) + (with-current-buffer buffer + (setq buffer-read-only nil) + (erase-buffer)) + (with-temp-buffer + ;; "based on mm-pipe-part in mm-decode.el" + (mm-with-unibyte-buffer + (mm-insert-part handle) + (mm-add-meta-html-tag handle) + (let ((coding-system-for-write 'binary)) + (call-process-region (point-min) (point-max) + cmd nil buffer nil "-" "-")))) + (pop-to-buffer buffer) + (goto-char (point-min)) + (text-mode) + (visual-line-mode) + (view-mode))) + + (defun user/notmuch-show-pop-attachment-to-buffer () + ;; "based on notmuch-show-apply-to-current-part-handle" + (interactive) + (let ((handle (notmuch-show-current-part-handle))) + ;;(message "%s" handle) + (unwind-protect + (pcase (car (nth 1 handle)) + ("application/pdf" + (user/mm-pipe-- handle "pdftotext")) + ("application/vnd.openxmlformats-officedocument.wordprocessingml.document" + (user/mm-pipe-- handle "docx2txt.pl")) + (_ (notmuch-show-save-part))) + (kill-buffer (mm-handle-buffer handle))))) + + (setq notmuch-show-part-button-default-action + #'user/notmuch-show-pop-attachment-to-buffer) + +## Overwriting the sender address + +If you want to always use the same sender address, then the following +defadvice can help you. + + (defadvice notmuch-mua-reply (around notmuch-fix-sender) + (let ((sender "Max Monster ")) + ad-do-it)) + (ad-activate 'notmuch-mua-reply) ## Initial cursor position in notmuch 0.15 hello window @@ -179,7 +102,7 @@ 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 +"-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. @@ -198,6 +121,19 @@ 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-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: @@ -255,11 +191,15 @@ 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: +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) +And in tree mode: + + (define-key notmuch-tree-mode-map "r" (notmuch-tree-close-message-pane-and #'notmuch-show-reply)) + (define-key notmuch-tree-mode-map "R" (notmuch-tree-close-message-pane-and #'notmuch-show-reply-sender)) ## How to do FCC/BCC... @@ -288,6 +228,11 @@ address. Please see the documentation for the variable `notmuch-fcc-dirs` in the customization window for how to arrange this. +The `notmuch-fcc-dirs` variable is only taken into account when mails +are composed using `notmuch-mua-mail`. If you want to use the notmuch +mail user agent by default, the `mail-user-agent` needs to be +customized to use the `notmuch-user-agent`. + ## How to customize `notmuch-saved-searches` When starting notmuch, a list of saved searches and message counts is @@ -317,7 +262,7 @@ 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))) + :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 @@ -336,51 +281,28 @@ 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 Emacs client can generally display HTML messages inline using one of the +supported HTML renderers. 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