blob: 40c3393fc574cc5dfc30990170649d05f4d43954 [file] [log] [blame]
Pierrick Guillaume280e5b12024-05-31 12:00:49 +02001" Vim syntax file
2" Language: rasi (Rofi Advanced Style Information)
3" Maintainer: Pierrick Guillaume <pierguill@gmail.com>
4" Last Change: 2024 May 21
5"
6" Syntax support for rasi config file
7
8" This file is based on syntax defined in rofi-theme man page
9" https://man.archlinux.org/man/community/rofi/rofi-theme.5.en
10
11if exists('b:current_syntax')
12 finish
13endif
14let b:current_syntax = 'rasi'
15
16" String {{{
17syn region rasiString start=+"+ skip=+\\"+ end=+"+ oneline contained
18syn match rasiCharacter +L\='[^\\]'+ contained
19
20syn cluster rasiPropertyVals add=rasiString,rasiCharacter
21" }}}
22
23" Integer/Real {{{
24syn match rasiNumber display contained '[+-]\?\d\+\(\.\d\+\)\?'
25
26syn cluster rasiPropertyVals add=rasiNumber
27" }}}
28
29" Boolean {{{
30syn keyword rasiBool contained true false
31
32syn cluster rasiPropertyVals add=rasiBool
33" }}}
34
35" Image {{{
36syn match rasiInvImage display contained 'url([^)]*)'
37syn keyword rasiImageK contained url linear-gradient
38
39syn match rasiImage display contained transparent 'url(\s*"\([^"]\|\\"\)\+"\(\s*,\s*\(none\|both\|width\|height\)\)\?\s*)' contains=rasiImageScale,rasiString,rasiImageK
40syn keyword rasiImageScale contained none both width height
41
42syn match rasiImage display contained transparent 'linear-gradient(\s*\(\(top\|left\|right\|bottom\)\s*,\s*\)\?[^,)]\+\s*\(,\s*[^,)]\+\s*\)\+)' contains=rasiImageDirection,@rasiColors,rasiImageK
43syn keyword rasiImageDirection contained top left right bottom
44
45syn match rasiImage display contained transparent 'linear-gradient(\s*\d\+\(rad\|grad\|deg\)\s*,\s*[^,)]\+\s*\(,\s*[^,)]\+\s*\)\+)' contains=rasiImageUnit,@rasiColor,@rasiInvColor,rasiNumber,rasiImageK
46syn match rasiImageUnit display contained '\(rad\|grad\|deg\)\>'
47
48syn cluster rasiPropertyVals add=rasiInvImage,rasiImage
49" }}}
50
51" Reference {{{
52syn match rasiReference display contained '@[a-zA-Z0-9-]\+'
53
54syn keyword rasiVarReferenceK contained var
55
56syn match rasiInvVarReference display contained 'var([^)]*)'
57syn match rasiVarReference display contained transparent 'var(\s*[a-zA-Z0-9-]\+\s*,\s*\(\a\+\s*([^)]*)\)\?[^),]*)' contains=rasiVarReferenceK,rasiPropertyIdRef,@rasiPropertyVals
58syn match rasiPropertyIdRef display contained '\a[a-zA-Z0-9-]*'
59
60syn cluster rasiPropertyVals add=rasiReference,rasiInvVarReference,rasiVarReference
61" }}}
62
63" Env variable {{{
64syn match rasiInvEnv display contained '${[^}]*}'
65syn match rasiEnv display contained '${\w\+}'hs=s+2,he=e-1
66
67syn keyword rasiEnvVarK contained env
68
69syn match rasiInvEnvVar display contained 'env([^)]*)'
70syn match rasiEnvVar display contained transparent 'env(\s*\w\+\s*,\s*\(\a\+([^)]*)\)\?[^),]*)' contains=rasiEnvVarK,rasiEnvRef,@rasiPropertyVals
71syn match rasiEnvRef display contained '\a\w*'
72
73syn cluster rasiPropertyVals add=rasiEnv,rasiInvEnv,rasiInvEnvVar,rasiEnvVar
74" }}}
75
76" Color {{{
77syn keyword rasiColorK contained rgb[a] hsl[a] hwb[a] cmyk
78
79syn match rasiHexColor display contained '#\x\{3,4}'
80syn match rasiHexColor display contained '#\x\{6}'
81syn match rasiHexColor display contained '#\x\{8}'
82syn match rasiInvHexColor display contained '#\x\{5}\X'he=e-1,me=e-1
83syn match rasiInvHexColor display contained '#\x\{7}\X'he=e-1,me=e-1
84
85syn match rasiInvRGBColor display contained 'rgb\(a\)\?([^)]*)'
86syn match rasiRGBColor display contained transparent 'rgb\(a\)\?(\s*\d\+\s*\(%\)\?\s*,\(\s*\d\+\s*\(%\)\?\s*\){2}\(,\s*\(\d\(\.\d*\)\?\|\d\{,3}%\)\s*\)\?)' contains=rasiColorK,rasiNumber,rasiDistance
87
88syn match rasiInvHSLColor display contained 'h\(sl\|wb\)\(a\)\?([^)]*)'
89syn match rasiHSLColor display contained transparent 'h\(sl\|wb\)\(a\)\?(\s*\d\+\(\.\d*\)\?\(deg\|rad\|grad\|turn\)\?\s*\(,\s*\(\d\(\.\d*\)\?\|\d\{,3}%\)\s*\)\{2,3})' contains=rasiColorK,rasiNumber,rasiDistance
90
91
92"this matches doesn't works properly (too long ?)
93syn match rasiInvCMYKColor display contained 'cmyk([^)]*)'
94syn match rasiCMYKColor display contained transparent 'cmyk(\s*\(\d\(\.\d*\)\?\|\d\{,3}%\)\s*\(,\s*\(\d\(\.\d*\)\?\|\d\{,3}%\)\s*\)\{3,4})' contains=rasiColorK,rasiNumber,rasiDistance
95
96syn case ignore
97syn keyword rasiNamedColor contained
98 \ AliceBlue AntiqueWhite Aqua Aquamarine Azure Beige Bisque Black BlanchedAlmond Blue
99 \ BlueViolet Brown BurlyWood CadetBlue Chartreuse Chocolate Coral CornflowerBlue Cornsilk
100 \ Crimson Cyan DarkBlue DarkCyan DarkGoldenRod DarkGray DarkGrey DarkGreen DarkKhaki DarkMagenta
101 \ DarkOliveGreen DarkOrange DarkOrchid DarkRed DarkSalmon DarkSeaGreen Dark SlateBlue
102 \ DarkSlateGray DarkSlateGrey DarkTurquoise DarkViolet DeepPink DeepSkyBlue DimGray DimGrey
103 \ DodgerBlue FireBrick FloralWhite ForestGreen Fuchsia Gainsboro GhostWhite Gold GoldenRod
104 \ Gray Grey Green GreenYellow HoneyDew HotPink IndianRed Indigo Ivory Khaki Lavender
105 \ LavenderBlush LawnGreen LemonChiffon LightBlue LightCoral LightCyan LightGoldenRodYellow
106 \ LightGray LightGrey LightGreen LightPink LightSalmon LightSeaGreen LightSkyBlue LightSlateGray
107 \ LightSlateGrey LightSteelBlue LightYellow Lime LimeGreen Linen Magenta Maroon MediumAquaMarine
108 \ MediumBlue MediumOrchid MediumPurple MediumSeaGreen MediumSlateBlue MediumSpringGreen
109 \ MediumTurquoise MediumVioletRed MidnightBlue MintCream MistyRose Moccasin NavajoWhite Navy
110 \ OldLace Olive OliveDrab Orange OrangeRed Orchid PaleGoldenRod PaleGreen PaleTurquoise
111 \ PaleVioletRed PapayaWhip PeachPuff Peru Pink Plum PowderBlue Purple RebeccaPurple Red
112 \ RosyBrown RoyalBlue SaddleBrown Salmon SandyBrown SeaGreen SeaShell Sienna Silver SkyBlue
113 \ SlateBlue SlateGray SlateGrey Snow SpringGreen SteelBlue Tan Teal Thistle Tomato Turquoise
114 \ Violet Wheat White WhiteSmoke Yellow YellowGreen transparent[] "uses `[]` to escape keyword
115
116syn cluster rasiColors add=rasiHexColor,rasiRGBColor,rasiHSLColor,rasiCMYKColor,rasiNamedColor
117syn cluster rasiColors add=rasiInvHexColor,rasiInvRGBColor,rasiInvHSLColor,rasiInvCMYKColor
118
119syn cluster rasiPropertyVals add=@rasiColors
120" }}}
121
122" Text-Style {{{
123syn keyword rasiTextStyle contained bold italic underline strikethrough none
124
125syn cluster rasiPropertyVals add=rasiTextStyle
126" }}}
127
128" Line-Style {{{
129syn keyword rasiLineStyle contained dash solid
130
131syn cluster rasiPropertyVals add=rasiLineStyle
132" }}}
133
134" Distance {{{
135syn match rasiDistanceUnit display contained '\(px\|em\|ch\|%\|mm\)'
136
137syn match rasiInvDistance display contained '[+-]\?\d\+\.\d\+\(px\|mm\)'
138syn match rasiDistance display contained transparent '[-+]\?\d\+\(px\|mm\)' contains=rasiDistanceUnit,rasiNumber
139syn match rasiDistance display contained transparent '[+-]\?\d\+\(\.\d\+\)\?\(em\|ch\|%\)' contains=rasiDistanceUnit,rasiNumber
140
141syn keyword rasiDistanceCalc contained calc nextgroup=rasiDistanceCalcBody
142syn region rasiDistanceCalcBody display contained start=+(+ end=+)+ contains=rasiDistanceCalcOp,rasiDistance,rasiInvDistance
143syn match rasiDistanceCalcOp display contained '\(+\|-\|/\|\*\|%\|min\|max\)'
144
145syn cluster rasiPropertyVals add=rasiInvDistance,rasiDistance,rasiDistanceCalc
146" }}}
147
148" Position {{{
149syn keyword rasiPosition contained center east north west south
150
151syn cluster rasiPropertyVals add=rasiPosition
152" }}}
153
154" Orientation {{{
155syn keyword rasiOrientation contained horizontal vertical
156
157syn cluster rasiPropertyVals add=rasiOrientation
158" }}}
159
160" Cursor {{{
161syn keyword rasiCursor contained default pointer text
162
163syn cluster rasiPropertyVals add=rasiCursor
164" }}}
165
166" Keyword List {{{
167syn region rasiKeywordList contained start=+\[+ end=+\]+ contains=rasiPropertyIdRef
168
169syn cluster rasiPropertyVals add=rasiKeywordList
170" }}}
171
172" Inherit {{{
173syn keyword rasiInherit contained inherit children
174
175syn cluster rasiPropertyVals add=rasiInherit
176" }}}
177
178syn match rasiGlobalImport display '^\s*@\(import\|theme\)' nextgroup=rasiString skipwhite
179
180" Section {{{
181" syn region rasiSection transparent start='^[^{]\+{'me=e-1 end='}' contains=rasiSectionOpenning,rasiSectionContent
182syn match rasiSectionOpenning transparent '^[^{]\+{'me=e-1 contains=rasiGlobalSection,rasiWidgetName,rasiGlobalMedia nextgroup=rasiThemeSectionContent
183" syn match rasiThemeInnerSectionOpenning transparent '^[^:${]\+{'me=e-1 contains=rasiWidgetName nextgroup=rasiThemeInnerSectionContent contained
184
185syn match rasiGlobalMedia display contained '^\s*@media' nextgroup=rasiInvMediaBody,rasiMediaBody skipwhite
186syn match rasiInvMediaBody display contained '([^)]*)'
187syn match rasiMediaBody display contained '(\s*[a-z-]\+\s*:\s*\d\+\(px\|mm\)\?\s*)' contains=rasiMediaK,rasiNumber,rasiDistance
188syn keyword rasiMediaK contained min-width max-width min-height max-height min-aspect-ratio max-aspect-ratio monitor-id
189
190syn match rasiGlobalSection display contained '^*'
191syn match rasiWidgetName display contained '[a-zA-Z0-9-]\+' nextgroup=rasiVisibleMod skipwhite
192
193syn keyword rasiVisibleMod contained normal selected alternate nextgroup=rasiVisibleMod,rasiStateWrapper skipwhite
194syn match rasiStateWrapper display contained transparent '\.\(normal\|active\|urgent\)' contains=rasiState
195syn keyword rasiState contained normal active urgent
196
197
198syn region rasiThemeSectionContent transparent start="{" end="}" contains=rasiProperty,rasiComment,rasiCommentL,rasiSectionOpenning contained
199" syn region rasiThemeInnerSectionContent transparent start="{" end="}" contains=rasiProperty,rasiComment,rasiCommentL,rasiThemeInnerSectionOpenning contained
200
201syn match rasiProperty transparent '^\s*\S\+\s*:.*;\s*$' keepend contained contains=rasiPropertyId,rasiInvPropertyId,rasiPropertyVal,rasiComment,rasiCommentL
202syn match rasiInvPropertyId '^\([^:]\&[^/]\{2}\)*:'me=e-1 contained
203syn match rasiPropertyId '^\s*[0-9a-zA-Z-]\+\s*:'me=e-1 contained
204syn match rasiInvPropertyVal ':[^;];\s*\S\+\s*$'ms=s+1,hs=s+1
205syn match rasiPropertyVal ':\s*[^;]\+;\s*$'ms=s+1,hs=s+1 contained contains=@rasiPropertyVals
206" }}}
207
208" Comment {{{
209syn cluster rasiCommentGroup contains=rasiTodo,rasiBadContinuation
210
211syn region rasiCommentL start="//" skip="\\$" end="$" keepend contains=@rasiCommentGroup,@Spell
212syn region rasiComment start="/\*" end="\*/" contains=@rasiCommentGroup,rasiCommentStartError,@Spell fold extend
213
214syn match rasiCommentError display '\*/'
215
216syn keyword rasiTodo contained TODO FIXME XXX NOTE
217
218if exists("rasi_minlines")
219 let b:rasi_minlines = rasi_minlines
220else
221 let b:rasi_minlines = 50
222endif
223exec "syn sync ccomment rasiComment minlines=" . b:rasi_minlines
224" }}}
225
226
227
228" Highlighting: {{{
229hi def link rasiError Error
230
231hi def link rasiTodo Todo
232hi def link rasiComment Comment
233hi def link rasiCommentStart rasiComment
234hi def link rasiCommentL rasiComment
235hi def link rasiCommentError rasiError
236
237hi def link rasiString String
238hi def link rasiNumber Number
239hi def link rasiBool Boolean
240
241hi def link rasiImageK Function
242hi def link rasiImageScale Keyword
243hi def link rasiImageDirection Keyword
244hi def link rasiImageUnit Type
245hi def link rasiInvImage rasiError
246
247hi def link rasiHexColor Number
248hi def link rasiColorK Function
249hi def link rasiNamedColor Number
250hi def link rasiInvColor rasiError
251hi def link rasiInvHexColor rasiInvColor
252hi def link rasiInvRGBColor rasiInvColor
253hi def link rasiInvHSLColor rasiInvColor
254hi def link rasiInvCMYKColor rasiInvColor
255
256hi def link rasiTextStyle Keyword
257hi def link rasiLineStyle Keyword
258
259hi def link rasiDistanceUnit Type
260hi def link rasiDistanceCalc Function
261hi def link rasiDistanceCalcOp Operator
262hi def link rasiInvDistance rasiError
263
264hi def link rasiPosition Keyword
265hi def link rasiOrientation Keyword
266hi def link rasiCursor Keyword
267
268hi def link rasiReference Identifier
269hi def link rasiPropertyIdRef Identifier
270hi def link rasiVarReferenceK Function
271hi def link rasiInvVarReference rasiError
272
273hi def link rasiEnv Identifier
274hi def link rasiEnvRef Identifier
275hi def link rasiEnvVarK Function
276hi def link rasiInvEnv rasiError
277hi def link rasiInvEnvVar rasiError
278
279hi def link rasiWidgetName StorageClass
280hi def link rasiGlobalSection StorageClass
281hi def link rasiVisibleMod Type
282hi def link rasiState Tag
283
284hi def link rasiInherit Identifier
285
286hi def link rasiGlobalImport Include
287
288hi def link rasiGlobalMedia Preproc
289hi def link rasiMediaK Keyword
290hi def link rasiInvMediaBody rasiError
291
292hi def link rasiPropertyId Identifier
293hi def link rasiInvProperty rasiError
294hi def link rasiInvPropertyId rasiError
295hi def link rasiInvPropertyVal rasiError
296" }}}
297
298" vim:ts=8