[PATCH 06/11] emacs: Remove broken `notmuch-get-bodypart-content' API

2014-07-11 Thread David Bremner
Austin Clements  writes:

> +This returns the content of the given part as a multibyte Lisp

What does "multibyte" mean here? utf8? current encoding?

> +string after performing content transfer decoding and any
> +necessary charset decoding.  It is an error to use this for
> +non-text/* parts."
> +  (let ((content (plist-get part :content)))
> +(when (not content)
> +  ;; Use show --format=sexp to fetch decoded content
> +  (let* ((args `("show" "--format=sexp" "--include-html"
> +  ,(format "--part=%s" (plist-get part :id))
> +  ,@(when process-crypto '("--decrypt"))
> +  ,(notmuch-id-to-query (plist-get msg :id
> +  (npart (apply #'notmuch-call-notmuch-sexp args)))
> + (setq content (plist-get npart :content))
> + (when (not content)
> +   (error "Internal error: No :content from %S" args
> +content))

I'm a bit curious at the lack of setting "coding-system-for-read" here.
Are we assuming the user has their environment set up correctly? Not so
much a criticism as being nervous about everything coding-system
related.

I didn't see anything else to object to in this patch or the previous
one.


[DRAFT PATCH] modified notmuch-emacs-mua

2014-07-11 Thread Tomi Ollila
Highlights:

* notmuch-emacs-mua without arguments runs (notmuch-hello)

* runs emacs(1) in case emacsclient(1) fails to connect to running emacs

* takes -nw option

* handles mailto:

* --from option when sending non-mailto: way

* -i includes file --body[= ]string inserts string
---
 notmuch-emacs-mua | 200 ++
 1 file changed, 200 insertions(+)
 create mode 100755 notmuch-emacs-mua

diff --git a/notmuch-emacs-mua b/notmuch-emacs-mua
new file mode 100755
index 000..b1696f7
--- /dev/null
+++ b/notmuch-emacs-mua
@@ -0,0 +1,200 @@
+#!/usr/bin/env bash
+# -*- mode: shell-script; sh-basic-offset: 4; tab-width: 8 -*-
+#
+# notmuch-emacs-mua - start composing a mail on the command line
+#
+# Copyright ? 2014 Jani Nikula
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see http://www.gnu.org/licenses/ .
+#
+# Authors: Jani Nikula 
+#  Tomi Ollila 
+#
+
+set -eu
+
+# "expand" '\' to '\\' & '"' to '\"'
+escape_optarg ()
+{
+OPTARG=${OPTARG//\\/}; OPTARG=${OPTARG//\"/\\\"}
+}
+
+# ditto, in case there is '\n' sequence in the source, otherwise
+# "expand" only trailing '\'s to '\\'s
+escape_body_optarg ()
+{
+case ${OPTARG} in
+   *'\"'*) OPTARG=${OPTARG//\\/} ;;
+   *'\') OPTARG=$( printf %s "${OPTARG}" | sed 's/\(\\*\)$/\1\1/' )
+esac
+OPTARG=${OPTARG//\"/\\\"}
+}
+
+unset ALTERNATE_EDITOR
+exec_mua ()
+{
+if "${EMACSCLIENT:=emacsclient}" --eval t >/dev/null 2>&1
+then
+   emacs=$EMACSCLIENT
+   # close stdout in case no -nw (and no --print)
+   test -n "$W$X" || exec >/dev/null
+else
+   emacs=${EMACS:-emacs}
+fi
+${X:-exec} "$emacs" $W --eval "$*"
+exit
+${X:-exec "$emacs" $W --eval} "$*"
+}
+
+X=
+W=
+
+SUBJECT= TO= CC= BCC= BODY= FROM= IB=
+
+while
+# first, handle "long" options which cannot be handled by getopts
+case ${1-} in
+   -nw)
+   W=-nw
+   shift
+   continue
+   ;;
+   mailto:*)
+   oIFS=$IFS; IFS=; OPTARG="$*" IFS=$oIFS
+   escape_optarg
+   exec_mua "(progn (require 'notmuch) (browse-url-mail \"$OPTARG\"))"
+   exit
+esac
+
+getopts :s:c:b:i:h opt
+do
+# Handle errors and long options.
+case ${opt} in
+   :)
+   echo "$0: short option '-${OPTARG}' requires an argument." >&2
+   exit 1
+   ;;
+   \?)
+   opt=$1
+   if [[ ${OPTARG} != '-' ]]; then
+   echo "$0: unknown short option '-${OPTARG}'." >&2
+   exit 1
+   fi
+
+   case ${opt} in
+   # Long options with arguments.
+   --subject=*|--to=*|--cc=*|--bcc=*|--body=*|--from=*)
+   OPTARG=${opt#--*=}
+   opt=${opt%%=*}
+   ;;
+   # Long options with argument in next arg.
+   --subject  |--to  |--cc  |--bcc  |--body  |--from  )
+   if [[ $# < 2 ]]; then
+   echo "$0: option '${opt}' requires an argument." >&2
+   exit 1
+   fi
+   OPTARG=$2
+   OPTIND=$((OPTIND + 1))
+   ;;
+   # Long options without arguments.
+   --help|--nw|--print)
+   ;;
+   *)
+   echo "$0: unknown long option '${opt}', or argument 
mismatch." >&2
+   exit 1
+   ;;
+   esac
+   # getopts does not do this for what it considers errors.
+   OPTIND=$((OPTIND + 1))
+   ;;
+esac
+
+case ${opt} in
+   --help|h)
+   exec man notmuch-emacs-mua
+   ;;
+   --from)
+   escape_optarg
+   FROM=${OPTARG}
+   ;;
+   --subject|s)
+   escape_optarg
+   SUBJECT=${SUBJECT:+$SUBJECT }${OPTARG}
+   ;;
+   --to)
+   escape_optarg
+   TO=${TO:+$TO, }${OPTARG}
+   ;;
+   --cc|c)
+   escape_optarg
+   CC=${CC:+$CC, }${OPTARG}
+   ;;
+   --bcc|b)
+   escape_optarg
+   BCC=${BCC:+$BCC, }${OPTARG}
+   ;;
+   i)
+   escape_optarg
+   if [[ ! -f ${OPTARG} ]]; then
+   echo "$0: '${OPTARG}': no such file" >&2
+   exit 1
+   fi
+   IB=${IB}$'\n'"  (insert-file 

