]> git.cworth.org Git - notmuch-wiki/blobdiff - remoteusage.mdwn
Simplify script.
[notmuch-wiki] / remoteusage.mdwn
index d43a8cdb60308c3ca604d14d9ca30185a19c2bcc..968978e154423f7c6cd30c63caf9f36b7c853bb0 100644 (file)
@@ -35,61 +35,124 @@ good page on how to set it up.
 if your connection is too slow, this won't be very pleasant to use,
 and certainly won't seem transparent.)
 
-##Write a simple wrapper shell script##
-Now we will need to write a simple shell script that replaces the
-call to the notmuch binary with a call to notmuch over ssh. 
+##Write a wrapper shell script##
+Now we will need to write a simple shell script that does two things:
 
-Note that this shell script also pauses briefly after every ten search
+1.  replaces the call to the notmuch binary with a call to notmuch
+over ssh.
+2.  offers, via the "--get" option, a utility for downloading raw
+message text over scp (this is necessary for attachments) and
+caching for future use.
+
+Note that this shell script also pauses briefly after every message
 entries. This is currently necessary so that the emacs process-filter
 doesn't chop off messages. It's an obvious hack, and hopefully won't
 be necessary in the furture.
 
-       #!/usr/bin/env bash
-       
-       SSH_BIN="/path/to/ssh/on/client"
-       USER="user_name"
-       HOST="server_name"
-       NOTMUCH_REMOTE_BIN="/path/to/notmuch/on/server"
-       
-       if [ $1 = "search" ]; then
-           COUNT=0;
-           OUT=`$SSH_BIN $USER@$HOST $NOTMUCH_REMOTE_BIN $@`
-           echo "$OUT" | while read line; do
-               COUNT=`expr $COUNT + 1`
-               echo "$line";
-               if [ $COUNT = 10 ]; then
-                   sleep 0.1;
-               fi
-           done
-       else
-           $SSH_BIN $USER@$HOST $NOTMUCH_REMOTE_BIN $@
-       fi
-       
+    #!/usr/bin/env bash
+    SSH_BIN="/path/to/ssh/on/client"
+    USER="user_name"
+    SSH_HOST="server_name"
+    NOTMUCH_REMOTE_BIN="/path/to/notmuch/on/server"
+    CACHE="${HOME}/.notmuch-cache.d"
+
+    notmuch_run ()
+    {
+        if [ $1 = "search" ]; then
+           $SSH_BIN $USER@$SSH_HOST $NOTMUCH_REMOTE_BIN $@ | while read line; do
+                sleep 0.1
+                echo "${line}"
+
+           done
+        else
+           $SSH_BIN $USER@$SSH_HOST $NOTMUCH_REMOTE_BIN $@
+        fi
+    }
+    
+    check_for_file_name ()
+    {
+        [ -f "${CACHE}/${1}" ]
+    }
+    
+    fetch_file ()
+    {
+        FILE_DIR="${CACHE}/$(dirname ${1})"
+        [ -d "${FILE_DIR}" ] || mkdir -p "${FILE_DIR}"
+        scp ${SSH_HOST}:${1} "${FILE_DIR}" > /dev/null 2>&1
+        retcode="${?}"
+        if [ "${retcode}" -ne "0" ]; then
+       echo "Failed to fetch file" 1>&2
+       exit ${retcode}
+        fi
+    }
+    
+    notmuch_get ()
+    {
+        [ -d "${CACHE}" ] || mkdir -p "${CACHE}"
+     
+        check_for_file_name || 
+        fetch_file ${1} && 
+        printf "${CACHE}/${1}\n"
+    }
+    
+    if [ ${1} = "--get" ]; then
+        notmuch_get $2
+    else
+        notmuch_run $@
+    fi
+       
 Save this to a file, "remote-notmuch.sh", in your path.
 
+Now you can run "remote-notmuch.sh new". You can call the script
+anything you like. If you don't have a notmuch instance on your client
+computer, you can even call it "notmuch" and have totally transparent
+usage. (Since I run "new" from an emacs keybinding, I've never
+bothered with this renaming.)
+
 ##Configure your emacs client##
 
 Add the following to your .emacs (this is on your client machine):
 
     (setq notmuch-command "/path/to/your/remote-notmuch.sh")
 
-At least until 0.3 or 0.4, you will also need to add the following. It
-should become unnecessary pretty soon though:
-
-    (setq notmuch-remote-host "user_name@server_name")
+Now add the following, to overwrite the way in which notmuch gets raw
+message text. 
+
+    (defun notmuch-show-get-filename ()
+      (let* ((orig-filename (notmuch-show-get-prop :filename))
+             (retvalue (progn 
+                         (message "Downloading... ")
+                         (shell-command-to-string (concat notmuch-command 
+                                                          " --get "
+                                                          orig-filename)))))
+        (replace-regexp-in-string "\n" "" retvalue)))
+
+This will will use the "--get" option of the above
+script. Note that it only has to do this for attachments or for
+viewing the raw file, and only the first time. After that, it is
+cached.
+
+##A tip to speed things up##
+If you have openssh >= 0.4, you can make use of the "ControlMaster"
+feature. This allows you to reuse an existing connection. Therefore
+if you keep a connection open, you won't have to authenticate every
+time.
+
+Add the following to your ~/.ssh/config file:
+
+    Host server_name 
+    ControlMaster auto
+    ControlPath ~/.ssh/master-%r@%h:%p
     
-    (defadvice notmuch-show-get-filename (around
-                                     notmuch-show-get-remote-filename
-                                     activate)
-      (setq ad-return-value (concat "/ssh:"
-                               notmuch-remote-host
-                               ":"
-                               ad-do-it)))
-
-The purpose of these lines is to allow emacs to have access to the raw
-files, via TRAMP, so that it can extract attachments and parse
-HTML. Work is afoot to make notmuch handle these tasks itself, so this
-part should soon be unecessary.
+You can also se the Host to "*", if you want to use it for all
+connections. I usually have an interactive ssh connection to my home
+computer open, so I don't need to do anything more. But if not, you
+can always run:
+
+    ssh -Nf server_name
+
+which will open up a background connection, which you can then reuse
+for all of your notmuch commands.
 
 ##Problems##
 Some things won't work perfectly, and there might be some unexpected