It works as described. But IMHO it would be better to prompt the user to
enter the location where he wants to save the attachment(s). This path
could be taken if s:notmuch_attachment_tmpdir_default is set to empty.
Or implement a different function for "save to".
On Thu, 2 Oct 2014 00:48:52 -0700, Ian Main <imain@stemwinder.org> wrote:
> This patch changes how the notmuch vim client supports attachments:
>
> - For each attachment an 'Attachment <number>: <filename>' is added
> to the header
> - You can then use 'e' to extract the attachment under the cursor
> or use it elsewhere to extract all attachments (the prior behavior)
> - You can use 'v' to 'view' the attachment using xdg-open by default.
>
> Ian
> ---
> vim/notmuch.txt | 8 +++++++-
> vim/notmuch.vim | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 65 insertions(+), 3 deletions(-)
>
> diff --git a/vim/notmuch.txt b/vim/notmuch.txt
> index 4374102..838a904 100644
> --- a/vim/notmuch.txt
> +++ b/vim/notmuch.txt
> @@ -72,6 +72,9 @@ q Quit view
> A Archive (-inbox -unread)
> I Mark as read (-unread)
> t Tag (prompted)
> +e Extract attachment on the current 'Attachment' line or all
> + attachments if the cursor is elsewhere.
> +v View attachment on the current 'Attachment' line.
> s Search
> p Save patches
> r Reply
> @@ -148,6 +151,9 @@ You can also configure your externail mail reader and sendemail program:
> >
> let g:notmuch_reader = 'mutt -f %s'
> let g:notmuch_sendmail = 'sendmail'
> -<
> +
> +You can also configure what probram is used to view attachments:
> +
> + let g:notmuch_view_attachment = 'xdg-open'
>
> vim:tw=78:ts=8:noet:ft=help:
> diff --git a/vim/notmuch.vim b/vim/notmuch.vim
> index 331e930..a5830b5 100644
> --- a/vim/notmuch.vim
> +++ b/vim/notmuch.vim
> @@ -35,6 +35,7 @@ let g:notmuch_show_maps = {
> \ 't': 'show_tag("")',
> \ 'o': 'show_open_msg()',
> \ 'e': 'show_extract_msg()',
> + \ 'v': 'show_view_attachment()',
> \ 's': 'show_save_msg()',
> \ 'p': 'show_save_patches()',
> \ 'r': 'show_reply()',
> @@ -58,6 +59,8 @@ let s:notmuch_date_format_default = '%d.%m.%y'
> let s:notmuch_datetime_format_default = '%d.%m.%y %H:%M:%S'
> let s:notmuch_reader_default = 'mutt -f %s'
> let s:notmuch_sendmail_default = 'sendmail'
> +let s:notmuch_view_attachment_default = 'xdg-open'
> +let s:notmuch_attachment_tmpdir_default = '~/.notmuch/tmp'
> let s:notmuch_folders_count_threads_default = 0
>
> function! s:new_file_buffer(type, fname)
> @@ -147,13 +150,53 @@ function! s:show_info()
> ruby vim_puts get_message.inspect
> endfunction
>
> +function! s:show_view_attachment()
> + let line = getline(".")
> +ruby << EOF
> + m = get_message
> + line = VIM::evaluate('line')
> +
> + match = line.match(/^Attachment (\d*):/)
> + if match and match.length == 2
> + a = m.mail.attachments[match[1].to_i - 1]
> + tmpdir = VIM::evaluate('g:notmuch_attachment_tmpdir')
> + tmpdir = File.expand_path(tmpdir)
> + Dir.mkdir(tmpdir) unless Dir.exists?(tmpdir)
> + filename = File.expand_path("#{tmpdir}/#{a.filename}")
> + vim_puts "Viewing attachment #{filename}"
> + File.open(filename, 'w') do |f|
> + f.write a.body.decoded
> + cmd = VIM::evaluate('g:notmuch_view_attachment')
> + system(cmd, filename)
> + end
> + else
> + vim_puts "No attachment on this line."
> + end
> +EOF
> +endfunction
> +
> function! s:show_extract_msg()
> + let line = getline(".")
> ruby << EOF
> m = get_message
> - m.mail.attachments.each do |a|
> + line = VIM::evaluate('line')
> +
> + # If the user is on a line that has an 'Attachment'
> + # line, we just extract the one attachment.
> + match = line.match(/^Attachment (\d*):/)
> + if match and match.length == 2
> + a = m.mail.attachments[match[1].to_i - 1]
> File.open(a.filename, 'w') do |f|
> f.write a.body.decoded
> - print "Extracted '#{a.filename}'"
> + vim_puts "Extracted #{a.filename}"
> + end
> + else
> + # Extract them all..
> + m.mail.attachments.each do |a|
> + File.open(a.filename, 'w') do |f|
> + f.write a.body.decoded
> + vim_puts "Extracted #{a.filename}"
> + end
> end
> end
> EOF
> @@ -326,6 +369,11 @@ ruby << EOF
> b << "To: %s" % msg['to']
> b << "Cc: %s" % msg['cc']
> b << "Date: %s" % msg['date']
> + cnt = 0
> + nm_m.mail.attachments.each do |a|
> + cnt += 1
> + b << "Attachment %d: %s" % [cnt, a.filename]
> + end
> nm_m.body_start = b.count
> b << "--- %s ---" % part.mime_type
> part.convert.each_line do |l|
> @@ -420,6 +468,14 @@ function! s:set_defaults()
> endif
> endif
>
> + if !exists('g:notmuch_attachment_tmpdir')
> + let g:notmuch_attachment_tmpdir = s:notmuch_attachment_tmpdir_default
> + endif
> +
> + if !exists('g:notmuch_view_attachment')
> + let g:notmuch_view_attachment = s:notmuch_view_attachment_default
> + endif
> +
> if !exists('g:notmuch_folders_count_threads')
> if exists('g:notmuch_rb_count_threads')
> let g:notmuch_count_threads = g:notmuch_rb_count_threads
> --
> 1.9.3
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch