summaryrefslogtreecommitdiffstats
path: root/syntax/spec.vim
blob: 57a390ddcabd045ef68da1e5984844d32265d58b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
" Filename:    spec.vim
" Purpose:     Vim syntax file
" Language:    SPEC: Build/install scripts for Linux RPM packages
" Maintainer:  Will Woods <wwoods@redhat.com>
" Last Change: Tue Mar 29 11:38:02 EDT 2011

if exists("b:current_syntax")
  finish
endif

syn case match
syn sync minlines=1000 " kinda dumb but specfiles are never *that* long

" include sh for the script regions
let b:is_bash=1
syntax include @Shell syntax/sh.vim
unlet b:current_syntax

" comments
syn region specComment start=/^\s*#/ end=/$/ contains=specTodo
syn keyword specTodo contained FIXME NOTE TODO NOTES XXX HACK

" general stuff
syn match specURL '\%(https\?\|ftp\)://\S\+' contains=specMacro
syn match specContinue '\\$'
syn match specVersion contained '\s\%(\d\+:\)\?\d\+\%(\.\d\+\)*\%(-\d[^- ,]*\)\?'

" preamble / RPM headers
syn match specRPMHeader '^\%(Name\|Group\|Summary\|BuildRoot\|Source\d*\|Patch\d*\|URL\):'
syn match specRPMHeader '^\%(Version\|Release\):' nextgroup=specVersion
syn match specRPMHeader '^\%(Provides\|Requires\%((\%(pre\|post\|preun\|postun\))\)\?\|Conflicts\|Obsoletes\|BuildRequires\|BuildConflicts\):' nextgroup=specPRCO
syn match specPRCOOperator '[<>!]\?='
syn match specPRCO contained '.*' contains=specPRCOOperator,specVersion,specMacro,specContinue
syn match specRPMHeader '^License:\s*' nextgroup=specRPMLicenseInfo
syn match specRPMLicenseInfo contained '.*' contains=specLicense
syn match specRPMHeader '^\%(Auto\%(Req\|Prov\)\|\%(Build\|Exclusive\)\%(Arch\|OS\)\):'

" common / builtin macro names
syn keyword specMacroNames contained arm ix86 sparc nil name version release dist optflags
syn keyword specMacroNames contained buildroot _sysconfdir _prefix _exec_prefix _bindir _libdir _libexecdir _sbindir _sharedstatedir _datarootdir _datadir _includedir _infodir _mandir _localstatedir _initddir _var _usr _tmppath _usrsrc _lib _docdir
syn keyword specMacroNames contained _topdir _builddir _rpmdir _sourcedir _specdir _srcrpmdir _buildrootdir
" simple macros
syn match specMacroSym '%' contained
syn match specMacro '%[*#]' contains=specMacroSym
syn match specMacro '%\w\+' contains=specMacroNames,specMacroSym
" more complex macros
" TODO: handle %{identifier:value} better
syn region specMacro matchgroup=specMacroSym start='%{' end='}' contains=specMacroMod,specMacroNames,specMacroBuiltin,specMacro
syn match specMacroMod contained '\%(?\|!\|!?\|:\)'
syn match specMacroBuiltin contained '\%(echo\|warn\|error\|uncompress\|expand\|[SPF]\)\s*:' contains=specMacroMod
syn region specMacro matchgroup=specMacroSym start='%(' end=')' contains=@Shell,specMacro

" macro commands
syn match specMacroCommands '%\%(patch\d*\|configure\|find_lang\|makeinstall\|setup\)'
syn match specMacroCommands '%{\%(patch\d*\|configure\|find_lang\|makeinstall\|setup\)}'

" define/control
syn match specDefine '%\%(define\|undefine\|global\)' nextgroup=specIdentifier skipwhite
syn match specIdentifier '[A-Za-z0-9_]\+' contained nextgroup=specDefinition skipwhite
syn match specDefinition '.*$' contained contains=specMacro,specVersion,specContinue
syn match specControl '^%\%(ifnarch\|ifarch\|if\)' skipwhite nextgroup=specCondition
syn match specCondition '.*$' contained contains=specMacro,specVersion,specContinue,specPRCOOperator,specMacroMod
syn match specControl '^%\%(else\|endif\)\>'

