1" Vim syntax file
2" Language:    Debian control files
3" Maintainer:  Debian Vim Maintainers
4" Former Maintainers: Gerfried Fuchs <[email protected]>
5"                     Wichert Akkerman <[email protected]>
6" Last Change: 2020 Oct 26
7" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim
8
9" Standard syntax initialization
10if exists('b:current_syntax')
11  finish
12endif
13
14let s:cpo_save = &cpo
15set cpo&vim
16
17" Should match case except for the keys of each field
18syn case match
19
20syn iskeyword @,48-57,-,/
21
22" Everything that is not explicitly matched by the rules below
23syn match debcontrolElse "^.*$"
24
25" Common seperators
26syn match debControlComma ",[ \t]*"
27syn match debControlSpace "[ \t]"
28
29let s:kernels = ['linux', 'hurd', 'kfreebsd', 'knetbsd', 'kopensolaris', 'netbsd']
30let s:archs = [
31      \ 'alpha', 'amd64', 'armeb', 'armel', 'armhf', 'arm64', 'avr32', 'hppa'
32      \, 'i386', 'ia64', 'lpia', 'm32r', 'm68k', 'mipsel', 'mips64el', 'mips'
33      \, 'powerpcspe', 'powerpc', 'ppc64el', 'ppc64', 'riscv64', 's390x', 's390', 'sh3eb'
34      \, 'sh3', 'sh4eb', 'sh4', 'sh', 'sparc64', 'sparc', 'x32'
35      \ ]
36let s:pairs = [
37      \ 'hurd-i386', 'kfreebsd-i386', 'kfreebsd-amd64', 'knetbsd-i386'
38      \, 'kopensolaris-i386', 'netbsd-alpha', 'netbsd-i386'
39      \ ]
40
41" Define some common expressions we can use later on
42syn keyword debcontrolArchitecture contained all any
43exe 'syn keyword debcontrolArchitecture contained '. join(map(copy(s:kernels), {k,v -> v .'-any'}))
44exe 'syn keyword debcontrolArchitecture contained '. join(map(copy(s:archs), {k,v -> 'any-'.v}))
45exe 'syn keyword debcontrolArchitecture contained '. join(s:archs)
46exe 'syn keyword debcontrolArchitecture contained '. join(s:pairs)
47
48unlet s:kernels s:archs s:pairs
49
50" Keep in sync with https://metadata.ftp-master.org/sections.822
51" curl -q https://metadata.ftp-master.debian.org/sections.822 2>/dev/null| grep-dctrl -n --not -FSection -sSection  / -
52let s:sections = [
53      \ 'admin', 'cli-mono', 'comm', 'database', 'debian-installer', 'debug'
54      \, 'devel', 'doc', 'editors', 'education', 'electronics', 'embedded'
55      \, 'fonts', 'games', 'gnome', 'gnu-r', 'gnustep', 'golang', 'graphics'
56      \, 'hamradio', 'haskell', 'httpd', 'interpreters', 'introspection'
57      \, 'java', 'javascript', 'kde', 'kernel', 'libdevel', 'libs', 'lisp'
58      \, 'localization', 'mail', 'math', 'metapackages', 'misc', 'net', 'news'
59      \, 'ocaml', 'oldlibs', 'otherosfs', 'perl', 'php', 'python', 'raku'
60      \, 'ruby', 'rust', 'science', 'shells', 'sound', 'tasks', 'tex', 'text'
61      \, 'utils', 'vcs', 'video', 'web', 'x11', 'xfce', 'zope'
62      \ ]
63
64syn keyword debcontrolMultiArch contained no foreign allowed same
65syn match debcontrolName contained "[a-z0-9][a-z0-9+.-]\+"
66syn keyword debcontrolPriority contained extra important optional required standard
67exe 'syn match debcontrolSection contained "\%(\%(contrib\|non-free\|non-US/main\|non-US/contrib\|non-US/non-free\|restricted\|universe\|multiverse\)/\)\=\<\%('.join(s:sections, '\|').'\)\>"'
68syn keyword debcontrolPackageType contained udeb deb
69syn match debcontrolVariable contained "\${.\{-}}"
70syn keyword debcontrolDmUpload contained yes
71syn keyword debcontrolYesNo contained yes no
72syn match debcontrolR3 contained "\<\%(no\|binary-targets\|[[:graph:]]\+/[[:graph:]]\+\%( \+[[:graph:]]\+/[[:graph:]]\+\)*\)\>"
73
74unlet s:sections
75
76" A URL (using the domain name definitions from RFC 1034 and 1738), right now
77" only enforce protocol and some sanity on the server/path part;
78syn match debcontrolHTTPUrl contained "\vhttps?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
79syn match debcontrolVcsSvn contained "\vsvn%(\+ssh)?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
80syn match debcontrolVcsCvs contained "\v%(\-d *)?:pserver:[^@]+\@[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?:/[^[:space:]]*%( [^[:space:]]+)?$"
81syn match debcontrolVcsGit contained "\v%(git|https?)://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?%(\s+-b\s+[^ ~^:?*[\\]+)?$"
82
83" An email address
84syn match	debcontrolEmail	"[_=[:alnum:]\.+-]\+@[[:alnum:]\./\-]\+"
85syn match	debcontrolEmail	"<.\{-}>"
86
87" #-Comments
88syn match debcontrolComment "^#.*$" contains=@Spell
89
90syn case ignore
91
92" Handle all fields from deb-src-control(5)
93
94" Fields for which we do strict syntax checking
95syn region debcontrolStrictField matchgroup=debcontrolKey start="^Architecture: *" end="$" contains=debcontrolArchitecture,debcontrolSpace oneline
96syn region debcontrolStrictField matchgroup=debcontrolKey start="^Multi-Arch: *" end="$" contains=debcontrolMultiArch oneline
97syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Package\|Source\): *" end="$" contains=debcontrolName oneline
98syn region debcontrolStrictField matchgroup=debcontrolKey start="^Priority: *" end="$" contains=debcontrolPriority oneline
99syn region debcontrolStrictField matchgroup=debcontrolKey start="^Section: *" end="$" contains=debcontrolSection oneline
100syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XC-\)\=Package-Type: *" end="$" contains=debcontrolPackageType oneline
101syn region debcontrolStrictField matchgroup=debcontrolKey start="^Homepage: *" end="$" contains=debcontrolHTTPUrl oneline keepend
102syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\): *" end="$" contains=debcontrolHTTPUrl oneline keepend
103syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Svn: *" end="$" contains=debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend
104syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Cvs: *" end="$" contains=debcontrolVcsCvs oneline keepend
105syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Git: *" end="$" contains=debcontrolVcsGit oneline keepend
106syn region debcontrolStrictField matchgroup=debcontrolKey start="^Rules-Requires-Root: *" end="$" contains=debcontrolR3 oneline
107syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Build-\)\=Essential: *" end="$" contains=debcontrolYesNo oneline
108
109syn region debcontrolStrictField matchgroup=debcontrolDeprecatedKey start="^\%(XS-\)\=DM-Upload-Allowed: *" end="$" contains=debcontrolDmUpload oneline
110
111" Catch-all for the other legal fields
112syn region debcontrolField matchgroup=debcontrolKey start="^\%(\%(XSBC-Original-\)\=Maintainer\|Standards-Version\|Bugs\|Origin\|X[SB]-Python-Version\|\%(XS-\)\=Vcs-Mtn\|\%(XS-\)\=Testsuite\%(-Triggers\)\=\|Build-Profiles\|Tag\|Subarchitecture\|Kernel-Version\|Installer-Menu-Item\): " end="$" contains=debcontrolVariable,debcontrolEmail oneline
113syn region debcontrolMultiField matchgroup=debcontrolKey start="^\%(Build-\%(Conflicts\|Depends\)\%(-Arch\|-Indep\)\=\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Breaks\|Enhances\|Replaces\|Conflicts\|Provides\|Built-Using\|Uploaders\|X[SBC]\{0,3\}\%(Private-\)\=-[-a-zA-Z0-9]\+\): *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment
114syn region debcontrolMultiFieldSpell matchgroup=debcontrolKey start="^Description: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment,@Spell
115
116" Associate our matches and regions with pretty colours
117hi def link debcontrolKey           Keyword
118hi def link debcontrolField         Normal
119hi def link debcontrolStrictField   Error
120hi def link debcontrolDeprecatedKey Error
121hi def link debcontrolMultiField    Normal
122hi def link debcontrolArchitecture  Normal
123hi def link debcontrolMultiArch     Normal
124hi def link debcontrolName          Normal
125hi def link debcontrolPriority      Normal
126hi def link debcontrolSection       Normal
127hi def link debcontrolPackageType   Normal
128hi def link debcontrolVariable      Identifier
129hi def link debcontrolEmail         Identifier
130hi def link debcontrolVcsSvn        Identifier
131hi def link debcontrolVcsCvs        Identifier
132hi def link debcontrolVcsGit        Identifier
133hi def link debcontrolHTTPUrl       Identifier
134hi def link debcontrolDmUpload      Identifier
135hi def link debcontrolYesNo         Identifier
136hi def link debcontrolR3            Identifier
137hi def link debcontrolComment       Comment
138hi def link debcontrolElse          Special
139
140let b:current_syntax = 'debcontrol'
141
142let &cpo = s:cpo_save
143unlet s:cpo_save
144
145" vim: ts=8 sw=2
146