1" Vim filetype plugin file (GUI menu and folding)
2" Language:     Debian control files
3" Maintainer:   Debian Vim Maintainers
4" Former Maintainer:    Pierre Habouzit <[email protected]>
5" Last Change:  2018-01-28
6" URL:          https://salsa.debian.org/vim-team/vim-debian/blob/master/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