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 patch sample
116 syn keyword glslStorageClass centroid flat smooth noperspective
117 syn keyword glslStorageClass lowp mediump highp precision
118 syn keyword glslStorageClass invariant
119 syn keyword glslStorageClass subroutine
121 syn match glslLayout /\<layout\s*(\_.\{-})/hs=s,he=s+6 contains=glslLayoutQual,glslNumber
123 syn keyword glslStorageClassDeprec attribute varying
125 syn keyword glslLayoutQual contained shared packed std140 row_major column_major ccw cw equal_spacing fractional_even_spacing
126 syn keyword glslLayoutQual contained fractional_odd_spacing index invocations isolines line_strip lines lines_adjacency location
127 syn keyword glslLayoutQual contained max_vertices origin_upper_left pixel_center_integer point_mode points quads
128 syn keyword glslLayoutQual contained stream triangle_strip triangles triangles_adjacency vertices
130 syn keyword glslStatement break continue discard return
131 syn keyword glslRepeat while for do
132 syn keyword glslConditional if else switch
133 syn keyword glslLabel case default
135 syn keyword glslConstant true false
136 syn keyword glslConstant __LINE__ __FILE__ __VERSION__
138 syn keyword glslType uint uvec2 uvec3 uvec4
139 syn keyword glslType float double int void bool
140 syn keyword glslType mat2 mat3 mat4 dmat2 dmat3 dmat4
141 syn keyword glslType mat2x2 mat2x3 mat2x4 dmat2x2 dmat2x3 dmat2x4
142 syn keyword glslType mat3x2 mat3x3 mat3x4 dmat3x2 dmat3x3 dmat3x4
143 syn keyword glslType mat4x2 mat4x3 mat4x4 dmat4x2 dmat4x3 dmat4x4
144 syn keyword glslType vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 dvec2 dvec3 dvec4
145 syn keyword glslType sampler1D sampler2D sampler3D samplerCube
146 syn keyword glslType sampler1DShadow sampler2DShadow samplerCubeShadow
147 syn keyword glslType sampler1DArray sampler2DArray
148 syn keyword glslType sampler1DArrayShadow sampler2DArrayShadow
149 syn keyword glslType isampler1D isampler2D isampler3D isamplerCube
150 syn keyword glslType isampler1DArray isampler2DArray
151 syn keyword glslType usampler1D usampler2D usampler3D usamplerCube
152 syn keyword glslType usampler1DArray usampler2DArray
153 syn keyword glslType sampler2DRect sampler2DRectShadow isampler2DRect usampler2DRect
154 syn keyword glslType samplerBuffer isamplerBuffer usamplerBuffer
155 syn keyword glslType sampler2DMS isampler2DMS usampler2DMS
156 syn keyword glslType sampler2DMSArray isampler2DMSArray usampler2DMSArray
157 syn keyword glslType samplerCubeArray samplerCubeArrayShadow isamplerCubeArray usamplerCubeArray
159 syn keyword glslStructure struct
162 syn match glslSwizzle /\.[xyzw]\{1,4\}\>/
163 syn match glslSwizzle /\.[rgba]\{1,4\}\>/
164 syn match glslSwizzle /\.[stpq]\{1,4\}\>/
167 syn keyword glslState gl_FragCoord gl_FrontFacing gl_PointCoord gl_SampleID gl_SamplePosition gl_FragDepth
168 syn keyword glslState gl_VertexID gl_InstanceID gl_Position gl_PointSize
169 syn keyword glslState gl_PrimitiveIDIn gl_InvocationID gl_PrimitiveID gl_Layer
170 syn keyword glslState gl_ClipDistance gl_in gl_SampleMask
172 syn keyword glslStateDeprec gl_FragColor gl_FragData gl_TexCoord
173 syn keyword glslStateDeprec gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_FogFragCoord
174 syn keyword glslStateDeprec gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2
175 syn keyword glslStateDeprec gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord
178 syn keyword glslUniform gl_DepthRange
180 syn keyword glslUniformDeprec gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix gl_NormalScale
181 syn keyword glslUniformDeprec gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse
182 syn keyword glslUniformDeprec gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose gl_ModelViewProjectionMatrixTranspose
183 syn keyword glslUniformDeprec gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose
184 syn keyword glslUniformDeprec gl_Point gl_FrontMaterial gl_BackMaterial gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_Fog
185 syn keyword glslUniformDeprec gl_BackLightProduct gl_ClipPlane gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT
186 syn keyword glslUniformDeprec gl_FrontLightProduct gl_LightSource gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS
187 syn keyword glslUniformDeprec gl_ObjectPlaneT gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixInverse
188 syn keyword glslUniformDeprec gl_TextureMatrixTranspose gl_TextureMatrix
191 syn keyword glslConstant gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVertexOutputComponents gl_MaxGeometryInputComponents
192 syn keyword glslConstant gl_MaxGeometryOutputComponents gl_MaxFragmentInputComponents gl_MaxVertexTextureImageUnits
193 syn keyword glslConstant gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxDrawBuffers
194 syn keyword glslConstant gl_MaxClipDistances gl_MaxGeometryTextureImageUnits gl_MaxGeometryOutputVertices gl_MaxGeometryTotalOutputComponents
195 syn keyword glslConstant gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents
196 syn keyword glslConstant gl_MaxTessControlTextureImageUnits gl_MaxTessControlUniformComponents gl_MaxTessControlTotalOutputComponents
197 syn keyword glslConstant gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits
198 syn keyword glslConstant gl_MaxTessEvaluationUniformComponents gl_MaxTessPatchComponents gl_MaxPatchVertices gl_MaxTessGenLevel
200 syn keyword glslConstantDeprec gl_MaxVaryingFloats gl_MaxVaryingComponents
201 syn keyword glslConstantDeprec gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxClipPlanes
204 syn keyword glslFunc abs acos acosh asin asinh atan atanh ceil cos cosh degrees exp exp2 floor fract inversesqrt log
205 syn keyword glslFunc log2 max min mod modf pow radians round roundEven sign sin sinh sqrt tan tanh trunc
206 syn keyword glslFunc clamp cross distance dot floatBitsToInt floatBitsToUint fma frexp intBitsToFloat isinf isnan
207 syn keyword glslFunc ldexp length mix normalize packDouble2x32 packSnorm4x8 packUnorm2x16 packUnorm4x8 smoothstep step
208 syn keyword glslFunc uintBitsToFloat unpackDouble2x32 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8
209 syn keyword glslFunc all any bitCount bitfieldExtract bitfieldInsert bitfieldReverse determinant equal faceforward
210 syn keyword glslFunc findLSB findMSB greaterThan greaterThanEqual imulExtended inverse lessThan lessThanEqual matrixCompMult
211 syn keyword glslFunc not notEqual outerProduct reflect refract transpose uaddCarry umulExtended usubBorrow
212 syn keyword glslFunc textureSize textureQueryLod texture textureProj textureLod textureOffset texelFetch texelFetchOffset
213 syn keyword glslFunc textureProjOffset textureLodOffset textureProjLod textureProjLodOffset textureGrad textureGradOffset
214 syn keyword glslFunc textureProjGrad textureProjGradOffset textureGather textureGatherOffset textureGatherOffsets
215 syn keyword glslFunc dFdx dFdy fwidth interpolateAtCentroid interpolateAtOffset interpolateAtSample
216 syn keyword glslFunc noise1 noise2 noise3 noise4
217 syn keyword glslFunc EmitStreamVertex EndStreamPrimitive EmitVertex EndPrimitive barrier
219 syn keyword glslFuncDeprec ftransform
220 syn keyword glslFuncDeprec texture1D texture1DProj texture1DProj texture1DLod texture1DProjLod texture1DProjLod texture2D
221 syn keyword glslFuncDeprec texture2DProj texture2DProj texture2DLod texture2DProjLod texture2DProjLod texture3D texture3DProj
222 syn keyword glslFuncDeprec texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj
223 syn keyword glslFuncDeprec shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod
226 " Highlight unsupported keywords
227 syn keyword glslUnsupported asm
228 syn keyword glslUnsupported class union enum typedef template this packed
229 syn keyword glslUnsupported common partition active
230 syn keyword glslUnsupported filter
231 syn keyword glslUnsupported goto
232 syn keyword glslUnsupported hvec2 hvec3 hvec4 fvec2 fvec3 fvec4
233 syn keyword glslUnsupported iimage1D iimage2D iimage3D iimageCube
234 syn keyword glslUnsupported iimage1DArray iimage2DArray uimage1DArray uimage2DArray
235 syn keyword glslUnsupported image1D image2D image3D imageCube
236 syn keyword glslUnsupported image1DArray image2DArray
237 syn keyword glslUnsupported image1DArrayShadow image2DArrayShadow
238 syn keyword glslUnsupported image1DShadow image2DShadow
239 syn keyword glslUnsupported imageBuffer iimageBuffer uimageBuffer
240 syn keyword glslUnsupported inline noinline volatile public static extern external interface
241 syn keyword glslUnsupported input output
242 syn keyword glslUnsupported long short half fixed unsigned superp
243 syn keyword glslUnsupported namespace using
244 syn keyword glslUnsupported sampler3DRect
245 syn keyword glslUnsupported sizeof cast
246 syn keyword glslUnsupported uimage1D uimage2D uimage3D uimageCube
248 " Define the default highlighting.
249 " For version 5.7 and earlier: only when not done already
250 " For version 5.8 and later: only when an item doesn't have highlighting yet
251 if version >= 508 || !exists("did_glsl_syn_inits")
253 let did_glsl_syn_inits = 1
254 command -nargs=+ HiLink hi link <args>
256 command -nargs=+ HiLink hi def link <args>
259 HiLink glslCharacter Character
260 HiLink glslComment Comment
261 HiLink glslComment2String glslString
262 HiLink glslCommentError glslError
263 HiLink glslCommentL glslComment
264 HiLink glslCommentSkip glslComment
265 HiLink glslCommentStart glslComment
266 HiLink glslCommentStartError glslError
267 HiLink glslCommentString glslString
268 HiLink glslCppOut Comment
269 HiLink glslCppOut2 glslCppOut
270 HiLink glslCppSkip glslCppOut
271 HiLink glslCppString glslString
272 HiLink glslDefine Macro
273 HiLink glslErrInBracket glslError
274 HiLink glslErrInParen glslError
275 HiLink glslError Error
276 HiLink glslFloat Float
277 HiLink glslFormat glslSpecial
278 HiLink glslInclude Include
279 HiLink glslIncluded glslString
280 HiLink glslNumber Number
281 HiLink glslOctal Number
282 HiLink glslOctalError glslError
283 HiLink glslOctalZero PreProc
284 HiLink glslOperator Operator
285 HiLink glslParenError glslError
286 HiLink glslPreCondit PreCondit
287 HiLink glslPreProc PreProc
288 HiLink glslSpaceError glslError
289 HiLink glslSpecial SpecialChar
290 HiLink glslSpecialCharacter glslSpecial
291 HiLink glslSpecialError glslError
292 HiLink glslString String
294 HiLink glslConditional Conditional
295 HiLink glslConstant Constant
296 HiLink glslFunc glslStatement
297 HiLink glslFuncDeprec WarningMsg
298 HiLink glslLabel Label
299 HiLink glslLayoutQual glslFunc
300 HiLink glslRepeat Repeat
301 HiLink glslState glslType
302 HiLink glslStateDeprec WarningMsg
303 HiLink glslStatement Statement
304 HiLink glslStorageClass StorageClass
305 HiLink glslLayout StorageClass
306 HiLink glslStorageClassDeprec WarningMsg
307 HiLink glslStructure Structure
308 HiLink glslSwizzle SpecialChar
311 HiLink glslUniform glslType
312 HiLink glslUniformDeprec WarningMsg
313 HiLink glslUnsupported glslError
314 HiLink glslUserLabel Label
319 let b:current_syntax = "glsl400"