Re: [DRAFT PATCH] modified notmuch-emacs-mua
authorJani Nikula <jani@nikula.org>
Wed, 29 Oct 2014 20:14:07 +0000 (22:14 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 18:05:51 +0000 (10:05 -0800)
37/663ed8d765d22fa75c5004e4ff621e93af4922 [new file with mode: 0644]

diff --git a/37/663ed8d765d22fa75c5004e4ff621e93af4922 b/37/663ed8d765d22fa75c5004e4ff621e93af4922
new file mode 100644 (file)
index 0000000..47d5c0a
--- /dev/null
@@ -0,0 +1,339 @@
+Return-Path: <jani@nikula.org>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 2DD90431FC2\r
+       for <notmuch@notmuchmail.org>; Wed, 29 Oct 2014 13:14:20 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+       tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id S-lI3oQpt4J5 for <notmuch@notmuchmail.org>;\r
+       Wed, 29 Oct 2014 13:14:12 -0700 (PDT)\r
+Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com\r
+       [209.85.212.175]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 02B06431FC7\r
+       for <notmuch@notmuchmail.org>; Wed, 29 Oct 2014 13:14:11 -0700 (PDT)\r
+Received: by mail-wi0-f175.google.com with SMTP id ex7so2741219wid.14\r
+       for <notmuch@notmuchmail.org>; Wed, 29 Oct 2014 13:14:10 -0700 (PDT)\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+       d=1e100.net; s=20130820;\r
+       h=x-gm-message-state:from:to:cc:subject:in-reply-to:references\r
+       :user-agent:date:message-id:mime-version:content-type\r
+       :content-transfer-encoding;\r
+       bh=3Ybmdmgr6oQVtB19jfX+kqNCZvOl5SFva54kFW337fc=;\r
+       b=jVUK5WGYdXkNRL4R4W+Gak4oicDLULmAfgP11YqIvUIzxZJEkZBrE7R/C4ZwpGGyJa\r
+       LIfkhPQW6UjlsCgbsfogaW5Boc14P/RbbAPWkcSp+D2QY/sE0jkysFHNMKvhpFVP2o71\r
+       C0WKvHldyXS63Pcdsi8G37jYOM5Mi2Ouw9jlIhps1i9Kv+2Jo3KK+RYzJ/4FXMJojm8z\r
+       whDoO2ZF2iReDS6/pbojQDwOjPzRHiIoiTWiMX2xm9KbpsOV6G9JrLLnaaZQO7uRi2y0\r
+       C+iLQkQ3y1S09/RDeE0qsxoYxnrIBvgwcog3YmHEcr5/dtdjo/FYZp3NDtlKy7lzBhUA\r
+       NX8Q==\r
+X-Gm-Message-State:\r
+ ALoCoQmMljJY+DG6IC0DZITT+P91K+Xse2ujXMo2Sx8T9I126KWRB6QSoCEJxDvAJF1Vxoe+ViiK\r
+X-Received: by 10.180.79.38 with SMTP id g6mr14813444wix.42.1414613650477;\r
+       Wed, 29 Oct 2014 13:14:10 -0700 (PDT)\r
+Received: from localhost (dsl-hkibrasgw2-58c36d-48.dhcp.inet.fi.\r
+       [88.195.109.48]) by mx.google.com with ESMTPSA id\r
+       ko10sm6274874wjb.48.2014.10.29.13.14.09 for <multiple recipients>\r
+       (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+       Wed, 29 Oct 2014 13:14:09 -0700 (PDT)\r
+From: Jani Nikula <jani@nikula.org>\r
+To: Tomi Ollila <tomi.ollila@iki.fi>, notmuch@notmuchmail.org,\r
+       david@tethera.net, jrollins@finestructure.net\r
+Subject: Re: [DRAFT PATCH] modified notmuch-emacs-mua\r
+In-Reply-To: <1405026779-29966-1-git-send-email-tomi.ollila@iki.fi>\r
+References: <1405026779-29966-1-git-send-email-tomi.ollila@iki.fi>\r
+User-Agent: Notmuch/0.18.2+148~g4214adf (http://notmuchmail.org) Emacs/24.3.1\r
+       (x86_64-pc-linux-gnu)\r
+Date: Wed, 29 Oct 2014 22:14:07 +0200\r
+Message-ID: <871tpq1vn4.fsf@nikula.org>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=utf-8\r
+Content-Transfer-Encoding: quoted-printable\r
+Cc: tomi.ollila@iki.fi\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Wed, 29 Oct 2014 20:14:20 -0000\r
+\r
+On Fri, 11 Jul 2014, Tomi Ollila <tomi.ollila@iki.fi> wrote:\r
+> Highlights:\r
+>\r
+> * notmuch-emacs-mua without arguments runs (notmuch-hello)\r
+>\r
+> * runs emacs(1) in case emacsclient(1) fails to connect to running emacs\r
+>\r
+> * takes -nw option\r
+>\r
+> * handles mailto:\r
+>\r
+> * --from option when sending non-mailto: way\r
+>\r
+> * -i includes file --body[=3D ]string inserts string\r
+> ---\r
+>  notmuch-emacs-mua | 200 ++++++++++++++++++++++++++++++++++++++++++++++++=\r
+++++++\r
+>  1 file changed, 200 insertions(+)\r
+>  create mode 100755 notmuch-emacs-mua\r
+>\r
+> diff --git a/notmuch-emacs-mua b/notmuch-emacs-mua\r
+> new file mode 100755\r
+> index 0000000..b1696f7\r
+> --- /dev/null\r
+> +++ b/notmuch-emacs-mua\r
+> @@ -0,0 +1,200 @@\r
+> +#!/usr/bin/env bash\r
+> +# -*- mode: shell-script; sh-basic-offset: 4; tab-width: 8 -*-\r
+> +#\r
+> +# notmuch-emacs-mua - start composing a mail on the command line\r
+> +#\r
+> +# Copyright =C2=A9 2014 Jani Nikula\r
+> +#\r
+> +# This program is free software: you can redistribute it and/or modify\r
+> +# it under the terms of the GNU General Public License as published by\r
+> +# the Free Software Foundation, either version 3 of the License, or\r
+> +# (at your option) any later version.\r
+> +#\r
+> +# This program is distributed in the hope that it will be useful,\r
+> +# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+> +# GNU General Public License for more details.\r
+> +#\r
+> +# You should have received a copy of the GNU General Public License\r
+> +# along with this program.  If not, see http://www.gnu.org/licenses/ .\r
+> +#\r
+> +# Authors: Jani Nikula <jani@nikula.org>\r
+> +#          Tomi Ollila <tomi.ollila@iki.fi>\r
+> +#\r
+> +\r
+> +set -eu\r
+> +\r
+> +# "expand" '\' to '\\' & '"' to '\"'\r
+> +escape_optarg ()\r
+> +{\r
+> +    OPTARG=3D${OPTARG//\\/\\\\}; OPTARG=3D${OPTARG//\"/\\\"}\r
+> +}\r
+> +\r
+> +# ditto, in case there is '\n' sequence in the source, otherwise\r
+> +# "expand" only trailing '\'s to '\\'s\r
+> +escape_body_optarg ()\r
+> +{\r
+> +    case ${OPTARG} in\r
+> +    *'\"'*) OPTARG=3D${OPTARG//\\/\\\\} ;;\r
+> +    *'\') OPTARG=3D$( printf %s "${OPTARG}" | sed 's/\(\\*\)$/\1\1/' )\r
+> +    esac\r
+> +    OPTARG=3D${OPTARG//\"/\\\"}\r
+> +}\r
+> +\r
+> +unset ALTERNATE_EDITOR\r
+> +exec_mua ()\r
+> +{\r
+> +    if "${EMACSCLIENT:=3Demacsclient}" --eval t >/dev/null 2>&1\r
+> +    then\r
+> +    emacs=3D$EMACSCLIENT\r
+> +    # close stdout in case no -nw (and no --print)\r
+> +    test -n "$W$X" || exec >/dev/null\r
+> +    else\r
+> +    emacs=3D${EMACS:-emacs}\r
+> +    fi\r
+> +    ${X:-exec} "$emacs" $W --eval "$*"\r
+> +    exit\r
+> +    ${X:-exec "$emacs" $W --eval} "$*"\r
+> +}\r
+> +\r
+> +X=3D\r
+> +W=3D\r
+> +\r
+> +SUBJECT=3D TO=3D CC=3D BCC=3D BODY=3D FROM=3D IB=3D\r
+> +\r
+> +while\r
+> +    # first, handle "long" options which cannot be handled by getopts\r
+> +    case ${1-} in\r
+> +    -nw)\r
+> +        W=3D-nw\r
+> +        shift\r
+> +        continue\r
+> +        ;;\r
+\r
+How about generalizing this into letting the user pass arguments after a\r
+"--" separator to emacs(client)? Would that work?\r
+\r
+Alternatively, why support -nw which is neither part of the mutt\r
+interface I was originally aiming at emulating nor conforms to notmuch\r
+style? Just go with --nw or the more verbose --no-window-system (which\r
+is also compatible with emacs).\r
+\r
+> +    mailto:*)\r
+> +        oIFS=3D$IFS; IFS=3D; OPTARG=3D"$*" IFS=3D$oIFS\r
+> +        escape_optarg\r
+> +        exec_mua "(progn (require 'notmuch) (browse-url-mail \"$OPTARG\"))"\r
+> +        exit\r
+> +    esac\r
+\r
+Why does mailto: need to be handled here? I think you could either make\r
+the usage have a special mailto: case where you only have mailto: at $1,\r
+or you handle mailto: as a positional parameter at the end.\r
+\r
+With these, you could drop this one extra case here, and go back to the\r
+more natural "while getopts" argument parsing loop.\r
+\r
+> +\r
+> +    getopts :s:c:b:i:h opt\r
+> +do\r
+> +    # Handle errors and long options.\r
+> +    case ${opt} in\r
+> +    :)\r
+> +        echo "$0: short option '-${OPTARG}' requires an argument." >&2\r
+> +        exit 1\r
+> +        ;;\r
+> +    \?)\r
+> +        opt=3D$1\r
+> +        if [[ ${OPTARG} !=3D '-' ]]; then\r
+> +            echo "$0: unknown short option '-${OPTARG}'." >&2\r
+> +            exit 1\r
+> +        fi\r
+> +\r
+> +        case ${opt} in\r
+> +            # Long options with arguments.\r
+> +            --subject=3D*|--to=3D*|--cc=3D*|--bcc=3D*|--body=3D*|--from=3D*)\r
+> +                OPTARG=3D${opt#--*=3D}\r
+> +                opt=3D${opt%%=3D*}\r
+> +                ;;\r
+> +            # Long options with argument in next arg.\r
+> +            --subject  |--to  |--cc  |--bcc  |--body  |--from  )\r
+\r
+This may be git-ish, but I don't think we should support this in\r
+notmuch.\r
+\r
+> +                if [[ $# < 2 ]]; then\r
+> +                    echo "$0: option '${opt}' requires an argument." >&2\r
+> +                    exit 1\r
+> +                fi\r
+> +                OPTARG=3D$2\r
+> +                OPTIND=3D$((OPTIND + 1))\r
+> +                ;;\r
+> +            # Long options without arguments.\r
+> +            --help|--nw|--print)\r
+> +                ;;\r
+> +            *)\r
+> +                echo "$0: unknown long option '${opt}', or argument mismatch." >&2\r
+> +                exit 1\r
+> +                ;;\r
+> +        esac\r
+> +        # getopts does not do this for what it considers errors.\r
+> +        OPTIND=3D$((OPTIND + 1))\r
+> +        ;;\r
+> +    esac\r
+> +\r
+> +    case ${opt} in\r
+> +    --help|h)\r
+> +        exec man notmuch-emacs-mua\r
+> +        ;;\r
+> +    --from)\r
+> +        escape_optarg\r
+> +        FROM=3D${OPTARG}\r
+> +        ;;\r
+> +    --subject|s)\r
+> +        escape_optarg\r
+> +        SUBJECT=3D${SUBJECT:+$SUBJECT }${OPTARG}\r
+> +        ;;\r
+> +    --to)\r
+> +        escape_optarg\r
+> +        TO=3D${TO:+$TO, }${OPTARG}\r
+> +        ;;\r
+> +    --cc|c)\r
+> +        escape_optarg\r
+> +        CC=3D${CC:+$CC, }${OPTARG}\r
+> +        ;;\r
+> +    --bcc|b)\r
+> +        escape_optarg\r
+> +        BCC=3D${BCC:+$BCC, }${OPTARG}\r
+> +        ;;\r
+> +    i)\r
+> +        escape_optarg\r
+> +        if [[ ! -f ${OPTARG} ]]; then\r
+> +            echo "$0: '${OPTARG}': no such file" >&2\r
+> +            exit 1\r
+> +        fi\r
+> +        IB=3D${IB}$'\n'"  (insert-file \"${OPTARG}\")"\r
+\r
+This needs the (cd \"${PWD}\") bit because --body given here may be\r
+relative to the script, while emacs likely has a totally different cwd.\r
+\r
+> +        IB=3D${IB}$'\n'"  (if /=3D (point) (line-beginning-position) (inser=\r
+t \"\\n\"))"\r
+> +        ;;\r
+> +    --body)\r
+> +        escape_body_optarg\r
+> +        IB=3D${IB}$'\n'"  (insert \"${OPTARG}\\n\")"\r
+\r
+Why should --body and -i be different?\r
+\r
+> +        ;;\r
+> +    --nw)\r
+> +        W=3D-nw\r
+> +        ;;\r
+> +    --print)\r
+> +        X=3Decho\r
+> +        ;;\r
+> +    *)\r
+> +        # We should never end up here.\r
+> +        echo "$0: internal error (option '${opt}')." >&2\r
+> +        exit 1\r
+> +        ;;\r
+> +    esac\r
+> +\r
+> +    shift $((OPTIND - 1))\r
+> +    OPTIND=3D1\r
+> +done\r
+> +\r
+> +# Positional parameters.\r
+> +for arg; do\r
+> +    arg=3D${arg//\\/\\\\}; arg=3D${arg//\"/\\\"}\r
+> +    TO=3D${TO:+$TO, }${arg}\r
+> +done\r
+> +\r
+> +NL=3D$'\n'\r
+> +ELISP=3D"\\r
+> +${CC:+$NL  (message-goto-cc) (insert \"$CC\")}\\r
+> +${BCC:+$NL  (message-goto-bcc) (insert \"$BCC\")}\\r
+> +${IB:+$NL  (message-goto-body)$IB}"\r
+> +\r
+> +if [[ $TO =3D=3D '' && $SUBJECT =3D=3D '' && $ELISP =3D=3D '' ]]\r
+> +then\r
+> +    exec_mua "(progn (require 'notmuch) (notmuch-hello))"\r
+> +else\r
+> +    [[ $FROM !=3D '' ]] && OH=3D"(list (cons 'From \"$FROM\"))" || OH=3D=\r
+nil\r
+> +    [[ $TO !=3D '' ]] && TO=3D\"$TO\" || TO=3Dnil\r
+> +    [[ $SUBJECT !=3D '' ]] && SUBJECT=3D\"$SUBJECT\" || SUBJECT=3Dnil\r
+> +    exec_mua "$NL(progn (require 'notmuch)\r
+> +  (notmuch-mua-mail $TO $SUBJECT\r
+> +    $OH nil (notmuch-mua-get-switch-function))\\r
+> +$ELISP$NL  (set-buffer-modified-p nil) (message-goto-to))"\r
+\r
+I think the newlines with $NL hurt readability in the script more than\r
+they help readability in the output... which is generally interpreted by\r
+emacs which doesn't really care about the newlines! ;)\r
+\r
+BR,\r
+Jani.\r
+\r
+\r
+> +fi\r
+> --=20\r
+> 1.9.0\r