1 " vim: foldmethod=marker |
|
2 set foldmethod=expr |
|
3 set foldexpr=GetPEMfold(v:lnum) |
|
4 set foldtext=SetFoldTextCN() |
|
5 |
|
6 function! GetPEMfold(lnum) |
|
7 "{{{1 |
|
8 if getline(a:lnum) =~? '\v^\s*$' |
|
9 return '-1' |
|
10 elseif getline(a:lnum) =~? '\v^certificate:' |
|
11 return '>1' |
|
12 elseif getline(a:lnum) =~? '\v^-{5}begin\scertificate-{5}' |
|
13 return '>1' |
|
14 endif |
|
15 |
|
16 let this_indent = GetShiftLevel(a:lnum) |
|
17 let next_indent = GetShiftLevel(GetNonBlankLines(a:lnum)) |
|
18 let begin_cert = GetShiftLevel(GetBeginCertificate(a:lnum)) |
|
19 |
|
20 if this_indent == begin_cert |
|
21 return '1' |
|
22 elseif this_indent == next_indent || this_indent > next_indent |
|
23 return this_indent |
|
24 elseif this_indent < next_indent |
|
25 return '>' . next_indent |
|
26 endif |
|
27 |
|
28 endfunction |
|
29 "}}} |
|
30 |
|
31 function! GetShiftLevel(lnum) |
|
32 "{{{1 |
|
33 "return indent(a:lnum) / &shiftwidth |
|
34 return indent(a:lnum) / 4 |
|
35 endfunction |
|
36 "}}} |
|
37 |
|
38 function! GetNonBlankLines(lnum) |
|
39 "{{{1 |
|
40 let numlines = line('$') |
|
41 let current = a:lnum + 1 |
|
42 |
|
43 while current <= numlines |
|
44 if getline(current) =~? '\v\S' |
|
45 return current |
|
46 endif |
|
47 |
|
48 let current += 1 |
|
49 |
|
50 endwhile |
|
51 |
|
52 return -2 |
|
53 endfunction |
|
54 "}}} |
|
55 |
|
56 function! GetBeginCertificate(lnum) |
|
57 "{{{1 |
|
58 let numlines = line('$') |
|
59 let current = a:lnum + 1 |
|
60 |
|
61 while current <= numlines |
|
62 if getline(current) =~? '\v^-{5}begin\scertificate-{5}' |
|
63 return current |
|
64 endif |
|
65 |
|
66 let current += 1 |
|
67 endwhile |
|
68 |
|
69 endfunction |
|
70 "}}} |
|
71 |
|
72 function! SetFoldTextCN() |
|
73 "{{{1 |
|
74 |
|
75 let line = getline(v:foldstart) |
|
76 let lines_count = v:foldend - v:foldstart + 1 |
|
77 let lines_count_text = '| ' . printf("%10s", lines_count . ' lines') . ' |' |
|
78 let foldchar = matchstr(&fillchars, 'fold:\zs.') |
|
79 let foldtextstart = strpart('+' . repeat(foldchar, v:foldlevel*2) . line, 0, (winwidth(0)*2)/3) |
|
80 let foldtextend = lines_count_text . repeat(foldchar, 8) |
|
81 |
|
82 if match( line, 'Certificate:.*' ) == 0 |
|
83 let current = line + 1 |
|
84 |
|
85 while current <= lines_count |
|
86 if ( getline(current) =~? 'CN=.*') |
|
87 let inLine = getline(current) |
|
88 let CName = substitute( inLine, '.*CN=\(.*$\)', "\\1", 'g') |
|
89 endif |
|
90 let current += 1 |
|
91 endwhile |
|
92 |
|
93 let foldtextlength = strlen(substitute(foldtextstart . CName . foldtextend, '.', 'x', 'g')) + &foldcolumn |
|
94 return foldtextstart . ' ' . CName . repeat(foldchar, winwidth(0)-foldtextlength-1) . foldtextend |
|
95 |
|
96 else |
|
97 let foldtextlength = strlen(substitute(foldtextstart . foldtextend, '.', 'x', 'g')) + &foldcolumn |
|
98 return foldtextstart . repeat(foldchar, winwidth(0)-foldtextlength) . foldtextend |
|
99 endif |
|
100 |
|
101 endfunction |
|
102 "}}} |
|