blob: bb710e597c493e9e47c7693775540a5c682c2ab0 [file] [log] [blame]
Bram Moolenaar8c8de832008-06-24 22:58:06 +00001" Vim filetype plugin file (GUI menu and folding)
Bram Moolenaar00a927d2010-05-14 23:24:24 +02002" Language: Debian control files
Bram Moolenaar72540672018-02-09 22:00:53 +01003" Maintainer: Debian Vim Maintainers
Bram Moolenaar00a927d2010-05-14 23:24:24 +02004" Former Maintainer: Pierre Habouzit <madcoder@debian.org>
Bram Moolenaarbe4e0162023-02-02 13:59:48 +00005" Last Change: 2023 Jan 16
6" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debcontrol.vim
Bram Moolenaar8c8de832008-06-24 22:58:06 +00007
8" Do these settings once per buffer
Bram Moolenaar85eee132018-05-06 17:57:30 +02009if exists('b:did_ftplugin')
Bram Moolenaar8c8de832008-06-24 22:58:06 +000010 finish
11endif
12let b:did_ftplugin=1
13
14" {{{1 Local settings (do on every load)
Bram Moolenaar85eee132018-05-06 17:57:30 +020015if exists('g:debcontrol_fold_enable')
Bram Moolenaar8c8de832008-06-24 22:58:06 +000016 setlocal foldmethod=expr
17 setlocal foldexpr=DebControlFold(v:lnum)
18 setlocal foldtext=DebControlFoldText()
19endif
20setlocal textwidth=0
21
22" Clean unloading
Bram Moolenaar85eee132018-05-06 17:57:30 +020023let b:undo_ftplugin = 'setlocal tw< foldmethod< foldexpr< foldtext<'
Bram Moolenaar8c8de832008-06-24 22:58:06 +000024
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)
Bram Moolenaar85eee132018-05-06 17:57:30 +020035 if line ==# ''
Bram Moolenaar8c8de832008-06-24 22:58:06 +000036 return 'unknown'
37 endif
38 endwhile
39 return substitute(line, '^'.a:f.': *', '', '')
40endfunction
41
42function! DebControlFoldText()
Bram Moolenaar85eee132018-05-06 17:57:30 +020043 if v:folddashes ==# '-' " debcontrol entry fold
Bram Moolenaar8c8de832008-06-24 22:58:06 +000044 let type = substitute(getline(v:foldstart), ':.*', '', '')
Bram Moolenaar85eee132018-05-06 17:57:30 +020045 if type ==# 'Source'
Bram Moolenaar8c8de832008-06-24 22:58:06 +000046 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
Bram Moolenaar85eee132018-05-06 17:57:30 +020059 if getline(a:l) =~# '^Source:'
Bram Moolenaar8c8de832008-06-24 22:58:06 +000060 return '>1'
61 endif
62
Bram Moolenaar85eee132018-05-06 17:57:30 +020063 if getline(a:l) =~# '^Package:'
Bram Moolenaar8c8de832008-06-24 22:58:06 +000064 return '>1'
65 endif
66
67 return '='
68endfunction
69
70" }}}1