* Status of Vim client
@ 2016-09-29 15:21 J. Lewis Muir
2016-09-29 17:52 ` Lucas Hoffmann
` (2 more replies)
0 siblings, 3 replies; 28+ messages in thread
From: J. Lewis Muir @ 2016-09-29 15:21 UTC (permalink / raw)
To: notmuch
Hello, Notmuchers!
What is the status of the Vim client? The last commit to
vim/notmuch.vim was over a year and a half ago (2015-01-23).
I'm also aware of two Vim clients on GitHub:
* https://github.com/felipec/notmuch-vim (last commit: 2014-05-22)
* https://github.com/imain/notmuch-vim (last commit: 2015-08-24)
So, are the clients really stable, or are they rotting because nobody
uses them? My hope is the former, but I suspect the latter. Are most
of the Vim people just using Mutt or NeoMutt?
Thanks!
Lewis
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-09-29 15:21 Status of Vim client J. Lewis Muir
@ 2016-09-29 17:52 ` Lucas Hoffmann
2016-09-29 18:52 ` David Bremner
2016-10-08 0:08 ` Nick Howell
2 siblings, 0 replies; 28+ messages in thread
From: Lucas Hoffmann @ 2016-09-29 17:52 UTC (permalink / raw)
To: notmuch
[-- Attachment #1: Type: text/plain, Size: 185 bytes --]
Quoting J. Lewis Muir (2016-09-29 17:21:16)
> Are most of the Vim people just using Mutt or NeoMutt?
At least one of them Vim people is using alot :)
https://github.com/pazz/alot
[-- Attachment #2: signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
-----BEGIN PGP SIGNATURE-----
iQEcBAABCAAGBQJX7VTKAAoJEGC3H8cAGkGhOmAH/114almFvAwzrILo/RUembA9
J5+KKtdyhqImKn6tMYC6KvIs2JO85j69PnJnmOfgcpn+SnLjNThE+SYGO4dAZY5c
ntpYXynT1I2Q7ppKdGfbBKAp54WZs0J4swgNyODcJwdTG0ymFpQvoXpVIh/Jgleo
IAoKu53jLWiaz/wa9KFrPdQ9DrqK+HQ8utOQAYsPI6KgCmxKN0ZHUQaVQUDEPbVr
ZU1UfxXHFOSOY/F2cNP3f2JgN2DY/tVOZ256yom898e9qHXBh0RO3+gamILRPP03
hO6j1ftPAmN3d66IPNC/Zp4km/mRSNUTd8jhW/CD32ZfM139P8SoAhMR/VycPdE=
=IrqN
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-09-29 15:21 Status of Vim client J. Lewis Muir
2016-09-29 17:52 ` Lucas Hoffmann
@ 2016-09-29 18:52 ` David Bremner
2016-10-08 0:08 ` Nick Howell
2 siblings, 0 replies; 28+ messages in thread
From: David Bremner @ 2016-09-29 18:52 UTC (permalink / raw)
To: J. Lewis Muir, notmuch
"J. Lewis Muir" <jlmuir@imca-cat.org> writes:
> So, are the clients really stable, or are they rotting because nobody
> uses them? My hope is the former, but I suspect the latter. Are most
> of the Vim people just using Mutt or NeoMutt?
FWIW, I was recently considering moving the vim client to contrib, and
then dropping it completely from distribution after some time. So
basically was asking myself the same question.
d
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-09-29 15:21 Status of Vim client J. Lewis Muir
2016-09-29 17:52 ` Lucas Hoffmann
2016-09-29 18:52 ` David Bremner
@ 2016-10-08 0:08 ` Nick Howell
2016-10-11 0:39 ` Nick Howell
2 siblings, 1 reply; 28+ messages in thread
From: Nick Howell @ 2016-10-08 0:08 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Lewis wrote:
> I'm also aware of two Vim clients on GitHub:
>
> * https://github.com/felipec/notmuch-vim (last commit: 2014-05-22)
>
> * https://github.com/imain/notmuch-vim (last commit: 2015-08-24)
>
> So, are the clients really stable, or are they rotting because nobody
> uses them? My hope is the former, but I suspect the latter.
I have a few patchsets adding:
- attachment support in compose
- mailcap support for multipart messages
- pgp support (decorations for reading, controls for composing)
- block operations on messages when searching
as well as miscellaneous minor bugfixes/features.
These are in various states of cleanliness, but none are directly
upstreamable right now. The first three I tried to upstream to felipec
a year or two ago, but I guess we were both too busy to push it.
(Excuse the pun.)
If you're interested, I'm happy to share. I could invest a bit of time
now; I just didn't think anyone but me cared.
Cheers,
Nick
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-10-08 0:08 ` Nick Howell
@ 2016-10-11 0:39 ` Nick Howell
2016-10-13 17:18 ` David Bremner
0 siblings, 1 reply; 28+ messages in thread
From: Nick Howell @ 2016-10-11 0:39 UTC (permalink / raw)
To: notmuch, nlhowell; +Cc: nlhowell
Nick Howell wrote:
> I have a few patchsets adding:
> - attachment support in compose
> - mailcap support for multipart messages
Mildly clean (imo), independent versions of these have been sent to
the mailing list; they are meant to be applied on-top of felipec's
repository. (I was unaware of, and haven't looked at, the imain repo.)
> - pgp support (decorations for reading, controls for composing)
This is pretty messy right now, especially given that it requires
patching mail-gpg and ruby-gpgme, and also uses some features
command-line gpg exposes that ruby-gpgme doesn't. I don't think I can
get an RFC version out for awhile. For anything to be sane, we would
have to upstream to these two ruby libraries. I hope we wouldn't have
to upstream to gpgme (as this would involve new code, as opposed to
massaging what I already have).
> - block operations on messages when searching
I can probably get an RFC version of this out in a couple days.
> as well as miscellaneous minor bugfixes/features.
Hopefully many of these patches will disappear in the rebase/cleanup
process. (Though I know where policy for rebasing is probably defined,
I haven't looked at it.)
I can also send out a monster mess 75-patch series, which includes
everything; maybe this would be useful for folks who want to know what
the finished product will look like. But it's too big and unfocused to
ask RFC on it.
Cheers,
Nick
p.s. please let me know if I broke some rule of patch mailing
ettiquette, e.g. should I have included "vim:" or based the patches
off of notmuch.git?
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-10-11 0:39 ` Nick Howell
@ 2016-10-13 17:18 ` David Bremner
2016-10-13 18:19 ` nlhowell
0 siblings, 1 reply; 28+ messages in thread
From: David Bremner @ 2016-10-13 17:18 UTC (permalink / raw)
To: Nick Howell, notmuch, nlhowell; +Cc: nlhowell
Nick Howell <nlhowell@gmail.com> writes:
> Nick Howell wrote:
>> I have a few patchsets adding:
>
>> - attachment support in compose
>> - mailcap support for multipart messages
>
> Mildly clean (imo), independent versions of these have been sent to
> the mailing list; they are meant to be applied on-top of felipec's
> repository. (I was unaware of, and haven't looked at, the imain repo.)
For whatever reason, I didn't see those messages on the (i.e. this) mailing list.
> p.s. please let me know if I broke some rule of patch mailing
> ettiquette, e.g. should I have included "vim:" or based the patches
> off of notmuch.git?
Yes, from our point of view notmuch.git is upstream, so all patches for
potential inclusion should be based off of that.
It would be handy to include vim: in the subject line, but it's not
absolutely crucial.
d
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-10-13 17:18 ` David Bremner
@ 2016-10-13 18:19 ` nlhowell
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
` (2 more replies)
0 siblings, 3 replies; 28+ messages in thread
From: nlhowell @ 2016-10-13 18:19 UTC (permalink / raw)
To: notmuch, nlhowell, David Bremner
David Bremner wrote:
> Nick Howell <nlhowell@gmail.com> writes:
> > Nick Howell wrote:
> >> I have a few patchsets adding:
> >
> >> - attachment support in compose - mailcap support for multipart
> >> messages
> >
> > Mildly clean (imo), independent versions of these have been sent
> > to the mailing list; they are meant to be applied on-top of
> > felipec's repository. (I was unaware of, and haven't looked at,
> > the imain repo.)
>
> For whatever reason, I didn't see those messages on the (i.e. this)
> mailing list.
Strange. I will make ettiquette adjustments and re-send. Here's my
smtp log:
> Oct 10 17:32:12 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=1023 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476142322 m128sm382316ioa.41 - gsmtp' exitcode=EX_OK
> Oct 10 17:32:27 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=4032 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476142337 b133sm7677395iti.21 - gsmtp' exitcode=EX_OK
> Oct 10 17:32:43 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=4085 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476142353 n69sm7704802ita.0 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:13 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=1149 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145503 fi6sm530779pac.20 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:18 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=3608 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145508 n77sm507192pfi.82 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:23 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=1071 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145514 e1sm542594pap.11 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:29 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=1422 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145519 k67sm507280pfb.86 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:34 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=970 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145524 n2sm286444pfa.75 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:39 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=4136 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145530 j6sm497374paa.44 - gsmtp' exitcode=EX_OK
> Oct 10 18:25:44 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com mailsize=1653 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476145535 g9sm503882paw.40 - gsmtp' exitcode=EX_OK
> Oct 10 18:40:12 host=smtp.gmail.com tls=on auth=on user=nlhowell from=nlhowell@gmail.com recipients=notmuch@notmuchmail.org,nlhowell@gmail.com,nlhowell@gmail.com mailsize=2058 smtpstatus=250 smtpmsg='250 2.0.0 OK 1476146402 n7sm558994pfn.62 - gsmtp' exitcode=EX_OK
I assumed they were getting moderated, but perhaps they got dropped?
> > p.s. please let me know if I broke some rule of patch mailing
> > ettiquette, e.g. should I have included "vim:" or based the
> > patches off of notmuch.git?
>
> Yes, from our point of view notmuch.git is upstream, so all patches
> for potential inclusion should be based off of that.
>
> It would be handy to include vim: in the subject line, but it's not
> absolutely crucial.
I'll make these two corrections.
Cheers,
Nick
^ permalink raw reply [flat|nested] 28+ messages in thread
* [RFC PATCH 0/2] vim: add "attach" support to compose
2016-10-13 18:19 ` nlhowell
@ 2016-10-13 19:58 ` Nick Howell
2016-10-13 19:58 ` [RFC PATCH 1/2] vim: compose: support additional Notmuch- filters Nick Howell
2016-10-13 19:58 ` [RFC PATCH 2/2] vim: compose: attachment support Nick Howell
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:42 ` Status of Vim client David Bremner
2 siblings, 2 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 19:58 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
The following is a pair of patches implementing an "attach" action for
compose mode.
The first patch reorganizes the code for the magic "Notmuch-" headers
used in compose mode.
The second patch adds a magic Notmuch-Attach header, maps an input()
helper to add the header, and adds logic to process the header
on-send.
Nick Howell (2):
vim: compose: support additional Notmuch- filters
vim: compose: attachment support
vim/notmuch.vim | 67 ++++++++++++++++++++++++++++++++++++++----
vim/syntax/notmuch-compose.vim | 5 ----
2 files changed, 61 insertions(+), 11 deletions(-)
--
2.7.3
^ permalink raw reply [flat|nested] 28+ messages in thread
* [RFC PATCH 1/2] vim: compose: support additional Notmuch- filters
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
@ 2016-10-13 19:58 ` Nick Howell
2016-10-13 19:58 ` [RFC PATCH 2/2] vim: compose: attachment support Nick Howell
1 sibling, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 19:58 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Add support for additional Notmuch-* headers: special headers read (and
then removed) by vnm upon send. The plan is to use these special headers
for all sorts of fancy features: attachments, PGP, whatever, so that the
inputs to these features are editable from vim.
For the moment, this just factors the code a bit: the Notmuch-Help lines
are expanded to list allowed headers, and the number of headers to
ignore is now decided at runtime, instead of being hardcoded.
The biggest change is the addition of dynamic highlighting for these: at
the end of the compose helper we add syntax highlighting for all the
special headers we interpret. Since these are now generated dynamically,
we remove the highlighting code from the static syntax files.
---
vim/notmuch.vim | 24 ++++++++++++++++++++----
vim/syntax/notmuch-compose.vim | 5 -----
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index ad8b7c8..bea30f8 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -87,13 +87,19 @@ endfunction
function! s:compose_send()
let b:compose_done = 1
let fname = expand('%')
- let lines = getline(5, '$')
ruby << EOF
# Generate proper mail to send
- text = VIM::evaluate('lines').join("\n")
+ text = []
+ eval_nm_headers = true
+ VIM::evaluate('getline(0, \'$\')').each do |line|
+ unless eval_nm_headers and NotmuchHeaders.any? { |h| line.start_with?("Notmuch-#{h}: ") }
+ text << line
+ eval_nm_headers = false
+ end
+ end
fname = VIM::evaluate('fname')
- transport = Mail.new(text)
+ transport = Mail.new(text.join("\n"))
transport.message_id = generate_message_id
transport.charset = 'utf-8'
File.write(fname, transport.to_s)
@@ -483,6 +489,8 @@ ruby << EOF
$messages = []
$mail_installed = defined?(Mail)
+ NotmuchHeaders = ["Help"]
+
def get_config_item(item)
result = ''
IO.popen(['notmuch', 'config', 'get', item]) { |out|
@@ -491,6 +499,7 @@ ruby << EOF
return result.rstrip
end
+
def get_config
$db_name = get_config_item('database.path')
$email_name = get_config_item('user.name')
@@ -547,8 +556,9 @@ ruby << EOF
def open_compose_helper(lines, cur)
help_lines = [
'Notmuch-Help: Type in your message here; to help you use these bindings:',
- 'Notmuch-Help: ,s - send the message (Notmuch-Help lines will be removed)',
+ 'Notmuch-Help: ,s - send the message',
'Notmuch-Help: ,q - abort the message',
+ "Notmuch-Help: Magic Notmuch- headers (removed on send): #{NotmuchHeaders.join(", ")}.",
]
dir = File.expand_path('~/.notmuch/compose')
@@ -571,6 +581,12 @@ ruby << EOF
VIM::command("let s:reply_from='%s'" % $email_address)
VIM::command("call s:new_file_buffer('compose', '#{f.path}')")
VIM::command("call cursor(#{cur}, 0)")
+ VIM::command(<<-'SEOF' % NotmuchHeaders.collect { |h| "Notmuch-#{h}" }.join('\|'))
+ syntax region nmComposeNotmuchHeaders contains=nmComposeNotmuchHeaderLine start='^\(%1$s\):' end='^\(\(%1$s\):\)\@!'
+ syntax match nmComposeNotmuchHeaderLine /\(%1$s\):/ contained
+ highlight link nmComposeNotmuchHeaders Include
+ highlight link nmComposeNotmuchHeaderLine Error
+ SEOF
end
end
diff --git a/vim/syntax/notmuch-compose.vim b/vim/syntax/notmuch-compose.vim
index 19adb75..8d45636 100644
--- a/vim/syntax/notmuch-compose.vim
+++ b/vim/syntax/notmuch-compose.vim
@@ -1,7 +1,2 @@
runtime! syntax/mail.vim
-syntax region nmComposeHelp contains=nmComposeHelpLine start='^Notmuch-Help:\%1l' end='^\(Notmuch-Help:\)\@!'
-syntax match nmComposeHelpLine /Notmuch-Help:/ contained
-
-highlight link nmComposeHelp Include
-highlight link nmComposeHelpLine Error
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 2/2] vim: compose: attachment support
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
2016-10-13 19:58 ` [RFC PATCH 1/2] vim: compose: support additional Notmuch- filters Nick Howell
@ 2016-10-13 19:58 ` Nick Howell
1 sibling, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 19:58 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Adds attachment support through the mail gem. Notmuch-Attach headers
list files which are added to the message before sending.
Files are added by constructing a new post-processed transport Mail
object using the Notmuch-Attach header and the original Mail object. Any
attachments added (say by hand, or by some other method) to the
pre-transport message are preserved.
Adds a helper which prompts for an attachment (with filename completion)
and adds the header for you (bound to ,a).
---
vim/notmuch.vim | 45 ++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index bea30f8..09685c3 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -45,6 +45,7 @@ let g:notmuch_show_maps = {
let g:notmuch_compose_maps = {
\ ',s': 'compose_send()',
+ \ ',a': 'compose_attach()',
\ ',q': 'compose_quit()',
\ }
@@ -84,6 +85,20 @@ function! s:compose_quit()
call s:kill_this_buffer()
endfunction
+function! s:compose_attach()
+ruby << EOF
+ raise "Attachment support unavailable." unless NotmuchHeaders.include?("Attach")
+EOF
+ let attachment = input('attach: ', '~/', 'file')
+ruby << EOF
+ r, c = $curwin.cursor
+ non_help_lines = (1..$curbuf.count).reject { |i| $curbuf[i].start_with?("Notmuch-Help: ") }
+ attachment = File.expand_path(VIM::evaluate('attachment'))
+ $curbuf.append(non_help_lines[0] - 1, "Notmuch-Attach: #{attachment}")
+ $curwin.cursor = [r + 1, c]
+EOF
+endfunction
+
function! s:compose_send()
let b:compose_done = 1
let fname = expand('%')
@@ -91,18 +106,39 @@ function! s:compose_send()
ruby << EOF
# Generate proper mail to send
text = []
+ attachments = []
eval_nm_headers = true
VIM::evaluate('getline(0, \'$\')').each do |line|
unless eval_nm_headers and NotmuchHeaders.any? { |h| line.start_with?("Notmuch-#{h}: ") }
text << line
eval_nm_headers = false
+ else
+ if line.start_with?("Notmuch-Attach: ")
+ attachments << line["Notmuch-Attach: ".length..-1]
+ end
end
end
fname = VIM::evaluate('fname')
transport = Mail.new(text.join("\n"))
transport.message_id = generate_message_id
transport.charset = 'utf-8'
- File.write(fname, transport.to_s)
+
+ transport_fin = Mail.new do
+ transport.header_fields.reject do |f|
+ [
+ "Content-Type",
+ "Content-Transfer-Encoding",
+ ].include?(f.name)
+ end.each do |f|
+ header[f.name] = f.value
+ end
+ transport.attachments.each { |a| add_file(:filename => a.filename, :mime_type => a.mime_type, :content => a.decoded) }
+ attachments.each { |a| add_file(a) }
+
+ body (transport.find_first_text || transport).body.to_s
+ end
+
+ File.write(fname, transport_fin.to_s)
EOF
let cmdtxt = g:notmuch_sendmail . ' -t -f ' . s:reply_from . ' < ' . fname
@@ -489,7 +525,9 @@ ruby << EOF
$messages = []
$mail_installed = defined?(Mail)
- NotmuchHeaders = ["Help"]
+ NotmuchHeaders = ["Help",
+ $mail_installed && "Attach",
+ ].select { |s| s.is_a?(String) }
def get_config_item(item)
result = ''
@@ -557,9 +595,10 @@ ruby << EOF
help_lines = [
'Notmuch-Help: Type in your message here; to help you use these bindings:',
'Notmuch-Help: ,s - send the message',
+ NotmuchHeaders.include?("Attach") && 'Notmuch-Help: ,a - prompt for attachment',
'Notmuch-Help: ,q - abort the message',
"Notmuch-Help: Magic Notmuch- headers (removed on send): #{NotmuchHeaders.join(", ")}.",
- ]
+ ].select { |s| s.is_a?(String) }
dir = File.expand_path('~/.notmuch/compose')
FileUtils.mkdir_p(dir)
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 0/7] vim: add mailcap filtering to show
2016-10-13 18:19 ` nlhowell
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 1/7] vim: show: add mailcap filtering Nick Howell
` (7 more replies)
2016-10-13 20:42 ` Status of Vim client David Bremner
2 siblings, 8 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
This patch series adds the ability to display parts with non-plaintext
mime types. It uses the mailcap facility (see the commit message for
the first patch) to transform to plaintext. The latter patches add
special handling for multipart/alternative (instead of just treating
it as multipart/mixed).
Nick Howell (7):
vim: show: add mailcap filtering
vim: mailcap: forbid access to display server
vim: mailcap: gracefully handle missing mimetype
vim: mailcap: don't corrupt the view if filters write to stderr
vim: mailcap: redraw after processing
vim: mailcap: show all alternatives if none preferred
vim: mailcap: handle mailcap failure gracefully
vim/notmuch.vim | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 59 insertions(+), 4 deletions(-)
--
2.7.3
^ permalink raw reply [flat|nested] 28+ messages in thread
* [RFC PATCH 1/7] vim: show: add mailcap filtering
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 2/7] vim: mailcap: forbid access to display server Nick Howell
` (6 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Add mailcap filters, which allow us to display multiple parts.
See http://packages.debian.org/unstable/net/mime-support for details on
run-mailcap, the mailcap program we default to; the TLDR is that mailcap
is a program which accepts a mimetype argument, looks up a translation
program based on this, and hooks up stdin/stdout to this program.
This is useful for inline display of html, pdfs, docx, images (through
caca), etc, as well as external display (by launching an image viewer).
The implementation here linearizes the part tree of the message
(treating all multipart pieces as multipart/mixed) and then popens a
mailcap process for each. If mailcap fails for some reason (e.g. no
display rule), the contents are listed as "unavailable."
A sample $HOME/.mailcap configuration file:
application/pdf; pdftotext -layout '%s' - | fmt; copiousoutput;
text/html; vilistextum -u '%s' -w 72 -; copiousoutput;
text/plain; fmt -s
Some suggested converters:
- antiword, antixls, vilistextum, docx2txt
---
vim/notmuch.vim | 34 ++++++++++++++++++++++++++++++----
1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index ad8b7c8..c66c874 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -60,6 +60,7 @@ let s:notmuch_reader_default = 'mutt -f %s'
let s:notmuch_sendmail_default = 'sendmail'
let s:notmuch_folders_count_threads_default = 0
let s:notmuch_compose_start_insert_default = 1
+let s:notmuch_mailcap_filter_default = "run-mailcap --action=view %s:-"
function! s:new_file_buffer(type, fname)
exec printf('edit %s', a:fname)
@@ -320,9 +321,9 @@ ruby << EOF
msgs = q.search_messages
msgs.each do |msg|
m = Mail.read(msg.filename)
- part = m.find_first_text
nm_m = Message.new(msg, m)
$messages << nm_m
+ mailcap = VIM::evaluate('g:notmuch_mailcap_filter')
date_fmt = VIM::evaluate('g:notmuch_datetime_format')
date = Time.at(msg.date).strftime(date_fmt)
nm_m.start = b.count
@@ -332,9 +333,31 @@ ruby << EOF
b << "Cc: %s" % msg['cc']
b << "Date: %s" % msg['date']
nm_m.body_start = b.count
- b << "--- %s ---" % part.mime_type
- part.convert.each_line do |l|
- b << l.chomp
+ parts = [m]
+ while parts.any?(&:multipart?)
+ parts = parts.collect do |part|
+ if part.multipart?
+ part.parts
+ else
+ part
+ end
+ end.flatten
+ end
+
+ parts.each do |part|
+ b << "--- %s ---" % part.mime_type
+ begin
+ IO.popen(mailcap % part.mime_type, "r+b") do |io|
+ io.write(part.decoded)
+ io.close_write
+ io.each_line do |l|
+ b << l.chomp
+ end
+ end
+ rescue
+ b << "--- unavailable ---"
+ end
+ b << ""
end
b << ""
nm_m.end = b.count
@@ -393,6 +416,9 @@ endfunction
"" root
function! s:set_defaults()
+ if !exists('g:notmuch_mailcap_filter')
+ let g:notmuch_mailcap_filter = s:notmuch_mailcap_filter_default
+ endif
if !exists('g:notmuch_date_format')
if exists('g:notmuch_rb_date_format')
let g:notmuch_date_format = g:notmuch_rb_date_format
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 2/7] vim: mailcap: forbid access to display server
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:13 ` [RFC PATCH 1/7] vim: show: add mailcap filtering Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 3/7] vim: mailcap: gracefully handle missing mimetype Nick Howell
` (5 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Default to prevent mailcap from accessing the display server. Potential
concerns: a malicious .mailcap file + attachment could read your
keystrokes, or if the .mailcap file is non-malicious, an attachment
exploiting a vulnerability in your mailcap viewer.
In principle we should probably try to run mailcap with super-low
privileges, but I haven't explored this.
---
vim/notmuch.vim | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index c66c874..947fec0 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -60,7 +60,7 @@ let s:notmuch_reader_default = 'mutt -f %s'
let s:notmuch_sendmail_default = 'sendmail'
let s:notmuch_folders_count_threads_default = 0
let s:notmuch_compose_start_insert_default = 1
-let s:notmuch_mailcap_filter_default = "run-mailcap --action=view %s:-"
+let s:notmuch_mailcap_filter_default = "DISPLAY= run-mailcap --action=view %s:-"
function! s:new_file_buffer(type, fname)
exec printf('edit %s', a:fname)
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 3/7] vim: mailcap: gracefully handle missing mimetype
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:13 ` [RFC PATCH 1/7] vim: show: add mailcap filtering Nick Howell
2016-10-13 20:13 ` [RFC PATCH 2/7] vim: mailcap: forbid access to display server Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 4/7] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
` (4 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Some plaintext messages do not specify a mimetype. Instead of failing in
this situation, just assume the part is plaintext. (Maybe a better
strategy would be to check if the message contains non-unicode first?)
---
vim/notmuch.vim | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 947fec0..89fa2dc 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -345,9 +345,9 @@ ruby << EOF
end
parts.each do |part|
- b << "--- %s ---" % part.mime_type
+ b << "--- %s ---" % ( [part.mime_type || "unknown", part.filename].find_all { |x| x }.join(" ") )
begin
- IO.popen(mailcap % part.mime_type, "r+b") do |io|
+ IO.popen(mailcap % (part.mime_type || "text/plain"), "r+b") do |io|
io.write(part.decoded)
io.close_write
io.each_line do |l|
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 4/7] vim: mailcap: don't corrupt the view if filters write to stderr
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
` (2 preceding siblings ...)
2016-10-13 20:13 ` [RFC PATCH 3/7] vim: mailcap: gracefully handle missing mimetype Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 5/7] vim: mailcap: redraw after processing Nick Howell
` (3 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 89fa2dc..a20dd86 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -347,7 +347,7 @@ ruby << EOF
parts.each do |part|
b << "--- %s ---" % ( [part.mime_type || "unknown", part.filename].find_all { |x| x }.join(" ") )
begin
- IO.popen(mailcap % (part.mime_type || "text/plain"), "r+b") do |io|
+ IO.popen("%s 2>/dev/null" % (mailcap % (part.mime_type || "text/plain")), "r+b") do |io|
io.write(part.decoded)
io.close_write
io.each_line do |l|
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 5/7] vim: mailcap: redraw after processing
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
` (3 preceding siblings ...)
2016-10-13 20:13 ` [RFC PATCH 4/7] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 6/7] vim: mailcap: show all alternatives if none preferred Nick Howell
` (2 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 1 +
1 file changed, 1 insertion(+)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index a20dd86..5cb8d20 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -370,6 +370,7 @@ ruby << EOF
VIM::command("syntax region nmShowMsg#{i}Body start='\\%%%il' end='\\%%%dl' contains=@nmShowMsgBody" % [msg.body_start, msg.end])
end
EOF
+ normal \f
setlocal nomodifiable
call s:set_map(g:notmuch_show_maps)
endfunction
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 6/7] vim: mailcap: show all alternatives if none preferred
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
` (4 preceding siblings ...)
2016-10-13 20:13 ` [RFC PATCH 5/7] vim: mailcap: redraw after processing Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:13 ` [RFC PATCH 7/7] vim: mailcap: handle mailcap failure gracefully Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Display all parts of a multipart/alternative message (or message-part)
if no alternative_preference matches any of the alternative mimetypes.
E.g. if a message is multipart/alternative with options text/plain and
text/html, and the alternative_preference is ['application/pdf'], no
preference option matches any of the parts. This patch would just
display both parts.
Better configuration is to have '*/*' as an option in your
alternative_preference, e.g. ['text/plain', 'text/*', '*/*'], so that
there is always a catch-all.
---
vim/notmuch.vim | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 5cb8d20..da747eb 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -337,7 +337,24 @@ ruby << EOF
while parts.any?(&:multipart?)
parts = parts.collect do |part|
if part.multipart?
- part.parts
+ if part.mime_type == "multipart/alternative"
+ case alternative_display
+ when "best-only"
+ alternative_preference.each.collect do |mime_type|
+ part.parts.find { |p| File.fnmatch(mime_type, p.mime_type) }
+ end.reject(&:nil?).first || part.parts
+ when "best-sort"
+ part.parts.sort_by do |p|
+ alternative_preference.collect.with_index do |mime_type, i|
+ (File.fnmatch(mime_type, p.mime_type) ? 0 : 1) << i
+ end.reduce(:+)
+ end
+ when "verbatim"
+ part.parts
+ end
+ else
+ part.parts
+ end
else
part
end
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCH 7/7] vim: mailcap: handle mailcap failure gracefully
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
` (5 preceding siblings ...)
2016-10-13 20:13 ` [RFC PATCH 6/7] vim: mailcap: show all alternatives if none preferred Nick Howell
@ 2016-10-13 20:13 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:13 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index da747eb..e9baeff 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -370,6 +370,14 @@ ruby << EOF
io.each_line do |l|
b << l.chomp
end
+ if $? != 0
+ b << "--- ERROR: mailcap failed ---"
+ part.decoded.each_line do |l|
+ b << l.chomp
+ end
+ end
+ rescue
+ b << "--- unavailable ---"
end
rescue
b << "--- unavailable ---"
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: Status of Vim client
2016-10-13 18:19 ` nlhowell
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
@ 2016-10-13 20:42 ` David Bremner
2 siblings, 0 replies; 28+ messages in thread
From: David Bremner @ 2016-10-13 20:42 UTC (permalink / raw)
To: nlhowell, notmuch; +Cc: Tomi Ollila
nlhowell@gmail.com writes:
> I assumed they were getting moderated, but perhaps they got dropped?
Tomi can you check that possibility? It seems unlikely, given the other
messages are getting through, but who knows what evil lurks in the heart
of Mailman.
d
^ permalink raw reply [flat|nested] 28+ messages in thread
* [RFC PATCHv2 0/8] vim: add mailcap filtering to show
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
` (6 preceding siblings ...)
2016-10-13 20:13 ` [RFC PATCH 7/7] vim: mailcap: handle mailcap failure gracefully Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 1/8] vim: show: add mailcap filtering Nick Howell
` (7 more replies)
7 siblings, 8 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
This patch series adds the ability to display parts with non-plaintext
mime types. It uses the mailcap facility (see the commit message for
the first patch) to transform to plaintext. The latter patches add
special handling for multipart/alternative (instead of just treating
it as multipart/mixed).
Probably we should choose a more secure default, e.g. whitelisting
environment variables. It would be nice to recommend the use of a
sandbox.
Changes v1..v2:
- add missing patch "add multipart/alternative picking"
- correct poor conflict resolution in "handle mailcap failure
gracefully"
Nick Howell (8):
vim: show: add mailcap filtering
vim: mailcap: forbid access to display server
vim: mailcap: gracefully handle missing mimetype
vim: mailcap: don't corrupt the view if filters write to stderr
vim: mailcap: redraw after processing
vim: show: add multipart/alternative picking
vim: mailcap: show all alternatives if none preferred
vim: mailcap: handle mailcap failure gracefully
vim/notmuch.vim | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 66 insertions(+), 4 deletions(-)
--
2.7.3
^ permalink raw reply [flat|nested] 28+ messages in thread
* [RFC PATCHv2 1/8] vim: show: add mailcap filtering
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 2/8] vim: mailcap: forbid access to display server Nick Howell
` (6 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Add mailcap filters, which allow us to display multiple parts.
See http://packages.debian.org/unstable/net/mime-support for details on
run-mailcap, the mailcap program we default to; the TLDR is that mailcap
is a program which accepts a mimetype argument, looks up a translation
program based on this, and hooks up stdin/stdout to this program.
This is useful for inline display of html, pdfs, docx, images (through
caca), etc, as well as external display (by launching an image viewer).
The implementation here linearizes the part tree of the message
(treating all multipart pieces as multipart/mixed) and then popens a
mailcap process for each. If mailcap fails for some reason (e.g. no
display rule), the contents are listed as "unavailable."
A sample $HOME/.mailcap configuration file:
application/pdf; pdftotext -layout '%s' - | fmt; copiousoutput;
text/html; vilistextum -u '%s' -w 72 -; copiousoutput;
text/plain; fmt -s
Some suggested converters:
- antiword, antixls, vilistextum, docx2txt
---
vim/notmuch.vim | 34 ++++++++++++++++++++++++++++++----
1 file changed, 30 insertions(+), 4 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index ad8b7c8..c66c874 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -60,6 +60,7 @@ let s:notmuch_reader_default = 'mutt -f %s'
let s:notmuch_sendmail_default = 'sendmail'
let s:notmuch_folders_count_threads_default = 0
let s:notmuch_compose_start_insert_default = 1
+let s:notmuch_mailcap_filter_default = "run-mailcap --action=view %s:-"
function! s:new_file_buffer(type, fname)
exec printf('edit %s', a:fname)
@@ -320,9 +321,9 @@ ruby << EOF
msgs = q.search_messages
msgs.each do |msg|
m = Mail.read(msg.filename)
- part = m.find_first_text
nm_m = Message.new(msg, m)
$messages << nm_m
+ mailcap = VIM::evaluate('g:notmuch_mailcap_filter')
date_fmt = VIM::evaluate('g:notmuch_datetime_format')
date = Time.at(msg.date).strftime(date_fmt)
nm_m.start = b.count
@@ -332,9 +333,31 @@ ruby << EOF
b << "Cc: %s" % msg['cc']
b << "Date: %s" % msg['date']
nm_m.body_start = b.count
- b << "--- %s ---" % part.mime_type
- part.convert.each_line do |l|
- b << l.chomp
+ parts = [m]
+ while parts.any?(&:multipart?)
+ parts = parts.collect do |part|
+ if part.multipart?
+ part.parts
+ else
+ part
+ end
+ end.flatten
+ end
+
+ parts.each do |part|
+ b << "--- %s ---" % part.mime_type
+ begin
+ IO.popen(mailcap % part.mime_type, "r+b") do |io|
+ io.write(part.decoded)
+ io.close_write
+ io.each_line do |l|
+ b << l.chomp
+ end
+ end
+ rescue
+ b << "--- unavailable ---"
+ end
+ b << ""
end
b << ""
nm_m.end = b.count
@@ -393,6 +416,9 @@ endfunction
"" root
function! s:set_defaults()
+ if !exists('g:notmuch_mailcap_filter')
+ let g:notmuch_mailcap_filter = s:notmuch_mailcap_filter_default
+ endif
if !exists('g:notmuch_date_format')
if exists('g:notmuch_rb_date_format')
let g:notmuch_date_format = g:notmuch_rb_date_format
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 2/8] vim: mailcap: forbid access to display server
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 1/8] vim: show: add mailcap filtering Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 3/8] vim: mailcap: gracefully handle missing mimetype Nick Howell
` (5 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Default to prevent mailcap from accessing the display server. Potential
concerns: a malicious .mailcap file + attachment could read your
keystrokes, or if the .mailcap file is non-malicious, an attachment
exploiting a vulnerability in your mailcap viewer.
In principle we should probably try to run mailcap with super-low
privileges, but I haven't explored this.
---
vim/notmuch.vim | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index c66c874..947fec0 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -60,7 +60,7 @@ let s:notmuch_reader_default = 'mutt -f %s'
let s:notmuch_sendmail_default = 'sendmail'
let s:notmuch_folders_count_threads_default = 0
let s:notmuch_compose_start_insert_default = 1
-let s:notmuch_mailcap_filter_default = "run-mailcap --action=view %s:-"
+let s:notmuch_mailcap_filter_default = "DISPLAY= run-mailcap --action=view %s:-"
function! s:new_file_buffer(type, fname)
exec printf('edit %s', a:fname)
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 3/8] vim: mailcap: gracefully handle missing mimetype
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 1/8] vim: show: add mailcap filtering Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 2/8] vim: mailcap: forbid access to display server Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 4/8] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
` (4 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Some plaintext messages do not specify a mimetype. Instead of failing in
this situation, just assume the part is plaintext. (Maybe a better
strategy would be to check if the message contains non-unicode first?)
---
vim/notmuch.vim | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 947fec0..89fa2dc 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -345,9 +345,9 @@ ruby << EOF
end
parts.each do |part|
- b << "--- %s ---" % part.mime_type
+ b << "--- %s ---" % ( [part.mime_type || "unknown", part.filename].find_all { |x| x }.join(" ") )
begin
- IO.popen(mailcap % part.mime_type, "r+b") do |io|
+ IO.popen(mailcap % (part.mime_type || "text/plain"), "r+b") do |io|
io.write(part.decoded)
io.close_write
io.each_line do |l|
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 4/8] vim: mailcap: don't corrupt the view if filters write to stderr
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
` (2 preceding siblings ...)
2016-10-13 20:47 ` [RFC PATCHv2 3/8] vim: mailcap: gracefully handle missing mimetype Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 5/8] vim: mailcap: redraw after processing Nick Howell
` (3 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 89fa2dc..a20dd86 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -347,7 +347,7 @@ ruby << EOF
parts.each do |part|
b << "--- %s ---" % ( [part.mime_type || "unknown", part.filename].find_all { |x| x }.join(" ") )
begin
- IO.popen(mailcap % (part.mime_type || "text/plain"), "r+b") do |io|
+ IO.popen("%s 2>/dev/null" % (mailcap % (part.mime_type || "text/plain")), "r+b") do |io|
io.write(part.decoded)
io.close_write
io.each_line do |l|
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 5/8] vim: mailcap: redraw after processing
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
` (3 preceding siblings ...)
2016-10-13 20:47 ` [RFC PATCHv2 4/8] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 6/8] vim: show: add multipart/alternative picking Nick Howell
` (2 subsequent siblings)
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 1 +
1 file changed, 1 insertion(+)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index a20dd86..5cb8d20 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -370,6 +370,7 @@ ruby << EOF
VIM::command("syntax region nmShowMsg#{i}Body start='\\%%%il' end='\\%%%dl' contains=@nmShowMsgBody" % [msg.body_start, msg.end])
end
EOF
+ normal \f
setlocal nomodifiable
call s:set_map(g:notmuch_show_maps)
endfunction
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 6/8] vim: show: add multipart/alternative picking
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
` (4 preceding siblings ...)
2016-10-13 20:47 ` [RFC PATCHv2 5/8] vim: mailcap: redraw after processing Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 7/8] vim: mailcap: show all alternatives if none preferred Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 8/8] vim: mailcap: handle mailcap failure gracefully Nick Howell
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Instead of just blindly showing every part of multipart/*, add special
handling for multipart/alternative (which is designed for alternative
content-types containing the same message). Two new preferences are
added:
- g:notmuch_multipart_alternative_display
= "best-only" (default)
Display only the favorite content-type.
= "best-sort"
Display all content-types, sorted by preference.
= "verbatim"
Display all content-types in the order they appear.
- g:notmuch_multipart_alternative_preference
Array which orders mimetypes based on preference; note that if a
part has a mimetype which matches none of these, the part will
not be displayed!
e.g. ['text/plain', 'text/*', '*'] (default)
The RFC describing multipart/alternative has some subtleties regarding
ways the sender can influence which content-type is shown; we mostly
ignore these, and give the user the choice.
Note that the defaults break some mail programs (**cough apple**) which,
when attaching images, prefer to embed the image in text/html, but then
list a multipart/alternative of text/plain without attaching the image.
---
vim/notmuch.vim | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 5cb8d20..795ab26 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -61,6 +61,8 @@ let s:notmuch_sendmail_default = 'sendmail'
let s:notmuch_folders_count_threads_default = 0
let s:notmuch_compose_start_insert_default = 1
let s:notmuch_mailcap_filter_default = "DISPLAY= run-mailcap --action=view %s:-"
+let s:notmuch_multipart_alternative_display_default = "best-only"
+let s:notmuch_multipart_alternative_preference_default = ['text/plain', 'text/*', '*']
function! s:new_file_buffer(type, fname)
exec printf('edit %s', a:fname)
@@ -324,6 +326,8 @@ ruby << EOF
nm_m = Message.new(msg, m)
$messages << nm_m
mailcap = VIM::evaluate('g:notmuch_mailcap_filter')
+ alternative_preference = VIM::evaluate('g:notmuch_multipart_alternative_preference')
+ alternative_display = VIM::evaluate('g:notmuch_multipart_alternative_display')
date_fmt = VIM::evaluate('g:notmuch_datetime_format')
date = Time.at(msg.date).strftime(date_fmt)
nm_m.start = b.count
@@ -337,7 +341,24 @@ ruby << EOF
while parts.any?(&:multipart?)
parts = parts.collect do |part|
if part.multipart?
- part.parts
+ if part.mime_type == "multipart/alternative"
+ case alternative_display
+ when "best-only"
+ alternative_preference.each.collect do |mime_type|
+ part.parts.find { |p| File.fnmatch(mime_type, p.mime_type) }
+ end.first
+ when "best-sort"
+ part.parts.sort_by do |p|
+ alternative_preference.collect.with_index do |mime_type, i|
+ (File.fnmatch(mime_type, p.mime_type) ? 0 : 1) << i
+ end.reduce(:+)
+ end
+ when "verbatim"
+ part.parts
+ end
+ else
+ part.parts
+ end
else
part
end
@@ -417,6 +438,14 @@ endfunction
"" root
function! s:set_defaults()
+ if !exists('g:notmuch_multipart_alternative_display')
+ let g:notmuch_multipart_alternative_display = s:notmuch_multipart_alternative_display_default
+ endif
+
+ if !exists('g:notmuch_multipart_alternative_preference')
+ let g:notmuch_multipart_alternative_preference = s:notmuch_multipart_alternative_preference_default
+ endif
+
if !exists('g:notmuch_mailcap_filter')
let g:notmuch_mailcap_filter = s:notmuch_mailcap_filter_default
endif
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 7/8] vim: mailcap: show all alternatives if none preferred
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
` (5 preceding siblings ...)
2016-10-13 20:47 ` [RFC PATCHv2 6/8] vim: show: add multipart/alternative picking Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 8/8] vim: mailcap: handle mailcap failure gracefully Nick Howell
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
Display all parts of a multipart/alternative message (or message-part)
if no alternative_preference matches any of the alternative mimetypes.
E.g. if a message is multipart/alternative with options text/plain and
text/html, and the alternative_preference is ['application/pdf'], no
preference option matches any of the parts. This patch would just
display both parts.
Better configuration is to have '*/*' as an option in your
alternative_preference, e.g. ['text/plain', 'text/*', '*/*'], so that
there is always a catch-all.
---
vim/notmuch.vim | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 795ab26..cdcaa5f 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -346,7 +346,7 @@ ruby << EOF
when "best-only"
alternative_preference.each.collect do |mime_type|
part.parts.find { |p| File.fnmatch(mime_type, p.mime_type) }
- end.first
+ end.reject(&:nil?).first || part.parts
when "best-sort"
part.parts.sort_by do |p|
alternative_preference.collect.with_index do |mime_type, i|
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [RFC PATCHv2 8/8] vim: mailcap: handle mailcap failure gracefully
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
` (6 preceding siblings ...)
2016-10-13 20:47 ` [RFC PATCHv2 7/8] vim: mailcap: show all alternatives if none preferred Nick Howell
@ 2016-10-13 20:47 ` Nick Howell
7 siblings, 0 replies; 28+ messages in thread
From: Nick Howell @ 2016-10-13 20:47 UTC (permalink / raw)
To: notmuch; +Cc: nlhowell
---
vim/notmuch.vim | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index cdcaa5f..79a0e27 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -374,6 +374,12 @@ ruby << EOF
io.each_line do |l|
b << l.chomp
end
+ if $? != 0
+ b << "--- ERROR: mailcap failed ---"
+ part.decoded.each_line do |l|
+ b << l.chomp
+ end
+ end
end
rescue
b << "--- unavailable ---"
--
2.7.3
^ permalink raw reply related [flat|nested] 28+ messages in thread
end of thread, other threads:[~2016-10-13 20:49 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-09-29 15:21 Status of Vim client J. Lewis Muir
2016-09-29 17:52 ` Lucas Hoffmann
2016-09-29 18:52 ` David Bremner
2016-10-08 0:08 ` Nick Howell
2016-10-11 0:39 ` Nick Howell
2016-10-13 17:18 ` David Bremner
2016-10-13 18:19 ` nlhowell
2016-10-13 19:58 ` [RFC PATCH 0/2] vim: add "attach" support to compose Nick Howell
2016-10-13 19:58 ` [RFC PATCH 1/2] vim: compose: support additional Notmuch- filters Nick Howell
2016-10-13 19:58 ` [RFC PATCH 2/2] vim: compose: attachment support Nick Howell
2016-10-13 20:13 ` [RFC PATCH 0/7] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:13 ` [RFC PATCH 1/7] vim: show: add mailcap filtering Nick Howell
2016-10-13 20:13 ` [RFC PATCH 2/7] vim: mailcap: forbid access to display server Nick Howell
2016-10-13 20:13 ` [RFC PATCH 3/7] vim: mailcap: gracefully handle missing mimetype Nick Howell
2016-10-13 20:13 ` [RFC PATCH 4/7] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
2016-10-13 20:13 ` [RFC PATCH 5/7] vim: mailcap: redraw after processing Nick Howell
2016-10-13 20:13 ` [RFC PATCH 6/7] vim: mailcap: show all alternatives if none preferred Nick Howell
2016-10-13 20:13 ` [RFC PATCH 7/7] vim: mailcap: handle mailcap failure gracefully Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 0/8] vim: add mailcap filtering to show Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 1/8] vim: show: add mailcap filtering Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 2/8] vim: mailcap: forbid access to display server Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 3/8] vim: mailcap: gracefully handle missing mimetype Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 4/8] vim: mailcap: don't corrupt the view if filters write to stderr Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 5/8] vim: mailcap: redraw after processing Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 6/8] vim: show: add multipart/alternative picking Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 7/8] vim: mailcap: show all alternatives if none preferred Nick Howell
2016-10-13 20:47 ` [RFC PATCHv2 8/8] vim: mailcap: handle mailcap failure gracefully Nick Howell
2016-10-13 20:42 ` Status of Vim client David Bremner
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).