Package: vim
Version: 1:7.1.291-1
Severity: wishlist
Tags: patch

Hi,

I've been using vim to read debian-private archives on master.  I like
its syntax highlighting but have continually been annoyed that (a) I
have to page-down through obvious spam, and (b) I have to view all of
the headers to each mail message, most of which are completely
uninteresting.

I can't believe this doesn't exist already, but I can't find any plugin
to implement folding for mbox format files.  So I wrote one, see
attached "fold-mail.vim".  This folds mbox format files at two levels:
1) individual messages, and 2) the headers for each message.  Author and
subject of the message are displayed in the folding text at both levels.

You may want to integrate into ftplugin/mail.vim.  I wrote this as a
quick hack in a couple hours, based only on ftplugin/debchangelog.vim
and the online Vim documentation, so you may also want to do a sanity
check on it first :-)

best regards,

-- 
Kevin B. McCarty <[EMAIL PROTECTED]>
WWW: http://www.starplot.org/
WWW: http://people.debian.org/~kmccarty/
GPG: public key ID 4F83C751
if exists("g:mail_fold_enable")
  setlocal foldmethod=expr
  setlocal foldexpr=GetMboxFold(v:lnum)
  setlocal foldtext=GetMboxFoldText()
endif

" {{{1 folding

function! s:getAuthor(zonestart, zoneend) " return author name if present,
                                          " otherwise just email address
  let linepos = a:zonestart
  while linepos <= a:zoneend
    let line = getline(linepos)
    if line =~# '^From: '
      if line =~ '^From: [^<> ][^<>]* <'
        return substitute(line, '^From: ["]\?\([^<> ][^<>]*[^<>"]\)["]\? .*', 
'\1', '')
      else
        return substitute(line, '^From: \(.*\)', '\1', '')
      endif
    endif
    let linepos += 1
  endwhile
  return '[unknown author]'
endfunction

function! s:getSubject(zonestart, zoneend)
  let linepos = a:zonestart
  while linepos <= a:zoneend
    let line = getline(linepos)
    if line =~# '^Subject: '
      return substitute(line, '^Subject: \(.*\)', '\1', '')
    endif
    let linepos += 1
  endwhile
  return '[no subject]'
endfunction

function! GetMboxFoldText()
  if v:folddashes == '-' " whole mail msg folded:
                         " show number of lines as well as author & subject
    let text = substitute(foldtext(), '^\([-+0-9 ]\+lines: \).*', '\1', '') . 
s:getAuthor(v:foldstart, v:foldend)
    while strlen(text) < 36
      let text = text . ' '
    endwhile
    if strlen(text) > 36
      let text = text[0 : 35]
    endif
  else " only headers folded, use full available space to show author & subject
    let text = '+-- ' . s:getAuthor(v:foldstart, v:foldend)
  endif

  return text . ' -- ' . s:getSubject(v:foldstart, v:foldend) . ' '
endfunction

function! GetMboxFold(lnum)
  let line = getline(a:lnum)
  if line =~# '^From '
    return '>1' " beginning of a message
  endif
  if line =~ '^[-a-zA-Z0-9]\+: '
    if a:lnum > 0 && getline(a:lnum - 1) =~# '^From '
      return '>2' " beginning of header block
    else
      return '='
    endif
  endif
  if a:lnum > 0 && line =~ '^$'
    return '<2'
  else
    return '='
  endif
endfunction

" }}}

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to