[PATCH] emacs: add stash support for git send-email command line
Jani Nikula
jani at nikula.org
Wed Oct 29 13:45:05 PDT 2014
On Wed, 29 Oct 2014, David Edmondson <dme at dme.org> wrote:
> On Tue, Oct 28 2014, Jani Nikula wrote:
>> Stash From/To/Cc as --to/--to/--cc, respectively, and Message-Id as
>> --in-reply-to, suitable for pasting to git send-email command line.
>> ---
>> emacs/notmuch-show.el | 25 +++++++++++++++++++++++++
>> 1 file changed, 25 insertions(+)
>>
>> diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
>> index a9974826e824..328c93ba0584 100644
>> --- a/emacs/notmuch-show.el
>> +++ b/emacs/notmuch-show.el
>> @@ -1274,6 +1274,7 @@ reset based on the original query."
>> (define-key map "t" 'notmuch-show-stash-to)
>> (define-key map "l" 'notmuch-show-stash-mlarchive-link)
>> (define-key map "L" 'notmuch-show-stash-mlarchive-link-and-go)
>> + (define-key map "G" 'notmuch-show-stash-git-send-email)
>> (define-key map "?" 'notmuch-subkeymap-help)
>> map)
>> "Submap for stash commands")
>> @@ -2125,6 +2126,30 @@ the user (see `notmuch-show-stash-mlarchive-link-alist')."
>> (notmuch-show-stash-mlarchive-link mla)
>> (browse-url (current-kill 0 t)))
>>
>> +(defun notmuch-show-stash-git-helper (addresses prefix)
>> + "Escape, trim, and add PREFIX to each address in list of ADDRESSES."
>> + (when addresses
>> + (mapconcat (lambda (x)
>> + (concat prefix "\""
>> + ;; escape double-quotes
>> + (replace-regexp-in-string
>> + "\"" "\\\\\""
>> + ;; trim leading and trailing spaces
>> + (replace-regexp-in-string
>> + "\\(^ *\\| *$\\)" ""
>> + x)) "\" "))
>> + addresses "")))
>
> This doesn't seem quite right. You leave a spurious trailing
> space. Maybe that's because you need it in the following function to
> separate the from/to/cc elements? That kind of interaction between the
> two functions is icky.
Agreed, thanks for pointing it out.
> There's no need to test `addresses' at the head of the list - mapconcat
> is fine with nil.
>
> How about:
>
> (defun notmuch-show-stash-git-helper (addresses prefix)
> "Escape, trim, and add PREFIX to each address in list of ADDRESSES."
> (mapconcat (lambda (x)
> (concat prefix "\""
> ;; escape double-quotes
> (replace-regexp-in-string
> "\"" "\\\\\""
> ;; trim leading and trailing spaces
> (replace-regexp-in-string
> "\\(^ *\\| *$\\)" ""
> x)) "\""))
> addresses " "))
>
> This would remove the trailing space, so...
>
>> +
>> +(defun notmuch-show-stash-git-send-email ()
>> + "Copy From/To/Cc/Message-Id of current message to kill-ring in a form suitable for pasting to git send-email command line."
>> + (interactive)
>> + (notmuch-common-do-stash
>> + (concat
>> + (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-from)) "--to=")
>> + (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-to)) "--to=")
>> + (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-cc)) "--cc=")
>> + (concat "--in-reply-to=\"" (notmuch-show-get-message-id t) "\""))))
>
> ...this would have to use something like:
>
> (mapconcat 'identity (list
> (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-from)) "--to=")
> (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-to)) "--to=")
> (notmuch-show-stash-git-helper (message-tokenize-header (notmuch-show-get-cc)) "--cc=")
> (concat "--in-reply-to=\"" (notmuch-show-get-message-id t) "\""))
> "")
>
> to separate the chunks (untested).
The last "" has to be " " to separate the elements, but this brings
another small wrinkle: if one of the headers is missing, typically Cc:,
it will be nil in the list, and mapconcat adds spaces both sides of
that, i.e. double space. Any ideas how to fix that?
> Could you avoid the double-quote quoting by using single quotes inside
> the strings?
The addresses may contain both single quotes and double quotes, so
escaping either of them seems like the only option.
> Do the leading and trailing spaces really matter?
Does aesthetically displeasing count? Because message-tokenize-header
splits using "," but headers typically have ", " between addresses, the
end result will practically always have --to=" user at example.com" without
the trimming.
Thanks for the helpful review; I'm not much of a lisp coder...
BR,
Jani.
>
> (Domo: Look, I managed to write 'separate', twice!)
>
>> +
>> ;; Interactive part functions and their helpers
>>
>> (defun notmuch-show-generate-part-buffer (message-id nth)
>> --
>> 2.1.1
>>
>> _______________________________________________
>> notmuch mailing list
>> notmuch at notmuchmail.org
>> http://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list