1" Filename:    spec.vim
2" Purpose:     Vim syntax file
3" Language:    SPEC: Build/install scripts for Linux RPM packages
4" Maintainer:  Donovan Rebbechi elflord@panix.com
5" Last Change: Fri Dec 3 11:54 EST 2004 Marcin Dalecki
6
7" For version 5.x: Clear all syntax items
8" For version 6.x: Quit when a syntax file was already loaded
9if version < 600
10  syntax clear
11elseif exists("b:current_syntax")
12  finish
13endif
14
15syn sync minlines=1000
16
17syn match specSpecialChar contained '[][!$()\\|>^;:{}]'
18syn match specColon       contained ':'
19syn match specPercent     contained '%'
20
21syn match specVariables   contained '\$\h\w*' contains=specSpecialVariablesNames,specSpecialChar
22syn match specVariables   contained '\${\w*}' contains=specSpecialVariablesNames,specSpecialChar
23
24syn match specMacroIdentifier contained '%\h\w*' contains=specMacroNameLocal,specMacroNameOther,specPercent
25syn match specMacroIdentifier contained '%{\w*}' contains=specMacroNameLocal,specMacroNameOther,specPercent,specSpecialChar
26
27syn match specSpecialVariables contained '\$[0-9]\|\${[0-9]}'
28syn match specCommandOpts      contained '\s\(-\w\+\|--\w[a-zA-Z_-]\+\)'ms=s+1
29syn match specComment '^\s*#.*$'
30
31
32syn case match
33
34
35"matches with no highlight
36syn match specNoNumberHilite 'X11\|X11R6\|[a-zA-Z]*\.\d\|[a-zA-Z][-/]\d'
37syn match specManpageFile '[a-zA-Z]\.1'
38
39"Day, Month and most used license acronyms
40syn keyword specLicense contained GPL LGPL BSD MIT GNU
41syn keyword specWeekday contained Mon Tue Wed Thu Fri Sat Sun
42syn keyword specMonth   contained Jan Feb Mar Apr Jun Jul Aug Sep Oct Nov Dec
43syn keyword specMonth   contained January February March April May June July August September October November December
44
45"#, @, www
46syn match specNumber '\(^-\=\|[ \t]-\=\|-\)[0-9.-]*[0-9]'
47syn match specEmail contained "<\=\<[A-Za-z0-9_.-]\+@\([A-Za-z0-9_-]\+\.\)\+[A-Za-z]\+\>>\="
48syn match specURL      contained '\<\(\(https\{0,1}\|ftp\)://\|\(www[23]\{0,1}\.\|ftp\.\)\)[A-Za-z0-9._/~:,#-]\+\>'
49syn match specURLMacro contained '\<\(\(https\{0,1}\|ftp\)://\|\(www[23]\{0,1}\.\|ftp\.\)\)[A-Za-z0-9._/~:,#%{}-]\+\>' contains=specMacroIdentifier
50
51"TODO take specSpecialVariables out of the cluster for the sh* contains (ALLBUT)
52"Special system directories
53syn match specListedFilesPrefix contained '/\(usr\|local\|opt\|X11R6\|X11\)/'me=e-1
54syn match specListedFilesBin    contained '/s\=bin/'me=e-1
55syn match specListedFilesLib    contained '/\(lib\|include\)/'me=e-1
56syn match specListedFilesDoc    contained '/\(man\d*\|doc\|info\)\>'
57syn match specListedFilesEtc    contained '/etc/'me=e-1
58syn match specListedFilesShare  contained '/share/'me=e-1
59syn cluster specListedFiles contains=specListedFilesBin,specListedFilesLib,specListedFilesDoc,specListedFilesEtc,specListedFilesShare,specListedFilesPrefix,specVariables,specSpecialChar
60
61"specComands
62syn match   specConfigure  contained '\./configure'
63syn match   specTarCommand contained '\<tar\s\+[cxvpzIf]\{,5}\s*'
64syn keyword specCommandSpecial contained root
65syn keyword specCommand		contained make xmkmf mkdir chmod ln find sed rm strip moc echo grep ls rm mv mkdir install cp pwd cat tail then else elif cd gzip rmdir ln eval export touch
66syn cluster specCommands contains=specCommand,specTarCommand,specConfigure,specCommandSpecial
67
68"frequently used rpm env vars
69syn keyword specSpecialVariablesNames contained RPM_BUILD_ROOT RPM_BUILD_DIR RPM_SOURCE_DIR RPM_OPT_FLAGS LDFLAGS CC CC_FLAGS CPPNAME CFLAGS CXX CXXFLAGS CPPFLAGS
70
71"valid macro names from /usr/lib/rpm/macros
72syn keyword specMacroNameOther contained buildroot buildsubdir distribution disturl ix86 name nil optflags perl_sitearch release requires_eq vendor version
73syn match   specMacroNameOther contained '\<\(PATCH\|SOURCE\)\d*\>'
74
75"valid _macro names from /usr/lib/rpm/macros
76syn keyword specMacroNameLocal contained _arch _binary_payload _bindir _build _build_alias _build_cpu _builddir _build_os _buildshell _buildsubdir _build_vendor _bzip2bin _datadir _dbpath _dbpath_rebuild _defaultdocdir _docdir _excludedocs _exec_prefix _fixgroup _fixowner _fixperms _ftpport _ftpproxy _gpg_path _gzipbin _host _host_alias _host_cpu _host_os _host_vendor _httpport _httpproxy _includedir _infodir _install_langs _install_script_path _instchangelog _langpatt _lib _libdir _libexecdir _localstatedir _mandir _netsharedpath _oldincludedir _os _pgpbin _pgp_path _prefix _preScriptEnvironment _provides _rpmdir _rpmfilename _sbindir _sharedstatedir _signature _sourcedir _source_payload _specdir _srcrpmdir _sysconfdir _target _target_alias _target_cpu _target_os _target_platform _target_vendor _timecheck _tmppath _topdir _usr _usrsrc _var _vendor
77
78
79"------------------------------------------------------------------------------
80" here's is all the spec sections definitions: PreAmble, Description, Package,
81"   Scripts, Files and Changelog
82
83"One line macros - valid in all ScriptAreas
84"tip: remember do include new items on specScriptArea's skip section
85syn region specSectionMacroArea oneline matchgroup=specSectionMacro start='^%\(define\|patch\d*\|setup\|configure\|GNUconfigure\|find_lang\|makeinstall\|include\)\>' end='$' contains=specCommandOpts,specMacroIdentifier
86syn region specSectionMacroBracketArea oneline matchgroup=specSectionMacro start='^%{\(configure\|GNUconfigure\|find_lang\|makeinstall\)}' end='$' contains=specCommandOpts,specMacroIdentifier
87
88"%% Files Section %%
89"TODO %config valid parameters: missingok\|noreplace
90"TODO %verify valid parameters: \(not\)\= \(md5\|atime\|...\)
91syn region specFilesArea matchgroup=specSection start='^%[Ff][Ii][Ll][Ee][Ss]\>' skip='%\(attrib\|defattr\|attr\|dir\|config\|docdir\|doc\|lang\|verify\|ghost\)\>' end='^%[a-zA-Z]'me=e-2 contains=specFilesOpts,specFilesDirective,@specListedFiles,specComment,specCommandSpecial,specMacroIdentifier
92"tip: remember to include new itens in specFilesArea above
93syn match  specFilesDirective contained '%\(attrib\|defattr\|attr\|dir\|config\|docdir\|doc\|lang\|verify\|ghost\)\>'
94
95"valid options for certain section headers
96syn match specDescriptionOpts contained '\s-[ln]\s*\a'ms=s+1,me=e-1
97syn match specPackageOpts     contained    '\s-n\s*\w'ms=s+1,me=e-1
98syn match specFilesOpts       contained    '\s-f\s*\w'ms=s+1,me=e-1
99
100
101syn case ignore
102
103
104"%% PreAmble Section %%
105"Copyright and Serial were deprecated by License and Epoch
106syn region specPreAmbleDeprecated oneline matchgroup=specError start='^\(Copyright\|Serial\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
107syn region specPreAmble oneline matchgroup=specCommand start='^\(Prereq\|Summary\|Name\|Version\|Packager\|Requires\|Icon\|URL\|Source\d*\|Patch\d*\|Prefix\|Packager\|Group\|License\|Release\|BuildRoot\|Distribution\|Vendor\|Provides\|ExclusiveArch\|ExcludeArch\|ExclusiveOS\|Obsoletes\|BuildArch\|BuildArchitectures\|BuildRequires\|BuildConflicts\|BuildPreReq\|Conflicts\|AutoRequires\|AutoReq\|AutoReqProv\|AutoProv\|Epoch\)' end='$' contains=specEmail,specURL,specURLMacro,specLicense,specColon,specVariables,specSpecialChar,specMacroIdentifier
108
109"%% Description Section %%
110syn region specDescriptionArea matchgroup=specSection start='^%description' end='^%'me=e-1 contains=specDescriptionOpts,specEmail,specURL,specNumber,specMacroIdentifier,specComment
111
112"%% Package Section %%
113syn region specPackageArea matchgroup=specSection start='^%package' end='^%'me=e-1 contains=specPackageOpts,specPreAmble,specComment
114
115"%% Scripts Section %%
116syn region specScriptArea matchgroup=specSection start='^%\(prep\|build\|install\|clean\|pre\|postun\|preun\|post\)\>' skip='^%{\|^%\(define\|patch\d*\|configure\|GNUconfigure\|setup\|find_lang\|makeinstall\)\>' end='^%'me=e-1 contains=specSpecialVariables,specVariables,@specCommands,specVariables,shDo,shFor,shCaseEsac,specNoNumberHilite,specCommandOpts,shComment,shIf,specSpecialChar,specMacroIdentifier,specSectionMacroArea,specSectionMacroBracketArea,shOperator,shQuote1,shQuote2
117
118"%% Changelog Section %%
119syn region specChangelogArea matchgroup=specSection start='^%changelog' end='^%'me=e-1 contains=specEmail,specURL,specWeekday,specMonth,specNumber,specComment,specLicense
120
121
122
123"------------------------------------------------------------------------------
124"here's the shell syntax for all the Script Sections
125
126
127syn case match
128
129
130"sh-like comment stile, only valid in script part
131syn match shComment contained '#.*$'
132
133syn region shQuote1 contained matchgroup=shQuoteDelim start=+'+ skip=+\\'+ end=+'+ contains=specMacroIdentifier
134syn region shQuote2 contained matchgroup=shQuoteDelim start=+"+ skip=+\\"+ end=+"+ contains=specVariables,specMacroIdentifier
135
136syn match shOperator contained '[><|!&;]\|[!=]='
137syn region shDo transparent matchgroup=specBlock start="\<do\>" end="\<done\>" contains=ALLBUT,shFunction,shDoError,shCase,specPreAmble,@specListedFiles
138
139syn region specIf  matchgroup=specBlock start="%ifosf\|%ifos\|%ifnos\|%ifarch\|%ifnarch\|%else"  end='%endif'  contains=ALLBUT, specIfError, shCase
140
141syn region  shIf transparent matchgroup=specBlock start="\<if\>" end="\<fi\>" contains=ALLBUT,shFunction,shIfError,shCase,@specListedFiles
142
143syn region  shFor  matchgroup=specBlock start="\<for\>" end="\<in\>" contains=ALLBUT,shFunction,shInError,shCase,@specListedFiles
144
145syn region shCaseEsac transparent matchgroup=specBlock start="\<case\>" matchgroup=NONE end="\<in\>"me=s-1 contains=ALLBUT,shFunction,shCaseError,@specListedFiles nextgroup=shCaseEsac
146syn region shCaseEsac matchgroup=specBlock start="\<in\>" end="\<esac\>" contains=ALLBUT,shFunction,shCaseError,@specListedFilesBin
147syn region shCase matchgroup=specBlock contained start=")"  end=";;" contains=ALLBUT,shFunction,shCaseError,shCase,@specListedFiles
148
149syn sync match shDoSync       grouphere  shDo       "\<do\>"
150syn sync match shDoSync       groupthere shDo       "\<done\>"
151syn sync match shIfSync       grouphere  shIf       "\<if\>"
152syn sync match shIfSync       groupthere shIf       "\<fi\>"
153syn sync match specIfSync     grouphere  specIf     "%ifarch\|%ifos\|%ifnos"
154syn sync match specIfSync     groupthere specIf     "%endIf"
155syn sync match shForSync      grouphere  shFor      "\<for\>"
156syn sync match shForSync      groupthere shFor      "\<in\>"
157syn sync match shCaseEsacSync grouphere  shCaseEsac "\<case\>"
158syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
159
160" Define the default highlighting.
161" For version 5.7 and earlier: only when not done already
162" For version 5.8 and later: only when an item doesn't have highlighting yet
163if version >= 508 || !exists("did_spec_syntax_inits")
164  if version < 508
165    let did_spec_syntax_inits = 1
166    command -nargs=+ HiLink hi link <args>
167  else
168    command -nargs=+ HiLink hi def link <args>
169  endif
170
171  "main types color definitions
172  HiLink specSection			Structure
173  HiLink specSectionMacro		Macro
174  HiLink specWWWlink			PreProc
175  HiLink specOpts			Operator
176
177  "yes, it's ugly, but white is sooo cool
178  if &background == "dark"
179    hi def specGlobalMacro		ctermfg=white
180  else
181    HiLink specGlobalMacro		Identifier
182  endif
183
184  "sh colors
185  HiLink shComment			Comment
186  HiLink shIf				Statement
187  HiLink shOperator			Special
188  HiLink shQuote1			String
189  HiLink shQuote2			String
190  HiLink shQuoteDelim			Statement
191
192  "spec colors
193  HiLink specBlock			Function
194  HiLink specColon			Special
195  HiLink specCommand			Statement
196  HiLink specCommandOpts		specOpts
197  HiLink specCommandSpecial		Special
198  HiLink specComment			Comment
199  HiLink specConfigure			specCommand
200  HiLink specDate			String
201  HiLink specDescriptionOpts		specOpts
202  HiLink specEmail			specWWWlink
203  HiLink specError			Error
204  HiLink specFilesDirective		specSectionMacro
205  HiLink specFilesOpts			specOpts
206  HiLink specLicense			String
207  HiLink specMacroNameLocal		specGlobalMacro
208  HiLink specMacroNameOther		specGlobalMacro
209  HiLink specManpageFile		NONE
210  HiLink specMonth			specDate
211  HiLink specNoNumberHilite		NONE
212  HiLink specNumber			Number
213  HiLink specPackageOpts		specOpts
214  HiLink specPercent			Special
215  HiLink specSpecialChar		Special
216  HiLink specSpecialVariables		specGlobalMacro
217  HiLink specSpecialVariablesNames	specGlobalMacro
218  HiLink specTarCommand			specCommand
219  HiLink specURL			specWWWlink
220  HiLink specURLMacro			specWWWlink
221  HiLink specVariables			Identifier
222  HiLink specWeekday			specDate
223  HiLink specListedFilesBin		Statement
224  HiLink specListedFilesDoc		Statement
225  HiLink specListedFilesEtc		Statement
226  HiLink specListedFilesLib		Statement
227  HiLink specListedFilesPrefix		Statement
228  HiLink specListedFilesShare		Statement
229
230  delcommand HiLink
231endif
232
233let b:current_syntax = "spec"
234
235" vim: ts=8
236