]> git.cworth.org Git - notmuch-wiki/blobdiff - emacstips.mdwn
add org-notmuch install instructions for NixOS
[notmuch-wiki] / emacstips.mdwn
index 91c1cb0938abadad6f1727f69009f57a05b365af..47f53e51e6e3d9f827d6e8c4c185810f2d3f5f55 100644 (file)
@@ -18,7 +18,7 @@ or
 
 to your .emacs file.
 
 
 to your .emacs file.
 
-## Controlling external handlers for attachements
+## 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:
 
 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:
@@ -274,10 +274,72 @@ With that in place, you need a `.msmtprc` with the accounts configured
 for the domains you want to send out using specific SMTP servers and
 the rest will go to the default account.
 
 for the domains you want to send out using specific SMTP servers and
 the rest will go to the default account.
 
+## sending mail using smtpmail
+
+<!-- By default message mode will use the system `sendmail` command to send
+mail. However, on a typical desktop machine there may not be local SMTP
+daemon running (nor it is configured to send mail outside of the system). -->
+
+If setting up local `sendmail` or `msmtp` is not feasible or desirable,
+the Emacs `smtpmail` package can be used to send email by talking to remote
+SMTP server via TCP connection. It is pretty easy to configure:
+
+1. Emacs variable `message-send-mail-function` has not been set
+
+   Initially, Emacs variable `message-send-mail-function` has value of
+   `sendmail-query-once`. When (notmuch) message mode is about to send email,
+   `sendmail-query-once` will ask how emacs should send email. Typing `smtp`
+   will configure `smtpmail` and Emacs may prompt for SMTP settings.
+
+1. `M-x customize-group RET smtpmail`
+
+   As a minimum, 'Smtpmail Smtp Server' needs to be set.
+
+   After doing that, continue with `M-x load-library RET message` and
+   `M-x customize-variable RET message-send-mail-function`.
+   In the customization buffer select `message-smtpmail-send-it`.
+
+1. Set some variables in .emacs or in [notmuch init file](/notmuch-emacs#notmuch_init_file)
+
+        (setq smtpmail-smtp-server "smtp.server.tld" ;; <-- edit this !!!
+        ;;    smtpmail-smtp-service 25 ;; 25 is default -- uncomment and edit if needed
+        ;;    smtpmail-stream-type 'starttls
+        ;;    smtpmail-debug-info t
+        ;;    smtpmail-debug-verb t
+              message-send-mail-function 'message-smtpmail-send-it)
+
+Note that emacs 24 or newer is required for `smtpmail-stream-type`
+(and smtp authentication) to be effective.
+
+More information for smtpmail is available:
+
+* In Emacs: `M-x info-display-manual smtpmail`
+* [EmacsWiki Page](http://www.emacswiki.org/emacs/SendingMail)
+
+
 ## <span id="address_completion">Address completion when composing</span>
 
 There are currently three solutions to this:
 
 ## <span id="address_completion">Address completion when composing</span>
 
 There are currently three solutions to this:
 
+### notmuch address
+
+Starting with Notmuch 0.21, there is a builtin command to perform
+autocompletion directly within Notmuch. Starting with 0.22, it is
+configured by default, so if you have previously configured another
+completion mechanism, you may want to try out the new internal
+method. Use `M-x customize-variable RET notmuch-address-command` and
+reset the value to "internal address completion" (`'internal` in
+lisp).
+
+If you are not yet running 0.22, you can still use it by adding a
+wrapper around the command called, say, `notmuch-address`:
+
+    #!/bin/sh
+    exec notmuch address from:"$*"
+
+Then you can set the `notmuch-address-command` to `notmuch-address`
+(if it is in your `$PATH` of course, otherwise use an absolute path).
+
 ### bbdb
 
 [bbdb](http://bbdb.sourceforge.net) is a contact database for emacs
 ### bbdb
 
 [bbdb](http://bbdb.sourceforge.net) is a contact database for emacs
@@ -310,7 +372,7 @@ available:
             cc -o addrlookup addrlookup.c `pkg-config --cflags --libs gobject-2.0` -lnotmuch
 
   * Shell/fgrep/perl combination [nottoomuch-addresses.sh](https://github.com/domo141/nottoomuch/blob/master/nottoomuch-addresses.rst).
             cc -o addrlookup addrlookup.c `pkg-config --cflags --libs gobject-2.0` -lnotmuch
 
   * Shell/fgrep/perl combination [nottoomuch-addresses.sh](https://github.com/domo141/nottoomuch/blob/master/nottoomuch-addresses.rst).
-    This tools maintains it's own address "database" gathered from email
+    This tools maintains its 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/)
     files notmuch knows and search from that "database" is done by `fgrep(1)`.
 
   * python/sqlite combination [notmuch-abook](https://github.com/guyzmo/notmuch-abook/)
@@ -375,7 +437,7 @@ address.
 
 ## How to sign/encrypt messages with gpg
 
 
 ## How to sign/encrypt messages with gpg
 
-Messages can by signed using gpg by invoking
+Messages can be signed using gpg by invoking
 `M-x mml-secure-sign-pgpmime` (or `M-x mml-secure-encrypt-pgpmime`).
 These functions are available via the 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
 `M-x mml-secure-sign-pgpmime` (or `M-x mml-secure-encrypt-pgpmime`).
 These functions are available via the 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
@@ -393,6 +455,42 @@ 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.
 
 of `mml-secure-sign-pgpmime` to sign the whole message instead of just one
 part.
 
+If you want to automatically encrypt outgoing messages if the keyring
+contains a public key for every recipient, you can add something like
+that to your `.emacs` file:
+
+    (defun message-recipients ()
+      "Return a list of all recipients in the message, looking at TO, CC and BCC.
+
+    Each recipient is in the format of `mail-extract-address-components'."
+      (mapcan (lambda (header)
+                (let ((header-value (message-fetch-field header)))
+                  (and
+                   header-value
+                   (mail-extract-address-components header-value t))))
+              '("To" "Cc" "Bcc")))
+
+    (defun message-all-epg-keys-available-p ()
+      "Return non-nil if the pgp keyring has a public key for each recipient."
+      (require 'epa)
+      (let ((context (epg-make-context epa-protocol)))
+        (catch 'break
+          (dolist (recipient (message-recipients))
+            (let ((recipient-email (cadr recipient)))
+              (when (and recipient-email (not (epg-list-keys context recipient-email)))
+                (throw 'break nil))))
+          t)))
+
+    (defun message-sign-encrypt-if-all-keys-available ()
+      "Add MML tag to encrypt message when there is a key for each recipient.
+
+    Consider adding this function to `message-send-hook' to
+    systematically send encrypted emails when possible."
+      (when (message-all-epg-keys-available-p)
+        (mml-secure-message-sign-encrypt)))
+
+    (add-hook 'message-send-hook #'message-sign-encrypt-if-all-keys-available
+
 ### Troubleshooting message-mode gpg support
 
 - If you have trouble with expired subkeys, you may have encountered
 ### Troubleshooting message-mode gpg support
 
 - If you have trouble with expired subkeys, you may have encountered
@@ -408,7 +506,7 @@ part.
 
 Encrypted and signed mime messages can be read and verified with:
 
 
 Encrypted and signed mime messages can be read and verified with:
 
-        (notmuch-crypto-process-mime t)
+        (setq notmuch-crypto-process-mime t)
 
 Decrypting or verifying inline pgp messages can be done by selecting
 an the inline pgp area and and using:
 
 Decrypting or verifying inline pgp messages can be done by selecting
 an the inline pgp area and and using:
@@ -482,6 +580,17 @@ The last two do the same thing.
 
 See also the **Usage:** section in `gnus-alias.el`.
 
 
 See also the **Usage:** section in `gnus-alias.el`.
 
+## Multiple identities (and more) with message-templ
+
+Another option for multiple identities is
+[message-templ](http://pivot.cs.unb.ca/git?p=message-templ.git;a=summary)
+(also a available in marmalade).  This provides roughly the same
+facilities as wanderlust's template facility.
+
+See
+[example.emacs.el](http://pivot.cs.unb.ca/git?p=message-templ.git;a=blob;f=example.emacs.el;hb=HEAD)
+for some simple examples of usage.
+
 ## Resending (or bouncing) messages
 
 Add the following to your [notmuch init file](/notmuch-emacs#notmuch_init_file) to be able
 ## Resending (or bouncing) messages
 
 Add the following to your [notmuch init file](/notmuch-emacs#notmuch_init_file) to be able
@@ -555,7 +664,7 @@ I like to have an inbox saved search, but only show unread messages when they
 view a thread. This takes two steps:
 
 1. Apply
 view a thread. This takes two steps:
 
 1. Apply
-[this patch from Mark Walters](http://notmuchmail.org/pipermail/notmuch/2012/010817.html)
+[this patch from Mark Walters](https://notmuchmail.org/pipermail/notmuch/2012/010817.html)
 to add the `notmuch-show-filter-thread` function.
 1. Add the following hook to your emacs configuration:
 
 to add the `notmuch-show-filter-thread` function.
 1. Add the following hook to your emacs configuration:
 
@@ -609,6 +718,13 @@ In Debian and derivatives,
 
     (add-to-list 'load-path "/usr/share/org-mode/lisp")
 
 
     (add-to-list 'load-path "/usr/share/org-mode/lisp")
 
+In NixOS, using `emacsWithPackages (epkgs: [ epkgs.orgPackages.org-plus-contrib ])`,
+
+    (loop for p in load-path
+          do (if (file-accessible-directory-p p)
+                 (let ((m (directory-files-recursively p "^org-notmuch.el$")))
+                      (if m (add-to-list 'load-path (file-name-directory (car m)))))))
+
 Then
 
     (require 'org-notmuch)
 Then
 
     (require 'org-notmuch)
@@ -627,25 +743,27 @@ refine, next hunk etc all work.
       "View the the current message as a patch."
       (interactive)
       (let* ((id (notmuch-show-get-message-id))
       "View the the current message as a patch."
       (interactive)
       (let* ((id (notmuch-show-get-message-id))
+             (msg (notmuch-show-get-message-properties))
+             (part (notmuch-show-get-part-properties))
              (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)))
              (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)
+        (define-key map "q" 'notmuch-bury-or-kill-this-buffer)
         (switch-to-buffer buf)
         (let ((inhibit-read-only t))
           (erase-buffer)
           (insert subject)
         (switch-to-buffer buf)
         (let ((inhibit-read-only t))
           (erase-buffer)
           (insert subject)
-          (insert (notmuch-get-bodypart-internal id 1 nil)))
+          (insert (notmuch-get-bodypart-text msg part 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))))
 
         (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
+and then this function needs to bound to `. d` in the keymap
 
 
-    (define-key 'notmuch-show-mode-map "D" 'my-notmuch-show-view-as-patch)
+    (define-key 'notmuch-show-part-map "d" 'my-notmuch-show-view-as-patch)
 
 ## Interfacing with Patchwork
 
 
 ## Interfacing with Patchwork
 
@@ -683,7 +801,7 @@ Add a new entry with "Function returning the URL:" set to:
                                   "-f" "%{id}"))))
 
 Replacing `http://patchwork.example.com/patch/`, `/path/to/pwclient`, and
                                   "-f" "%{id}"))))
 
 Replacing `http://patchwork.example.com/patch/`, `/path/to/pwclient`, and
-`the-project` appropiately. You should now be able to stash the Patchwork URL
+`the-project` appropriately. You should now be able to stash the Patchwork URL
 using `c l`.
 
 Going further, if the patch has been committed, you can get the commit hash with
 using `c l`.
 
 Going further, if the patch has been committed, you can get the commit hash with
@@ -708,3 +826,16 @@ can turn the commit hash into a URL pointing there, for example:
                                   "-m" (concat "<" message-id ">")
                                   "-n" "1"
                                   "-f" "%{commit_ref}"))))
                                   "-m" (concat "<" message-id ">")
                                   "-n" "1"
                                   "-f" "%{commit_ref}"))))
+
+## Never forget attachments
+
+Very often we forget to actually attach the file when we send an email
+that's supposed to have an attachment. Did this never happen to you?
+If not, then it will.
+
+There is a hook out there that checks the content of the email for
+keywords and warns you before the email is sent out if there's no
+attachment. This is currently work in progress, but you can already
+add the hook to your `~/.emacs.d/notmuch-config.el` file to test
+it. Details available (and feedback welcome) in the [relevant
+discussion](https://notmuchmail.org/pipermail/notmuch/2018/026414.html).