X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=remoteusage.mdwn;h=55eea4b00aaa7d52aeba4d78c07632898189c62b;hb=14bd0939d030873725ced673ab2c86fa3b1e6e7f;hp=b30d6e2ab879babe7c68418d97423f92a4c158fe;hpb=d4cc0b096cdfd6526c290437fdb43b2953a2f78d;p=notmuch-wiki
diff --git a/remoteusage.mdwn b/remoteusage.mdwn
index b30d6e2..55eea4b 100644
--- a/remoteusage.mdwn
+++ b/remoteusage.mdwn
@@ -26,13 +26,13 @@ server), `bash`, and `ssh` on another computer (let's call that computer
3. password-free login (public key authentication) from client to
server. [Here](http://www.debian-administration.org/articles/152) is a
-good page on how to set it up (*).
+good page on how to set it up (3).
4. a reasonably fast connection. (This isn't really *necessary*, but if
your connection is too slow, this won't be very pleasant to use, and
certainly won't seem transparent.)
-(*) If you don't want / cannot use password-free login,
+(3) If you don't want / cannot use password-free login,
[[This|remoteusage/124]] page provides yet another alternative.
## Configure `ssh` on the client computer ##
@@ -69,7 +69,7 @@ Save this to a file, for example `remote-notmuch.sh`, in your `PATH`:
printf -v ARGS "%q " "$@"
exec ssh notmuch notmuch ${ARGS}
-and give it execute permissons: `chmod +x remote-notmuch.sh`
+and give it execute permissions: `chmod +x remote-notmuch.sh`
Now you can run `remote-notmuch.sh new`, or other notmuch commands. You
can call the script anything you like. (You could also call it `notmuch`
@@ -82,8 +82,8 @@ script:
(setq notmuch-command "/path/to/your/remote-notmuch.sh")
-If you use Fcc, you may want to do something like this on the client, to
-Bcc mails to yourself:
+If you use Fcc and Notmuch older than 0.23, you may want to do something like
+this on the client, to Bcc mails to yourself:
(setq notmuch-fcc-dirs nil)
(add-hook 'message-header-setup-hook
@@ -91,6 +91,106 @@ Bcc mails to yourself:
(notmuch-user-name)
(notmuch-user-primary-email))))))
+Starting from 0.23, Fcc is also done through notmuch-command.
+
+## Additional Emacs remote-notmuch configuration ##
+
+To prevent you from having to maintain your GPG private keys on the remote
+server, you can add advice to `notmuch-show-view-raw-message` to enable epa
+inline decryption from notmuch raw message views.
+
+```elisp
+;; enable gpg decryption in raw view
+(defadvice notmuch-show-view-raw-message
+ (after notmuch-show-view-raw-message-after activate)
+ (epa-mail-mode))
+```
+
+When using remote-notmuch in an environment that brings the ssh tunnel up and
+down often (e.g. laptop suspends), it's helpful to have an Emacs process
+sentinel in place that will monitor the process state of your remote-notmuch
+ssh session.
+
+```elisp
+(defvar my/ssh-tunnel-notmuch-proc nil)
+
+(defun my/ssh-tunnel-notmuch ()
+ "Start and monitor ssh session for remote-notmuch."
+ (my/ssh-tunnel-with-proc
+ (proc "~/.ssh/config" "notmuch")
+ (set-process-sentinel
+ proc
+ #'(lambda (proc string)
+ (when (buffer-live-p (process-buffer proc))
+ (kill-buffer (process-buffer proc)))
+ (when (yes-or-no-p "Restart notmuch control master? ")
+ (setq my/ssh-tunnel-notmuch-proc (my/ssh-tunnel-notmuch)))))
+ proc))
+
+(defadvice notmuch
+ (before notmuch-before activate)
+ (unless (process-live-p my/ssh-tunnel-notmuch-proc)
+ (message "Starting notmuch control master")
+ (setq my/ssh-tunnel-notmuch-proc (my/ssh-tunnel-notmuch))))
+
+;;; here be dragons
+
+(require 'cl-lib)
+(require 'tramp)
+
+(cl-defmacro my/ssh-tunnel-with-proc ((proc ssh-tunnel-config-path ssh-tunnel-config-name) &body body)
+ "Bind PROC with an ssh process for SSH-TUNNEL-CONFIG-NAME from SSH-TUNNEL-CONFIG-PATH for BODY.
+
+ Example of use:
+
+ (defun my/ssh-tunnel-start ()
+ \"returns active process or nil\"
+ (my/ssh-tunnel-with-proc (proc \"~/my-ssh-configs/someconfig.ssh\"
+ \"name_of_config\")
+ ;; BODY with process bound to proc
+ proc))
+ "
+ (let ((ssh-tunnel-process (gensym "ssh-tunnel-process")))
+
+ `(let ((,ssh-tunnel-process nil)
+ (ssh-tunnel-buffer-name (format "*%s*" ,ssh-tunnel-config-name))
+ (ssh-tunnel-config ,ssh-tunnel-config-name))
+ (if (not (process-live-p ,ssh-tunnel-process))
+ (let ((process (start-process
+ ,ssh-tunnel-config-name
+ (generate-new-buffer ssh-tunnel-buffer-name)
+ "ssh"
+ "-C"
+ "-N"
+ "-F"
+ (format "%s" (expand-file-name ,ssh-tunnel-config-path))
+ ,ssh-tunnel-config-name)))
+ (if (process-live-p process)
+ (progn
+ (setq ,ssh-tunnel-process process)
+ (set-process-filter
+ process
+ #'(lambda (proc string)
+ (when (and (process-live-p proc)
+ (buffer-live-p (process-buffer proc)))
+ (if (string-match-p tramp-password-prompt-regexp string)
+ (process-send-string proc (concat (read-passwd string) "\n"))
+ (princ (format "%s" string)
+ (process-buffer proc))))))
+ (set-process-sentinel
+ process
+ #'(lambda (proc string)
+ (message "%s-sentinel: %s" ,ssh-tunnel-config-name string)))
+ (message "Started ssh config: %s" ,ssh-tunnel-config-name))
+ ;; else
+ (message "Could not start ssh config: %s" ,ssh-tunnel-config-name)))
+ (message "%s already running" ,ssh-tunnel-config-name))
+ ;; BODY
+ (let ((,proc ,ssh-tunnel-process))
+ ,@body)
+ )))
+```
+
## Problems ##
Some things probably won't work perfectly, and there might be some