ftplugin/PEM/folding.vim
changeset 0 f37ff08522ed
equal deleted inserted replaced
-1:000000000000 0:f37ff08522ed
       
     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 "}}}