nevermore

2014-07-11 Thread Trevor Jim

Nevermore is an experimental emacs email interface for Notmuch.
It provides:

* Interactive search
* Snooze
* Tag editing with autocompletion
* Mail address completion (via company-mode)
* Junk mail filtering (via bogofilter)

Get it from github: https://github.com/tjim/nevermore

I'm not sure where I'm taking nevermore.  I was using it as my main
mail client but I lost IMAP access to some of my mail, which makes it
it less useful for me.  But it has some features that I don't see in
notmuch.el, so, I'm releasing it in case others find it interesting.

-Trevor

___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


Re: [PATCH 06/11] emacs: Remove broken `notmuch-get-bodypart-content' API

2014-07-11 Thread David Bremner
Austin Clements amdra...@mit.edu writes:

 +This returns the content of the given part as a multibyte Lisp

What does multibyte mean here? utf8? current encoding?

 +string after performing content transfer decoding and any
 +necessary charset decoding.  It is an error to use this for
 +non-text/* parts.
 +  (let ((content (plist-get part :content)))
 +(when (not content)
 +  ;; Use show --format=sexp to fetch decoded content
 +  (let* ((args `(show --format=sexp --include-html
 +  ,(format --part=%s (plist-get part :id))
 +  ,@(when process-crypto '(--decrypt))
 +  ,(notmuch-id-to-query (plist-get msg :id
 +  (npart (apply #'notmuch-call-notmuch-sexp args)))
 + (setq content (plist-get npart :content))
 + (when (not content)
 +   (error Internal error: No :content from %S args
 +content))

I'm a bit curious at the lack of setting coding-system-for-read here.
Are we assuming the user has their environment set up correctly? Not so
much a criticism as being nervous about everything coding-system
related.

I didn't see anything else to object to in this patch or the previous
one.
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch