+ elseif match(line, s:notmuch_show_part_begin_regexp) != -1
+ let in_part = 1
+ let m = matchlist(line, 'ID: \(\d\+\), Content-type: \(\S\+\)')
+ if len(m)
+ call add(info['disp'],
+ \ printf('--- part %d --- %s ---', m[1], m[2]))
+ endif
+ endif
+
+ elseif in_header
+ if in_header == 1
+ let msg['descr'] = line
+ call add(info['disp'], line)
+ let in_header = 2
+
+ else
+ if match(line, s:notmuch_show_header_end_regexp) != -1
+ let msg['header'] = hdr
+ let in_header = 0
+ let hdr = {}
+ else
+ let m = matchlist(line, '^\(\w\+\):\s*\(.*\)$')
+ if len(m)
+ let hdr[m[1]] = m[2]
+ if match(s:notmuch_show_headers, m[1]) != -1
+ call add(info['disp'], line)
+ endif
+ endif
+ endif
+ endif
+
+ elseif in_message
+ if match(line, s:notmuch_show_message_end_regexp) != -1
+ let msg['end'] = len(info['disp'])
+ call add(info['disp'], '')
+
+ let foldinfo = [ 'match', msg['start'], msg['end'],
+ \ printf('[ MSG %d - %s ]', len(info['msgs']), msg['descr']) ]
+
+ call add(info['msgs'], msg)
+ let msg = {}
+ let in_message = 0
+ let in_header = 0
+ let in_body = 0
+ let in_part = 0
+
+ elseif match(line, s:notmuch_show_header_begin_regexp) != -1
+ let in_header = 1
+ continue
+
+ elseif match(line, s:notmuch_show_body_begin_regexp) != -1
+ let body_start = len(info['disp']) + 1
+ let in_body = 1
+ continue
+ endif
+
+ else
+ if match(line, s:notmuch_show_message_begin_regexp) != -1
+ let msg['start'] = len(info['disp']) + 1
+
+ let m = matchlist(line, s:notmuch_show_message_parse_regexp)
+ if len(m)
+ let msg['id'] = m[1]
+ let msg['depth'] = m[2]
+ let msg['filename'] = m[3]
+ endif
+
+ let in_message = 1
+ endif
+ endif
+
+ if len(foldinfo)
+ call add(info['folds'], foldinfo[0:2])
+ let info['foldtext'][foldinfo[1]] = foldinfo[3]
+ endif
+ endfor
+ return info
+endfunction
+
+function! s:NM_cmd_show_mkfolds()
+ let info = b:nm_raw_info
+
+ for afold in info['folds']
+ exec printf('%d,%dfold', afold[1], afold[2])
+ if (afold[0] == 'sig' && s:notmuch_show_fold_signatures)
+ \ || (afold[0] == 'cit' && s:notmuch_show_fold_citations)
+ exec printf('%dfoldclose', afold[1])
+ else
+ exec printf('%dfoldopen', afold[1])
+ endif
+ endfor
+endfunction
+
+function! NM_cmd_show_foldtext()
+ let foldtext = b:nm_raw_info['foldtext']
+ return foldtext[v:foldstart]
+endfunction
+
+
+" --- helper functions