From 6d7d5ed71a1092943c8a36ab9cd2f3b77609f500 Mon Sep 17 00:00:00 2001 From: Tomi Ollila Date: Wed, 19 Mar 2014 23:24:02 +0200 Subject: [PATCH] Re: [PATCH] cli: add a tool for starting new message in the emacs ui --- 8c/cffc17ece34cddc8f45bb37d0760b44218bf70 | 297 ++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 8c/cffc17ece34cddc8f45bb37d0760b44218bf70 diff --git a/8c/cffc17ece34cddc8f45bb37d0760b44218bf70 b/8c/cffc17ece34cddc8f45bb37d0760b44218bf70 new file mode 100644 index 000000000..0c8c7fb53 --- /dev/null +++ b/8c/cffc17ece34cddc8f45bb37d0760b44218bf70 @@ -0,0 +1,297 @@ +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 5A505431FBF + for ; Wed, 19 Mar 2014 14:24:19 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] + 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 5InZNWLWmo9y for ; + Wed, 19 Mar 2014 14:24:10 -0700 (PDT) +Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34]) + by olra.theworths.org (Postfix) with ESMTP id B1BDE431FAE + for ; Wed, 19 Mar 2014 14:24:09 -0700 (PDT) +Received: from guru.guru-group.fi (localhost [IPv6:::1]) + by guru.guru-group.fi (Postfix) with ESMTP id 0C38810009D; + Wed, 19 Mar 2014 23:24:03 +0200 (EET) +From: Tomi Ollila +To: Jani Nikula , notmuch@notmuchmail.org +Subject: Re: [PATCH] cli: add a tool for starting new message in the emacs ui +In-Reply-To: <1395257153-29764-1-git-send-email-jani@nikula.org> +References: <1395257153-29764-1-git-send-email-jani@nikula.org> +User-Agent: Notmuch/0.17+155~g3416ef5 (http://notmuchmail.org) Emacs/24.3.1 + (x86_64-unknown-linux-gnu) +X-Face: HhBM'cA~ +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:24:19 -0000 + +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. + +> 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... + +> 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 + +> +# +> +# 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. + +> + +> +# 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)" + +> + +> +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 + 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. + + +> +# 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 ?) + +> +if [ $? -ne 0 ]; then +> + echo "$0: emacsclient failed" >&2 +> + exit 1 +> +fi +> --=20 +> 1.9.0 -- 2.26.2