" section markers
syn match specSectionMarker '^%\%(description\|files\|package\|prep\|build\|install\|clean\|pre\|post\|preun\|postun\|posttrans\|changelog\)\>'
" shell sections
syn region specSectionShell matchgroup=specSectionMarker start='^%\%(prep\|build\|install\|clean\|preun\|postun\|posttrans\|pre\|post\|changelog\)' end='^%\%(description\|files\|package\|prep\|build\|install\|clean\|preun\|postun\|posttrans\|pre\|post\|changelog\)\>'me=s-1 contains=specMacro,specMacroNames,specControl,specDefine,specMacroCommands,@Shell
" changelog section
syn region specChangeLog matchgroup=specSectionMarker start='^%changelog\>' end='^%' contains=specChangelogHeader,specURL,specBugID


" This covers the most common licenses in Fedora
syn keyword specLicense contained AFL BSD CC0 CDDL CeCILL FTL GFDL ISC MIT NCSA OFL PHP SISSL TCL TORQUEv1.1 UCD W3C ZPLv2.1
syn keyword specLicense contained Boost ImageMagick Lucida Netscape OpenPBS OpenSSL PostgreSQL Python Ruby Utopia wxWidgets zlib
syn match specLicense contained '\<\([CEMQST]\|ER\|LP\|NG\|WTF\)PL\>'
syn match specLicense contained '\<[AL]\?GPL\(v[23]\)\?+\?\( with exceptions\?\| or Artistic\)\?'
syn match specLicense contained '\<\(ASL \(1.[01]\|2.0\)\>\|Artistic \(clarified\|2.0\)\|MPLv1.[01]\)\>'
syn match specLicense contained '\<CC-BY\(-SA\|-ND\)\?\>'
syn match specLicense contained '\<\(MIT\|BSD\) with advertising\>'
syn match specLicense contained '\<\(Public Domain\|Copyright only\|Freely redistributable without restriction\|Redistributable, no modification permitted\)\>'

" Changelog stuff
syn keyword specWeekday contained Mon Tue Wed Thu Fri Sat Sun
syn keyword specWeekday contained Monday Tuesday Wednesday Thursday Friday Saturday Sunday
syn keyword specMonth   contained Jan Feb Mar Apr Jun Jul Aug Sep Oct Nov Dec
syn keyword specMonth   contained January February March April May June July August September October November December
syn match specDate      contained '\u\l\+ \+\u\l\+ \+\d\d\? \+\d\d\d\d' contains=specWeekday,specMonth
syn match specEmail     contained '<.\+>'
syn match specEmail     contained "<\?\S\+@\%([A-Za-z0-9_-]\+\.\)\+\a\+>\?"
syn match specChangelogHeader contained '^\*.*$' contains=specDate,specEmail,specVersion

syn match specBugID contained '\%([Bb]ug\|\a*[Bb][Zz]\)[ #]*\d\+'

"####################################

" Define the default highlighting.
hi def link specComment             Comment
hi def link specTodo                Todo
hi def link specRPMHeader           Statement
hi def link specDefine              PreProc
hi def link specControl             Identifier
hi def link specMacroCommands       Macro
hi def link specIdentifier          Identifier
hi def link specMacroSym            Special
hi def link specMacroMod            Operator
hi def link specSectionMarker       Structure
hi def link specURL                 PreProc
hi def link specEmail               PreProc
hi def link specVersion             Constant
hi def link specBugID               Constant
hi def link specPRCOOperator        Operator
hi def link specContinue            Operator
hi def link specDate                String
hi def link specLicense             String

" yes, it's ugly, but white is sooo cool
if &background == "dark"
  hi def specMacroNames             ctermfg=white
else
  hi def link specMacroNames        Identifier
endif

  "colors mapped onto other things
hi def link specRPMHeaderSimple     specRPMHeader
hi def link specRPMHeaderVersion    specRPMHeader
hi def link specMacroBuiltin        specMacroNames
hi def link specWeekday             specDate
hi def link specMonth               specDate

let b:current_syntax = "spec"