X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=emacstips.mdwn;h=36b70293cb7350d6220a5e44ccd4bec06cf8d7e2;hb=915f6b67d0ef9907de86e4a9d6ced4a5f207dbd7;hp=09c4b77cec2b30850d4dc03d2dc748c22023785b;hpb=8a373c87ebecd8fafea8c95963c99b1d30bc5822;p=notmuch-wiki diff --git a/emacstips.mdwn b/emacstips.mdwn index 09c4b77..36b7029 100644 --- a/emacstips.mdwn +++ b/emacstips.mdwn @@ -1,3 +1,4 @@ +[[!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 @@ -173,62 +174,39 @@ case you want this behaviour: ## Add a key binding to add/remove/toggle a tag -The `notmuch-{search,show}-{add,remove}-tag` functions are very useful -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: +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. -In notmuch versions up to 0.11.x +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"))) - -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 () - "mark message as spam" - (interactive) - (notmuch-show-tag-message "+spam" "-inbox"))) + (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 called functions. - -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: +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`. - (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 +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 "spam") - (notmuch-show-remove-tag "inbox"))) - (define-key notmuch-show-mode-map "S" 'notmuch-show-tag-spam) + (notmuch-show-add-tag (list "+spam" "-inbox"))) -(See above for analogy how to apply this for notmuch 0.12 and later) + (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: @@ -238,18 +216,8 @@ key: "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 - - (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")))) + (notmuch-show-tag (list "-deleted")) + (notmuch-show-tag (list "+deleted"))))) ## Adding many tagging keybindings @@ -328,14 +296,37 @@ 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 might be: +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"). +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 @@ -441,7 +432,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 three +candidates based on a search string. There are currently four available: * The python tool `notmuch_address.py` (`git clone @@ -461,6 +452,10 @@ available: This tools maintains it's own address "database" gathered from email files notmuch knows and search from that "database" is done by `fgrep(1)`. + * python/sqlite combination [notmuch-abook](https://github.com/guyzmo/notmuch-abook/) + This tools also maintains an address database in sqlite after harvesting + from notmuch. It also includes a vim plugin. + You can perform tab-completion using any of these programs. Just add the following to your .emacs: @@ -482,6 +477,32 @@ programs above. You can add the sender of a message to Google Contacts by piping the message (`notmuch-show-pipe-message`) to `goobook add`. +### Akonadi + + git clone https://github.com/mmehnert/akonadimailsearch + +Install the development packages for kdepim on your system. +Enter the cloned repository and create a build directory: + + mkdir build + cd build + cmake ..; make; + +You will find the akonadimailsearch binary in the build/src directory. +Create a ~/bin/akonadimailsearch.sh file with the following content and make it executable: +(Adjust the path for the akonadimailsearch binary.) + + #!/bin/sh + akonadimailsearch "$@" 2>/dev/null + +As described above, you can now add the following settings to your ~/.emacs file: + + (require 'notmuch-address) + (setq notmuch-address-command "~/bin/akonadimailsearch.sh") + (notmuch-address-message-insinuate) + + + ## How to sign/encrypt messages with gpg Messages can by signed using gpg by invoking @@ -555,7 +576,7 @@ Here is an example configuration. ;; Use "home" identity by default (setq gnus-alias-default-identity "home") ;; Define rules to match work identity - (setq gnus-alias-identity-rules + (setq gnus-alias-identity-rules) '(("work" ("any" "john.doe@\\(example\\.com\\|help\\.example.com\\)" both) "work")) ;; Determine identity when message-mode loads (add-hook 'message-setup-hook 'gnus-alias-determine-identity) @@ -711,3 +732,33 @@ Then In general it is nice to have a key for org-links (not just for notmuch). For example (define-key global-map "\C-cl" 'org-store-link) + +## Viewing diffs in notmuch + +The following code allows you to view an inline patch in diff-mode +directly from notmuch. This means that normal diff-mode commands like +refine, next hunk etc all work. + + (defun my-notmuch-show-view-as-patch () + "View the the current message as a patch." + (interactive) + (let* ((id (notmuch-show-get-message-id)) + (subject (concat "Subject: " (notmuch-show-get-subject) "\n")) + (diff-default-read-only t) + (buf (get-buffer-create (concat "*notmuch-patch-" id "*"))) + (map (make-sparse-keymap))) + (define-key map "q" 'notmuch-kill-this-buffer) + (switch-to-buffer buf) + (let ((inhibit-read-only t)) + (erase-buffer) + (insert subject) + (insert (notmuch-get-bodypart-internal id 1 nil))) + (set-buffer-modified-p nil) + (diff-mode) + (lexical-let ((new-ro-bind (cons 'buffer-read-only map))) + (add-to-list 'minor-mode-overriding-map-alist new-ro-bind)) + (goto-char (point-min)))) + +and then this function needs to bound into the keymap with something like + + (define-key 'notmuch-show-mode-map "D" 'my-notmuch-show-view-as-patch)