On Wed, 29 Oct 2014, David Edmondson <d...@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=" u...@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@notmuchmail.org
>> http://notmuchmail.org/mailman/listinfo/notmuch
_______________________________________________
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to