From 89dc64726f9a396b0a0912788e1736141968c8b3 Mon Sep 17 00:00:00 2001 From: Bart Trojanowski Date: Thu, 19 Nov 2009 16:20:16 -0500 Subject: [PATCH] first attempt to fold the message nicely --- vim/plugin/notmuch.vim | 47 +++++++++++++++++++++++++++++++++-- vim/syntax/notmuch-search.vim | 6 ++--- vim/syntax/notmuch-show.vim | 17 +++++++++---- 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim index 5fe438e7..70f38e2a 100644 --- a/vim/plugin/notmuch.vim +++ b/vim/plugin/notmuch.vim @@ -99,17 +99,53 @@ function! s:NM_cmd_show(words) let b:nm_raw_data = data call s:NM_cmd_show_mkfolds() + setlocal foldtext=NM_cmd_show_foldtext() + setlocal fillchars= + setlocal foldcolumn=5 exec printf("nnoremap q :b %d", bufnr) endfunction function! s:NM_cmd_show_mkfolds() + let msg_start = -1 + let hdr_start = -1 + let bdy_start = -1 + let prt_start = -1 let modetype = '' let modeline = -1 let lnum = 1 + let b:nm_fold_data = {} while lnum <= line('$') let line = getline(lnum) - if modetype == '' + if match(line, s:notmuch_show_message_begin_regexp) != -1 + let msg_start = lnum + elseif match(line, s:notmuch_show_message_end_regexp) != -1 + exec printf('%d,%dfold', msg_start, lnum) + exec printf('%dfoldopen', msg_start) + let b:nm_fold_data[msg_start] = ['msg', getline(msg_start)] + + elseif match(line, s:notmuch_show_header_begin_regexp) != -1 + let hdr_start = lnum + elseif match(line, s:notmuch_show_header_end_regexp) != -1 + exec printf('%d,%dfold', hdr_start, lnum) + exec printf('%dfoldclose', hdr_start) + let b:nm_fold_data[hdr_start] = ['hdr', '* ' . getline(hdr_start+1) . ' [ Press "h" for full header. ]'] + + elseif match(line, s:notmuch_show_body_begin_regexp) != -1 + let bdy_start = lnum + elseif match(line, s:notmuch_show_body_end_regexp) != -1 + exec printf('%d,%dfold', bdy_start, lnum) + exec printf('%dfoldopen', bdy_start) + let b:nm_fold_data[bdy_start] = ['bdy', getline(bdy_start)] + + elseif match(line, s:notmuch_show_part_begin_regexp) != -1 + let prt_start = lnum + elseif match(line, s:notmuch_show_part_end_regexp) != -1 + exec printf('%d,%dfold', prt_start, lnum) + exec printf('%dfoldopen', prt_start) + let b:nm_fold_data[msg_start] = ['msg', getline(prt_start)] + + elseif modetype == '' if match(line, s:notmuch_show_signature_regexp) != -1 let modetype = 'sig' let modeline = lnum @@ -120,13 +156,16 @@ function! s:NM_cmd_show_mkfolds() elseif modetype == 'cit' if match(line, s:notmuch_show_citation_regexp) == -1 exec printf('%d,%dfold', modeline, lnum) + let b:nm_fold_data[modeline] = [modetype, printf('[ %d-line citation. Press "c" to show. ]', lnum - modeline)] let modetype = '' endif elseif modetype == 'sig' if (lnum - modeline) > s:notmuch_show_signature_lines_max let modetype = '' elseif match(line, s:notmuch_show_part_end_regexp) != -1 - exec printf('%d,%dfold', modeline, lnum) + let modeline2 = lnum - 1 + exec printf('%d,%dfold', modeline, modeline2) + let b:nm_fold_data[modeline] = [modetype, printf('[ %d-line signature. Press "s" to show. ]', modeline2 - modeline)] let modetype = '' endif endif @@ -135,6 +174,10 @@ function! s:NM_cmd_show_mkfolds() endwhile endfunction +function! NM_cmd_show_foldtext() + return b:nm_fold_data[v:foldstart][1] +endfunction + " --- helper functions diff --git a/vim/syntax/notmuch-search.vim b/vim/syntax/notmuch-search.vim index eb7d88fa..4b694722 100644 --- a/vim/syntax/notmuch-search.vim +++ b/vim/syntax/notmuch-search.vim @@ -2,10 +2,10 @@ " TODO: I cannot figure out why nmSearchTags is not matching anything :( -syntax region nmSearchDate start="^" end="\%13v" -syntax region nmSearchCountAndFrom start="\%14v\[" end=";" oneline contains=nmSearchCount,nmSearchFrom +syntax region nmSearchDate start='^' end='\%13v' +syntax region nmSearchCountAndFrom start='\%14v\[' end=';' oneline contains=nmSearchCount,nmSearchFrom syntax match nmSearchFrom ' .*;' contained -syntax region nmSearchCount start="\%14v\[" end="\]" contained contains=nmSearchCountZero,nmSearchCountSome,nmSearchCountAll +syntax region nmSearchCount start='\%14v\[' end='\]' contained contains=nmSearchCountZero,nmSearchCountSome,nmSearchCountAll syntax match nmSearchCountZero '0/\(\d\+\)' contained syntax match nmSearchCountSome '\([1-9]\d*\)/\(\d\+\)' contained syntax match nmSearchCountAll '\(\d\+\)/\1' contained diff --git a/vim/syntax/notmuch-show.vim b/vim/syntax/notmuch-show.vim index 06dd2ea2..02e12e99 100644 --- a/vim/syntax/notmuch-show.vim +++ b/vim/syntax/notmuch-show.vim @@ -1,13 +1,20 @@ " notmuch show mode syntax file -syntax region nmShowMessage start=" message{" end=" message}" contains=nmShowHeader,nmShowBody,nmShowAttachment,nmShowPart -syntax region nmShowHeader start=" header{" end=" header}" contained -syntax region nmShowBody start=" body{" end=" body}" contained contains=nmShowAttachment,nmShowPart -syntax region nmShowAttachment start=" attachment{" end=" attachment}" contained -syntax region nmShowPart start=" part{" end=" part}" contained +syntax region nmShowMessage start=' message{' end=' message}' contains=nmBlockStart,nmShowHeader,nmShowBody,nmShowAttachment,nmShowPart,nmBlockEnd +syntax region nmShowHeader start=' header{' end=' header}' contained contains=nmBlockStart,nmBlockEnd +syntax region nmShowBody start=' body{' end=' body}' contained contains=nmBlockStart,nmShowAttachment,nmShowPart,nmBlockEnd +syntax region nmShowAttachment start=' attachment{' end=' attachment}' contained contains=nmBlockStart,nmBlockEnd +syntax region nmShowPart start=' part{' end=' part}' contained contains=nmBlockStart,nmBlockEnd + +syntax region nmBlockStart start='^ [a-z]\+{' end='$' oneline +syntax region nmBlockEnd start='^ [a-z]\+}' end='$' oneline highlight link nmShowMessage Error highlight link nmShowHeader Type highlight link nmShowBody Statement highlight link nmShowAttachment Statement highlight link nmShowPart String +highlight link nmBlockStart Ignore +highlight link nmBlockEnd Ignore + +highlight Folded term=reverse ctermfg=LightGrey ctermbg=Black guifg=LightGray guibg=Black