1" Vim filetype plugin file (GUI menu and folding)
2" Language:     Debian control files
3" Maintainer:   Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
4" Former Maintainer:    Pierre Habouzit <madcoder@debian.org>
5" Last Change:  2008-03-08
6" URL:          http://hg.debian.org/hg/pkg-vim/vim/raw-file/tip/runtime/ftplugin/debcontrol.vim
7
8" Do these settings once per buffer
9if exists("b:did_ftplugin")
10  finish
11endif
12let b:did_ftplugin=1
13
14" {{{1 Local settings (do on every load)
15if exists("g:debcontrol_fold_enable")
16  setlocal foldmethod=expr
17  setlocal foldexpr=DebControlFold(v:lnum)
18  setlocal foldtext=DebControlFoldText()
19endif
20setlocal textwidth=0
21
22" Clean unloading
23let b:undo_ftplugin = "setlocal tw< foldmethod< foldexpr< foldtext<"
24
25" }}}1
26
27" {{{1 folding
28
29function! s:getField(f, lnum)
30  let line = getline(a:lnum)
31  let fwdsteps = 0
32  while line !~ '^'.a:f.':'
33    let fwdsteps += 1
34    let line = getline(a:lnum + fwdsteps)
35    if line == ''
36      return 'unknown'
37    endif
38  endwhile
39  return substitute(line, '^'.a:f.': *', '', '')
40endfunction
41
42function! DebControlFoldText()
43  if v:folddashes == '-'  " debcontrol entry fold
44    let type = substitute(getline(v:foldstart), ':.*', '', '')
45    if type == 'Source'
46      let ftext = substitute(foldtext(), ' *Source: *', ' ', '')
47      return ftext . ' -- ' . s:getField('Maintainer', v:foldstart) . ' '
48    endif
49    let arch  = s:getField('Architecture', v:foldstart)
50    let ftext = substitute(foldtext(), ' *Package: *', ' [' . arch . '] ', '')
51    return ftext . ': ' . s:getField('Description', v:foldstart) . ' '
52  endif
53  return foldtext()
54endfunction
55
56function! DebControlFold(l)
57
58  " This is for not merging blank lines around folds to them
59  if getline(a:l) =~ '^Source:'
60    return '>1'
61  endif
62
63  if getline(a:l) =~ '^Package:'
64    return '>1'
65  endif
66
67  return '='
68endfunction
69
70" }}}1
71