From: Tomi Ollila <tomi.ollila@iki.fi>
To: Ian Main <imain@stemwinder.org>, notmuch@notmuchmail.org
Subject: Re: [PATCH v4 1/2] VIM: Add better attachment support
Date: Sat, 25 Oct 2014 13:41:40 +0300 [thread overview]
Message-ID: <m2vbn8mnx7.fsf@guru.guru-group.fi> (raw)
In-Reply-To: <1414168720-1574-1-git-send-email-imain@stemwinder.org>
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
> + 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
next prev parent reply other threads:[~2014-10-25 10:42 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-24 16:38 [PATCH v4 1/2] VIM: Add better attachment support Ian Main
2014-10-24 16:38 ` [PATCH v4 2/2] VIM: Add URI handling Ian Main
2014-10-25 10:41 ` Tomi Ollila [this message]
2014-10-27 18:35 ` [PATCH v4 1/2] VIM: Add better attachment support Ian Main
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m2vbn8mnx7.fsf@guru.guru-group.fi \
--to=tomi.ollila@iki.fi \
--cc=imain@stemwinder.org \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).