From: Jani Nikula Date: Wed, 19 Mar 2014 21:54:15 +0000 (+0200) Subject: Re: [PATCH] cli: add a tool for starting new message in the emacs ui X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=0781cb14de71db694f3c51cbc8ee5faee7e8e92b;p=notmuch-archives.git Re: [PATCH] cli: add a tool for starting new message in the emacs ui --- diff --git a/cc/4b8dd45acade351d2e8f00b15762e56dd991ee b/cc/4b8dd45acade351d2e8f00b15762e56dd991ee new file mode 100644 index 000000000..5c0652719 --- /dev/null +++ b/cc/4b8dd45acade351d2e8f00b15762e56dd991ee @@ -0,0 +1,345 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id 1628C431FAF + for ; Wed, 19 Mar 2014 14:54:30 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: -0.7 +X-Spam-Level: +X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id b546+2belAIF for ; + Wed, 19 Mar 2014 14:54:21 -0700 (PDT) +Received: from mail-la0-f53.google.com (mail-la0-f53.google.com + [209.85.215.53]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) + (No client certificate requested) + by olra.theworths.org (Postfix) with ESMTPS id 65BD4431FAE + for ; Wed, 19 Mar 2014 14:54:21 -0700 (PDT) +Received: by mail-la0-f53.google.com with SMTP id b8so6288937lan.26 + for ; Wed, 19 Mar 2014 14:54:19 -0700 (PDT) +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20130820; + h=x-gm-message-state:from:to:subject:in-reply-to:references + :user-agent:date:message-id:mime-version:content-type + :content-transfer-encoding; + bh=5f1TvgYuiL9m3PlxRQ7+DlgiPangqPmJN7lxenFFImM=; + b=R4YU8esDyw0x/Ab1+zLSKdO9+c7ZHUODWgA0kzDW8llx1ZG8JUQ6FkMR+gvTrtbtUY + 3DhDYmejcp2lzxwAY+iD4GHaOxwI9/i24WfrV1ctADpc3VIj6+OdylV7mQrQctXeQBKS + is+LftTb6IlqKimGTMjDMuafUej7VknwuAdGG2yn2A05Pbl6XKlaFQqmxldRjY82ZwGb + sExQlItANE0NFnGXXzjA/hTWF3lc09t77rQtDVIEjDBcxPw6eh39B1GmV2P3NcbEuHMy + oNDPtm2Yyrs+NLFAGTgkgQgdAKTLEmd+wbo9GLOdp1pqEva9flutiXQv25brn7fK3DBA + uaGw== +X-Gm-Message-State: + ALoCoQm4HWKiVXGMk0uOeHHEqHDxAportEC0yCUYnxLq/ucBcMHkSHrv1cu6ZawNF4+LTcpW+w+/ +X-Received: by 10.112.137.5 with SMTP id qe5mr26138470lbb.16.1395266058612; + Wed, 19 Mar 2014 14:54:18 -0700 (PDT) +Received: from localhost (dsl-hkibrasgw2-58c36f-91.dhcp.inet.fi. + [88.195.111.91]) + by mx.google.com with ESMTPSA id rd5sm17906775lbb.0.2014.03.19.14.54.16 + for + (version=TLSv1.2 cipher=RC4-SHA bits=128/128); + Wed, 19 Mar 2014 14:54:17 -0700 (PDT) +From: Jani Nikula +To: Tomi Ollila , notmuch@notmuchmail.org +Subject: Re: [PATCH] cli: add a tool for starting new message in the emacs ui +In-Reply-To: +References: <1395257153-29764-1-git-send-email-jani@nikula.org> + +User-Agent: Notmuch/0.17+142~g30045abd801f (http://notmuchmail.org) + Emacs/24.3.1 (x86_64-pc-linux-gnu) +Date: Wed, 19 Mar 2014 23:54:15 +0200 +Message-ID: <877g7pn9bs.fsf@nikula.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Wed, 19 Mar 2014 21:54:30 -0000 + +On Wed, 19 Mar 2014, Tomi Ollila wrote: +> On Wed, Mar 19 2014, Jani Nikula wrote: +> +>> Add a tool to start composing an email in the Notmuch Emacs UI with +>> the specified subject, recipients, and message body. +>> +>> --- +>> +>> I need something like this to script some mails, particularly with the +>> mutt compatible options, but I also think notmuch must have long +>> options. I then got a little carried away with figuring out how to +>> support both. I think it turned out pretty neat, except due to some +>> subtlety it only works with bash. +>> +>> I didn't integrate this in the man build or install or anything, +>> because I wanted to get feedback first on whether we want to have this +>> at all. Or if it should live in contrib or something. +>> +>> BR, +>> Jani. +>> --- +> +> Quick glance to the code and some thoughts. + +Thanks! + +> +>> doc/man1/notmuch-emacs-mua.rst | 50 ++++++++++++++++++ +>> notmuch-emacs-mua | 113 ++++++++++++++++++++++++++++++++++= ++++++++ +>> 2 files changed, 163 insertions(+) +>> create mode 100644 doc/man1/notmuch-emacs-mua.rst +>> create mode 100755 notmuch-emacs-mua +>> +>> diff --git a/doc/man1/notmuch-emacs-mua.rst b/doc/man1/notmuch-emacs-mua= +.rst +>> new file mode 100644 +>> index 000000000000..6e63818492fb +>> --- /dev/null +>> +++ b/doc/man1/notmuch-emacs-mua.rst +>> @@ -0,0 +1,50 @@ +>> +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +>> +notmuch-emacs-mua +>> +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +>> + +>> +SYNOPSIS +>> +=3D=3D=3D=3D=3D=3D=3D=3D +>> + +>> +**notmuch-emacs-mua** [options ...] [ ...] +>> + +>> +DESCRIPTION +>> +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +>> + +>> +Start composing an email in the Notmuch Emacs UI with the specified +>> +subject, recipients, and message body. +>> + +>> +For **notmuch-emacs-mua** to work, you need **emacsclient** and an +>> +already running Emacs with a server. +>> + +>> +Supported options for **notmuch-emacs-mua** include +>> + +>> + ``-h, --help`` +>> + Display help. +>> + +>> + ``-s, --subject=3D``\ +>> + Specify the subject of the message. +>> + +>> + ``--to=3D``\ +>> + Specify a recipient (To). +>> + +>> + ``-c, --cc=3D``\ +>> + Specify a carbon-copy (Cc) recipient. +>> + +>> + ``-b, --bcc=3D``\ +>> + Specify a blind-carbon-copy (Bcc) recipient. +>> + +>> + ``-i, --body=3D``\ +>> + Specify a file to include into the body of the message. +>> + +>> + ``--print`` +>> + Output the resulting elisp to stdout instead of evaluating it. +>> + +>> +The supported positional parameters and short options are a compatible +>> +subset of the **mutt** MUA command-line options. +>> + +>> +Options may be specified multiple times. +>> + +>> +SEE ALSO +>> +=3D=3D=3D=3D=3D=3D=3D=3D +>> + +>> +**notmuch(1)**, **emacsclient(1)**, **mutt(1)** +> +> It would be convenient to the user to have the manual embedded in +> the script in case no args are given or so (or that is convenient +> to me ;) and no namual page at all... + +If this is to become part of notmuch, I think a separate man page is in +order. Otherwise, agreed (and even had that in an earlier version). + +> +>> diff --git a/notmuch-emacs-mua b/notmuch-emacs-mua +>> new file mode 100755 +>> index 000000000000..a482fe1a8eca +>> --- /dev/null +>> +++ b/notmuch-emacs-mua +>> @@ -0,0 +1,113 @@ +>> +#!/bin/bash +> +> #!/usr/bin/env bash + +Agreed. + +> +>> +# +>> +# notmuch-emacs-mua - start composing a mail on the command line +>> +# +>> +# Copyright =C2=A9 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 +>> +# +>> + +>> +set -e +> +> set -eu would be nice IMO... +> +> ... then initialize all vars to empty strings, like PRINT_ONLY=3D +> ... and in cases not possible syntax ${1-} can be used. + +Agreed. + +> +>> + +>> +# The crux of it all: construct an elisp progn and eval it. +>> +ELISP=3D"(progn (notmuch-mua-new-mail)" +> +> ELISP=3D"(progn (require 'notmuch) (notmuch-mua-new-mail)" + +Right. + +> +>> + +>> +while 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=3D$1 +>> + if [ "${OPTARG}" !=3D "-" ]; then +>> + echo "$0: unknown short option -${OPTARG}." >&2 +>> + exit 1 +>> + fi +>> + +>> + case "${opt}" in +>> + # Long options with arguments. +>> + --subject=3D*|--to=3D*|--cc=3D*|--bcc=3D*|--body=3D*) +>> + OPTARG=3D${opt#--*=3D} +>> + opt=3D${opt%%=3D*} +>> + ;; +>> + # Long options without arguments. +>> + --help|--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=3D$((OPTIND + 1)) +>> + ;; +>> + esac +>> + +>> + case "${opt}" in +>> + --help|h) +>> + exec man notmuch-search +>> + ;; +>> + --subject|s) +>> + ELISP=3D"${ELISP} (message-goto-subject) (insert \"${OPTARG}\")" +>> + ;; +>> + --to) +>> + ELISP=3D"${ELISP} (message-goto-to) (insert \"${OPTARG}, \")" +>> + ;; +>> + --cc|c) +>> + ELISP=3D"${ELISP} (message-goto-cc) (insert \"${OPTARG}, \")" +>> + ;; +>> + --bcc|b) +>> + ELISP=3D"${ELISP} (message-goto-bcc) (insert \"${OPTARG}, \")" +>> + ;; +>> + --body|i) +>> + ELISP=3D"${ELISP} (message-goto-body) (cd \"${PWD}\") (insert-file= + \"${OPTARG}\")" +>> + ;; +>> + --print) +>> + PRINT_ONLY=3D1 +>> + ;; +>> + *) +>> + # We should never end up here. +>> + echo "$0: internal error (option ${opt})." >&2 +>> + exit 1 +>> + ;; +>> + esac +>> + +>> + shift $((OPTIND - 1)) +>> + OPTIND=3D1 +>> +done +>> + +>> +# Positional parameters. +>> +while [ $# -gt 0 ]; do +>> + ELISP=3D"${ELISP} (message-goto-to) (insert \"${1}, \")" +>> + shift +>> +done +> +> for arg; do + +for arg in $@; ? + +> ELISP=3D"${ELISP} (message-goto-to) (insert \"${arg}, \")" +> done +> +> I tried to address Austin's comment on IRC with=20 +> printf -v qarg %q "$arg" -- that has problem if there is whitespace +> in arg. maybe printf -v qarg '%q ' "$arg" -- then there is always one +> trailing ws (and spaces are always prefixed w/ \ -- (insert "foo\ bar") +> just makes the ' ' disappear (which is not good...). +> +> maybe arg=3D${arg//\\/\\\\}; arg=3D${arg//"/\\"};=20 +> +> ${parameter/pattern/string} -- Pattern substition in bash manual. + +I'm inclined to go with "don't do that then" ;) + +> +> +>> +# End progn. +>> +ELISP=3D"${ELISP})" +>> + +>> +if [ -n "$PRINT_ONLY" ]; then +>> + echo ${ELISP} +>> + exit 0 +>> +fi +>> + +>> +# Evaluate the progn. +>> +emacsclient --eval "${ELISP}" &>/dev/null +> +> emacsclient --eval "${ELISP}" >/dev/null 2>&1 +> +> (why do you want to redirect stdout & stderr to devnull ?) + +Okay, maybe it could be just stdout (which will be the eval result, in +this case nil). + +> +>> +if [ $? -ne 0 ]; then +>> + echo "$0: emacsclient failed" >&2 +>> + exit 1 +>> +fi +>> --=20 +>> 1.9.0