1 " Vim syntax file the OpenGL Shading Language
3 " Author: Kamil Patelczyk <patelczyk@gmail.com>
7 " Notes: Adapted from c.vim - Bram Moolenaar <bram.vim.org>
8 " Adapted from cg.vim - Kevin Bjorke <kbjorke@nvidia.com>
9 " Adapted from glsl.vim - Nathan Cournia <nathan@cournia.com>
11 " For version 5.x: Clear all syntax items
12 " For version 6.x: Quit when a syntax file was already loaded
15 elseif exists("b:current_syntax")
19 " glslCommentGroup allows adding matches for special things in comments
20 syn cluster glslCommentGroup contains=glslTodo
22 "catch errors caused by wrong parenthesis and brackets
23 syn cluster glslParenGroup contains=glslParenError,glslIncluded,glslSpecial,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslUserCont,glslUserLabel,glslBitField,glslCommentSkip,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom,glslLayoutQual
24 if exists("c_no_bracket_error")
25 syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslCppString
26 " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
27 syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslParen,glslString
28 syn match glslParenError display ")"
29 syn match glslErrInParen display contained "[{}]"
31 syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslErrInBracket,glslCppBracket,glslCppString
32 " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
33 syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInBracket,glslParen,glslBracket,glslString
34 syn match glslParenError display "[\])]"
35 syn match glslErrInParen display contained "[\]{}]"
36 syn region glslBracket transparent start='\[' end=']' contains=ALLBUT,@glslParenGroup,glslErrInParen,glslCppParen,glslCppBracket,glslCppString
37 " glslCppBracket: same as glslParen but ends at end-of-line; used in glslDefine
38 syn region glslCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInParen,glslParen,glslBracket,glslString
39 syn match glslErrInBracket display contained "[);{}]"
42 "integer number, or floating point number without a dot and with "f".
44 syn match glslNumbers display transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctalError,glslOctal
45 " Same, but without octal error (for comments)
46 syn match glslNumbersCom display contained transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctal
47 syn match glslNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
49 syn match glslNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
50 " Flag the first zero of an octal number as something special
51 syn match glslOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=glslOctalZero
52 syn match glslOctalZero display contained "\<0"
53 syn match glslFloat display contained "\d\+f"
54 "floating point number, with dot, optional exponent
55 syn match glslFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
56 "floating point number, starting with a dot, optional exponent
57 syn match glslFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
58 "floating point number, without dot, with exponent
59 syn match glslFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
60 " flag an octal number with wrong digits
61 syn match glslOctalError display contained "0\o*[89]\d*"
64 if exists("c_comment_strings")
65 " A comment can contain glslString, glslCharacter and glslNumber.
66 " But a "*/" inside a glslString in a glslComment DOES end the comment! So we
67 " need to use a special type of glslString: glslCommentString, which also ends on
68 " "*/", and sees a "*" at the start of the line as glslomment again.
69 " Unfortunately this doesn't very well work for // type of comments :-(
70 syntax match glslCommentSkip contained "^\s*\*\($\|\s\+\)"
71 syntax region glslCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=glslSpecial,glslCommentSkip
72 syntax region glslComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=glslSpecial
73 syntax region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslComment2String,glslCharacter,glslNumbersCom,glslSpaceError
74 syntax region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslCommentString,glslCharacter,glslNumbersCom,glslSpaceError
76 syn region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslSpaceError
77 syn region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslSpaceError
79 " keep a // comment separately, it terminates a preproc. conditional
80 syntax match glslCommentError display "\*/"
81 syntax match glslCommentStartError display "/\*"me=e-1 contained
83 syn region glslPreCondit start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=glslComment,glslCppString,glslCharacter,glslCppParen,glslParenError,glslNumbers,glslCommentError,glslSpaceError
84 syn match glslPreCondit display "^\s*#\s*\(else\|endif\)\>"
85 syn region glslCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=glslCppOut2
86 syn region glslCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=glslSpaceError,glslCppSkip
87 syn region glslCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=glslSpaceError,glslCppSkip
88 "syn match glslLineSkip "\\$"
89 syn cluster glslPreProglslGroup contains=glslPreCondit,glslIncluded,glslInclude,glslDefine,glslErrInParen,glslErrInBracket,glslUserLabel,glslSpecial,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom,glslString,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslParen,glslBracket,glslMulti
90 syn region glslDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@glslPreProglslGroup
91 syn region glslPreProc start="^\s*#\s*\(pragma\>\|line\>\|error\>\|version\>\|extension\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@glslPreProglslGroup
93 " Highlight User Labels
94 syn cluster glslMultiGroup contains=glslIncluded,glslSpecial,glslCommentSkip,glslCommentString,glslComment2String,@glslCommentGroup,glslCommentStartError,glslUserCont,glslUserLabel,glslBitField,glslOctalZero,glslCppOut,glslCppOut2,glslCppSkip,glslFormat,glslNumber,glslFloat,glslOctal,glslOctalError,glslNumbersCom,glslCppParen,glslCppBracket,glslCppString
95 syn region glslMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@glslMultiGroup
96 " Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
97 syn cluster glslLabelGroup contains=glslUserLabel
98 syn match glslUserCont display "^\s*\I\i*\s*:$" contains=@glslLabelGroup
99 syn match glslUserCont display ";\s*\I\i*\s*:$" contains=@glslLabelGroup
100 syn match glslUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
101 syn match glslUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
103 syn match glslUserLabel display "\I\i*" contained
105 " Avoid recognizing most bitfields as labels
106 syn match glslBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1
107 syn match glslBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1
110 " Keywords and simple stuff
111 syn keyword glslTodo contained TODO FIXME XXX
113 syn keyword glslStorageClass const uniform
114 syn keyword glslStorageClass in out inout
115 syn keyword glslStorageClass centroid flat smooth noperspective
116 syn keyword glslStorageClass lowp mediump highp precision
117 syn keyword glslStorageClass invariant
119 syn match glslLayout /\<layout\s*(\_.\{-})/hs=s,he=s+6 contains=glslLayoutQual,glslNumber
121 syn keyword glslStorageClassDeprec attribute varying
123 syn keyword glslLayoutQual contained shared packed std140 row_major column_major
124 syn keyword glslLayoutQual contained index line_strip lines lines_adjacency location
125 syn keyword glslLayoutQual contained max_vertices origin_upper_left pixel_center_integer points
126 syn keyword glslLayoutQual contained triangle_strip triangles triangles_adjacency
128 syn keyword glslStatement break continue discard return
129 syn keyword glslRepeat while for do
130 syn keyword glslConditional if else switch
131 syn keyword glslLabel case default
133 syn keyword glslConstant true false
134 syn keyword glslConstant __LINE__ __FILE__ __VERSION__
136 syn keyword glslType uint uvec2 uvec3 uvec4
137 syn keyword glslType float int void bool
138 syn keyword glslType mat2 mat3 mat4
139 syn keyword glslType mat2x2 mat2x3 mat2x4
140 syn keyword glslType mat3x2 mat3x3 mat3x4
141 syn keyword glslType mat4x2 mat4x3 mat4x4
142 syn keyword glslType vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4
143 syn keyword glslType sampler1D sampler2D sampler3D samplerCube
144 syn keyword glslType sampler1DShadow sampler2DShadow samplerCubeShadow
145 syn keyword glslType sampler1DArray sampler2DArray
146 syn keyword glslType sampler1DArrayShadow sampler2DArrayShadow
147 syn keyword glslType isampler1D isampler2D isampler3D isamplerCube
148 syn keyword glslType isampler1DArray isampler2DArray
149 syn keyword glslType usampler1D usampler2D usampler3D usamplerCube
150 syn keyword glslType usampler1DArray usampler2DArray
151 syn keyword glslType sampler2DRect sampler2DRectShadow isampler2DRect usampler2DRect
152 syn keyword glslType samplerBuffer isamplerBuffer usamplerBuffer
153 syn keyword glslType sampler2DMS isampler2DMS usampler2DMS
154 syn keyword glslType sampler2DMSArray isampler2DMSArray usampler2DMSArray
156 syn keyword glslStructure struct
159 syn match glslSwizzle /\.[xyzw]\{1,4\}\>/
160 syn match glslSwizzle /\.[rgba]\{1,4\}\>/
161 syn match glslSwizzle /\.[stpq]\{1,4\}\>/
164 syn keyword glslState gl_FragCoord gl_FrontFacing gl_PointCoord gl_FragDepth
165 syn keyword glslState gl_VertexID gl_InstanceID gl_Position gl_PointSize
166 syn keyword glslState gl_PrimitiveIDIn gl_PrimitiveID gl_Layer
167 syn keyword glslState gl_ClipDistance gl_in
169 syn keyword glslStateDeprec gl_FragColor gl_FragData gl_TexCoord
170 syn keyword glslStateDeprec gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_FogFragCoord
171 syn keyword glslStateDeprec gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2
172 syn keyword glslStateDeprec gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord
175 syn keyword glslUniform gl_DepthRange
177 syn keyword glslUniformDeprec gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix gl_NormalScale
178 syn keyword glslUniformDeprec gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse
179 syn keyword glslUniformDeprec gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose gl_ModelViewProjectionMatrixTranspose
180 syn keyword glslUniformDeprec gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose
181 syn keyword glslUniformDeprec gl_Point gl_FrontMaterial gl_BackMaterial gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_Fog
182 syn keyword glslUniformDeprec gl_BackLightProduct gl_ClipPlane gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT
183 syn keyword glslUniformDeprec gl_FrontLightProduct gl_LightSource gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS
184 syn keyword glslUniformDeprec gl_ObjectPlaneT gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixInverse
185 syn keyword glslUniformDeprec gl_TextureMatrixTranspose gl_TextureMatrix
188 syn keyword glslConstant gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVertexOutputComponents gl_MaxGeometryInputComponents
189 syn keyword glslConstant gl_MaxGeometryOutputComponents gl_MaxFragmentInputComponents gl_MaxVertexTextureImageUnits
190 syn keyword glslConstant gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxDrawBuffers
191 syn keyword glslConstant gl_MaxClipDistances gl_MaxGeometryTextureImageUnits gl_MaxGeometryOutputVertices gl_MaxGeometryTotalOutputComponents
192 syn keyword glslConstant gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents
194 syn keyword glslConstantDeprec gl_MaxVaryingFloats gl_MaxVaryingComponents
195 syn keyword glslConstantDeprec gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxClipPlanes
198 syn keyword glslFunc abs acos acosh asin asinh atan atanh ceil cos cosh degrees exp exp2 floor fract inversesqrt log
199 syn keyword glslFunc log2 max min mod modf pow radians round roundEven sign sin sinh sqrt tan tanh trunc
200 syn keyword glslFunc clamp cross distance dot floatBitsToInt floatBitsToUint intBitsToFloat isinf isnan
201 syn keyword glslFunc length mix normalize smoothstep step
202 syn keyword glslFunc all any determinant equal faceforward
203 syn keyword glslFunc greaterThan greaterThanEqual imulExtended inverse lessThan lessThanEqual matrixCompMult
204 syn keyword glslFunc not notEqual outerProduct reflect refract transpose
205 syn keyword glslFunc textureSize texture textureProj textureLod textureOffset texelFetch texelFetchOffset
206 syn keyword glslFunc textureProjOffset textureLodOffset textureProjLod textureProjLodOffset textureGrad textureGradOffset
207 syn keyword glslFunc textureProjGrad textureProjGradOffset
208 syn keyword glslFunc dFdx dFdy fwidth
209 syn keyword glslFunc noise1 noise2 noise3 noise4
210 syn keyword glslFunc EmitVertex EndPrimitive
212 syn keyword glslFuncDeprec ftransform
213 syn keyword glslFuncDeprec texture1D texture1DProj texture1DProj texture1DLod texture1DProjLod texture1DProjLod texture2D
214 syn keyword glslFuncDeprec texture2DProj texture2DProj texture2DLod texture2DProjLod texture2DProjLod texture3D texture3DProj
215 syn keyword glslFuncDeprec texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj
216 syn keyword glslFuncDeprec shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod
219 " Highlight unsupported keywords
220 syn keyword glslUnsupported asm
221 syn keyword glslUnsupported class union enum typedef template this packed
222 syn keyword glslUnsupported common partition active
223 syn keyword glslUnsupported filter
224 syn keyword glslUnsupported goto
225 syn keyword glslUnsupported hvec2 hvec3 hvec4 fvec2 fvec3 fvec4
226 syn keyword glslUnsupported iimage1D iimage2D iimage3D iimageCube
227 syn keyword glslUnsupported iimage1DArray iimage2DArray uimage1DArray uimage2DArray
228 syn keyword glslUnsupported image1D image2D image3D imageCube
229 syn keyword glslUnsupported image1DArray image2DArray
230 syn keyword glslUnsupported image1DArrayShadow image2DArrayShadow
231 syn keyword glslUnsupported image1DShadow image2DShadow
232 syn keyword glslUnsupported imageBuffer iimageBuffer uimageBuffer
233 syn keyword glslUnsupported inline noinline volatile public static extern external interface
234 syn keyword glslUnsupported input output
235 syn keyword glslUnsupported long short half fixed unsigned superp
236 syn keyword glslUnsupported namespace using
237 syn keyword glslUnsupported sampler3DRect
238 syn keyword glslUnsupported sizeof cast
239 syn keyword glslUnsupported uimage1D uimage2D uimage3D uimageCube
240 syn keyword glslUnsupported double dvec2 dvec3 dvec4
242 " Define the default highlighting.
243 " For version 5.7 and earlier: only when not done already
244 " For version 5.8 and later: only when an item doesn't have highlighting yet
245 if version >= 508 || !exists("did_glsl_syn_inits")
247 let did_glsl_syn_inits = 1
248 command -nargs=+ HiLink hi link <args>
250 command -nargs=+ HiLink hi def link <args>
253 HiLink glslCharacter Character
254 HiLink glslComment Comment
255 HiLink glslComment2String glslString
256 HiLink glslCommentError glslError
257 HiLink glslCommentL glslComment
258 HiLink glslCommentSkip glslComment
259 HiLink glslCommentStart glslComment
260 HiLink glslCommentStartError glslError
261 HiLink glslCommentString glslString
262 HiLink glslCppOut Comment
263 HiLink glslCppOut2 glslCppOut
264 HiLink glslCppSkip glslCppOut
265 HiLink glslCppString glslString
266 HiLink glslDefine Macro
267 HiLink glslErrInBracket glslError
268 HiLink glslErrInParen glslError
269 HiLink glslError Error
270 HiLink glslFloat Float
271 HiLink glslFormat glslSpecial
272 HiLink glslInclude Include
273 HiLink glslIncluded glslString
274 HiLink glslNumber Number
275 HiLink glslOctal Number
276 HiLink glslOctalError glslError
277 HiLink glslOctalZero PreProc
278 HiLink glslOperator Operator
279 HiLink glslParenError glslError
280 HiLink glslPreCondit PreCondit
281 HiLink glslPreProc PreProc
282 HiLink glslSpaceError glslError
283 HiLink glslSpecial SpecialChar
284 HiLink glslSpecialCharacter glslSpecial
285 HiLink glslSpecialError glslError
286 HiLink glslString String
288 HiLink glslConditional Conditional
289 HiLink glslConstant Constant
290 HiLink glslFunc glslStatement
291 HiLink glslFuncDeprec WarningMsg
292 HiLink glslLabel Label
293 HiLink glslLayoutQual glslFunc
294 HiLink glslRepeat Repeat
295 HiLink glslState glslType
296 HiLink glslStateDeprec WarningMsg
297 HiLink glslStatement Statement
298 HiLink glslStorageClass StorageClass
299 HiLink glslLayout StorageClass
300 HiLink glslStorageClassDeprec WarningMsg
301 HiLink glslStructure Structure
302 HiLink glslSwizzle SpecialChar
305 HiLink glslUniform glslType
306 HiLink glslUniformDeprec WarningMsg
307 HiLink glslUnsupported glslError
308 HiLink glslUserLabel Label
313 let b:current_syntax = "glsl330"