Tomi Ollila wrote: > On Fri, Oct 24 2014, Ian Main <imain@stemwinder.org> wrote: > > > Change how the notmuch vim client supports attachments: > > > > - For each message part a 'Part <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/part using xdg-open by > > default. > > - If the message is 'text/html' we include a 'Part:' for the body of > > the message so you can easily view it in a web browser if you so > > choose. > > > > Ian > > --- > > > > - Fixed commit message > > - Fixed documentation > > > > vim/notmuch.txt | 8 +++++- > > vim/notmuch.vim | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- > > 2 files changed, 89 insertions(+), 3 deletions(-) > > > > diff --git a/vim/notmuch.txt b/vim/notmuch.txt > > index 4374102..d5e1ad2 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 'Part' line or all > > This and the following patch use spaces instead of tab in the line above > (and following patch few lines below) -- the indentation looked weird and > that got me to look more. > > I was going to look more of this but run out of time. I'll look the > this through after someone else who uses vim has tested these patched > and reported their experiences. > > Tomi Ah, good catch. Thanks Tomi. I generally run with expandtab which makes vim use spaces instead of tabs. I see in the .vim src file it's set to turn that off but not in the docs. I'll check it myself too. Ian > > + attachments if the cursor is elsewhere. > > +<enter> View attachment on the current 'Part' 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 cad9517..1466e50 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()', > > + \ '<Enter>': '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 > > let s:notmuch_compose_start_insert_default = 1 > > > > @@ -152,13 +155,72 @@ 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(/^Part (\d*):/) > > + if match and match.length == 2 > > + # Set up the tmpdir > > + tmpdir = VIM::evaluate('g:notmuch_attachment_tmpdir') > > + tmpdir = File.expand_path(tmpdir) > > + Dir.mkdir(tmpdir) unless Dir.exists?(tmpdir) > > + > > + p = m.mail.parts[match[1].to_i - 1] > > + if p == nil > > + # Not a multipart message, use the message itself. > > + p = m.mail > > + end > > + if p.filename and p.filename.length > 0 > > + filename = p.filename > > + else > > + suffix = '' > > + if p.mime_type == 'text/html' > > + suffix = '.html' > > + end > > + filename = "part-#{match[1]}#{suffix}" > > + end > > + > > + # Sanitize just in case.. > > + filename.gsub!(/[^0-9A-Za-z.\-]/, '_') > > + > > + fullpath = File.expand_path("#{tmpdir}/#{filename}") > > + vim_puts "Viewing attachment #{fullpath}" > > + File.open(fullpath, 'w') do |f| > > + f.write p.body.decoded > > + cmd = VIM::evaluate('g:notmuch_view_attachment') > > + system(cmd, fullpath) > > + 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 'Part' > > + # line, we just extract the one attachment. > > + match = line.match(/^Part (\d*):/) > > + if match and match.length == 2 > > + a = m.mail.parts[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 > > @@ -331,6 +393,16 @@ ruby << EOF > > b << "To: %s" % msg['to'] > > b << "Cc: %s" % msg['cc'] > > b << "Date: %s" % msg['date'] > > + cnt = 0 > > + m.parts.each do |p| > > + cnt += 1 > > + b << "Part %d: %s (%s)" % [cnt, p.mime_type, p.filename] > > + end > > + # Add a special case for text/html messages. Here we show the > > + # only 'part' so that we can view it in a web browser if we want. > > + if m.parts.length == 0 and part.mime_type == 'text/html' > > + b << "Part 1: text/html" > > + end > > nm_m.body_start = b.count > > b << "--- %s ---" % part.mime_type > > part.convert.each_line do |l| > > @@ -425,6 +497,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