Third iteration of mbox folding: take into account that header field names (Subject, From) are case-insensitive, and allow tab(s) as well as space(s) to follow them.
Sorry for all the noise, this should be the final version. 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
" disable folding if there is no From header (presumably only one
" mail message in the file)
setlocal foldexpr=getline(1)=~#'^From\ '?GetMboxFold(v:lnum):'0'
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:\s'
if line =~? '^From:\s\+[^<>]*\s\+<'
return substitute(line, '^[^:]*:\s\+["]\?\([^<>]*[^<>"]\)["]\?\s\+<.*',
'\1', '')
else
return substitute(line, '^[^:]*:\s\+\(.*\)', '\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:\s'
return substitute(line, '^[^:]*:\s\+\(.*\)', '\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 : 34] . '>'
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 > 1 && getline(a:lnum - 1) =~# '^From '
return '>2' " beginning of header block
else
return '='
endif
endif
if a:lnum > 1 && line =~ '^$'
return '<2'
endif
return '='
endfunction
silent! foldopen! " unfold the entry the cursor is on (usually the first one)
" }}}
signature.asc
Description: OpenPGP digital signature

