files/glsl.vim

266 lines
17 KiB
VimL

" Vim syntax file the OpenGL Shading Language
" Language: GLSL
" Author: Nathan Cournia <nathan@cournia.com>
" Date: June 30, 2004
" File Types: .frag .vert .glsl .fp .vp
" Version: 1.10.00
" Notes: Adapted from c.vim - Bram Moolenaar <bram.vim.org>
" Adapted from cg.vim - Kevin Bjorke <kbjorke@nvidia.com>
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
" a bunch of useful keywords
syn keyword glslConditional if else
syn keyword glslStatement break return continue discard
syn keyword glslRepeat while for do
syn keyword glslTodo contained TODO FIXME XXX
" glslCommentGroup allows adding matches for special things in comments
syn cluster glslCommentGroup contains=glslTodo
"catch errors caused by wrong parenthesis and brackets
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
if exists("c_no_bracket_error")
syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslCppString
" glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslParen,glslString
syn match glslParenError display ")"
syn match glslErrInParen display contained "[{}]"
else
syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslErrInBracket,glslCppBracket,glslCppString
" glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInBracket,glslParen,glslBracket,glslString
syn match glslParenError display "[\])]"
syn match glslErrInParen display contained "[\]{}]"
syn region glslBracket transparent start='\[' end=']' contains=ALLBUT,@glslParenGroup,glslErrInParen,glslCppParen,glslCppBracket,glslCppString
" glslCppBracket: same as glslParen but ends at end-of-line; used in glslDefine
syn region glslCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInParen,glslParen,glslBracket,glslString
syn match glslErrInBracket display contained "[);{}]"
endif
"integer number, or floating point number without a dot and with "f".
syn case ignore
syn match glslNumbers display transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctalError,glslOctal
" Same, but without octal error (for comments)
syn match glslNumbersCom display contained transparent "\<\d\|\.\d" contains=glslNumber,glslFloat,glslOctal
syn match glslNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
"hex number
syn match glslNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
" Flag the first zero of an octal number as something special
syn match glslOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=glslOctalZero
syn match glslOctalZero display contained "\<0"
syn match glslFloat display contained "\d\+f"
"floating point number, with dot, optional exponent
syn match glslFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
"floating point number, starting with a dot, optional exponent
syn match glslFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
syn match glslFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
" flag an octal number with wrong digits
syn match glslOctalError display contained "0\o*[89]\d*"
syn case match
if exists("c_comment_strings")
" A comment can contain glslString, glslCharacter and glslNumber.
" But a "*/" inside a glslString in a glslComment DOES end the comment! So we
" need to use a special type of glslString: glslCommentString, which also ends on
" "*/", and sees a "*" at the start of the line as glslomment again.
" Unfortunately this doesn't very well work for // type of comments :-(
syntax match glslCommentSkip contained "^\s*\*\($\|\s\+\)"
syntax region glslCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=glslSpecial,glslCommentSkip
syntax region glslComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=glslSpecial
syntax region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslComment2String,glslCharacter,glslNumbersCom,glslSpaceError
syntax region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslCommentString,glslCharacter,glslNumbersCom,glslSpaceError
else
syn region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslSpaceError
syn region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslSpaceError
endif
" keep a // comment separately, it terminates a preproc. conditional
syntax match glslCommentError display "\*/"
syntax match glslCommentStartError display "/\*"me=e-1 contained
syn keyword glslType void
syn keyword glslType bool bvec2 bvec3 bvec4
syn keyword glslType int ivec2 ivec3 ivec4
syn keyword glslType float vec2 vec3 vec4
syn keyword glslType mat2 mat3 mat4
syn keyword glslType sampler1D sampler2D sampler3D samplerCUBE sampler1DShadow sampler2DShadow
syn keyword glslStructure struct
syn keyword glslStorageClass const attribute varying uniform
syn keyword glslStorageClass in out inout
syn keyword glslConstant __LINE__ __FILE__ __VERSION__
syn keyword glslConstant true false
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
syn match glslPreCondit display "^\s*#\s*\(else\|endif\)\>"
syn region glslCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=glslCppOut2
syn region glslCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=glslSpaceError,glslCppSkip
syn region glslCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=glslSpaceError,glslCppSkip
"syn match glslLineSkip "\\$"
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
syn region glslDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@glslPreProglslGroup
syn region glslPreProc start="^\s*#\s*\(pragma\>\|line\>\|error\>\|version\>\|extension\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@glslPreProglslGroup
" Highlight User Labels
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
syn region glslMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@glslMultiGroup
" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
syn cluster glslLabelGroup contains=glslUserLabel
syn match glslUserCont display "^\s*\I\i*\s*:$" contains=@glslLabelGroup
syn match glslUserCont display ";\s*\I\i*\s*:$" contains=@glslLabelGroup
syn match glslUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
syn match glslUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
syn match glslUserLabel display "\I\i*" contained
" Avoid recognizing most bitfields as labels
syn match glslBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1
syn match glslBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1
syn keyword glslState gl_Position gl_PointSize gl_ClipVertex
syn keyword glslState gl_FragCoord gl_FrontFacing gl_FragColor gl_FragData gl_FragDepth
" vertex attributes
syn keyword glslState gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_FogCoord
syn match glslState display "gl_MultiTexCoord\d\+"
" varying variables
syn keyword glslState gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord
" uniforms
syn keyword glslUniform gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix gl_TextureMatrix
syn keyword glslUniform gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial
syn keyword glslUniform gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct
syn keyword glslUniform gl_FrontLightProduct gl_BackLightProduct glTextureEnvColor
syn keyword glslUniform gl_TextureEnvColor gl_Fog
syn match glslUniform display "gl_EyePlane[STRQ]"
syn match glslUniform display "gl_ObjectPlane[STRQ]"
syn keyword glslUniform gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse
syn keyword glslUniform gl_TextureMatrixInverse gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose
syn keyword glslUniform gl_ModelViewProjectionMatrixTranspose gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose
syn keyword glslUniform gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose
" uniform types
syn keyword glslType gl_DepthRangeParameters gl_PointParameters gl_MaterialParameters
syn keyword glslType gl_LightSourceParameters gl_LightModelParameters gl_LightModelProducts
syn keyword glslType gl_LightProducts gl_FogParameters
" constants
syn keyword glslConstant gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs
syn keyword glslConstant gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits
syn keyword glslConstant gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents
syn keyword glslConstant gl_MaxDrawBuffers
" swizzling
syn match glslSwizzle /\.[xyzw]\{1,4\}\>/
syn match glslSwizzle /\.[rgba]\{1,4\}\>/
syn match glslSwizzle /\.[stpq]\{1,4\}\>/
" built in functions
syn keyword glslFunc radians degrees sin cos tan asin acos atan pow exp2 log2 sqrt inversesqrt
syn keyword glslFunc abs sign floor ceil fract mod min max clamp mix step smoothstep
syn keyword glslFunc length distance dot cross normalize ftransform faceforward reflect
syn keyword glslFunc matrixcompmult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not
syn keyword glslFunc texture1D texture1DProj texture1DLod texture1DProjLod
syn keyword glslFunc texture2D texture2DProj texture2DLod texture2DProjLod
syn keyword glslFunc texture3D texture3DProj texture3DLod texture3DProjLod
syn keyword glslFunc textureCube textureCubeLod
syn keyword glslFunc shadow1D shadow1DProj shadow1DLod shadow1DProjLod
syn keyword glslFunc shadow2D shadow2DProj shadow2DLod shadow2DProjLod
syn keyword glslFunc dFdx dFdy fwidth noise1 noise2 noise3 noise4
syn keyword glslFunc refract exp log
" highlight unsupported keywords
syn keyword glslUnsupported asm
syn keyword glslUnsupported class union enum typedef template this packed
syn keyword glslUnsupported goto switch default
syn keyword glslUnsupported inline noinline volatile public static extern external interface
syn keyword glslUnsupported long short double half fixed unsigned
syn keyword glslUnsupported input output
syn keyword glslUnsupported hvec2 hvec3 hvec4 dvec2 dvec3 dvec4 fvec2 fvec3 fvec4
syn keyword glslUnsupported sampler2DRect sampler3DRect sampler2DRectShadow
syn keyword glslUnsupported sizeof cast
syn keyword glslUnsupported namespace using
"wtf?
"let b:c_minlines = 50 " #if 0 constructs can be long
"exec "syn sync ccomment glslComment minlines=" . b:c_minlines
" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_glsl_syn_inits")
if version < 508
let did_glsl_syn_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink glslFormat glslSpecial
HiLink glslCppString glslString
HiLink glslCommentL glslComment
HiLink glslCommentStart glslComment
HiLink glslLabel Label
HiLink glslUserLabel Label
HiLink glslConditional Conditional
HiLink glslRepeat Repeat
HiLink glslCharacter Character
HiLink glslSpecialCharacter glslSpecial
HiLink glslNumber Number
HiLink glslOctal Number
HiLink glslOctalZero PreProc " link this to Error if you want
HiLink glslFloat Float
HiLink glslOctalError glslError
HiLink glslParenError glslError
HiLink glslErrInParen glslError
HiLink glslErrInBracket glslError
HiLink glslCommentError glslError
HiLink glslCommentStartError glslError
HiLink glslSpaceError glslError
HiLink glslSpecialError glslError
HiLink glslOperator Operator
HiLink glslStructure Structure
HiLink glslStorageClass StorageClass
HiLink glslInclude Include
HiLink glslPreProc PreProc
HiLink glslDefine Macro
HiLink glslIncluded glslString
HiLink glslError Error
HiLink glslStatement Statement
HiLink glslPreCondit PreCondit
HiLink glslType Type
HiLink glslConstant Constant
HiLink glslCommentString glslString
HiLink glslComment2String glslString
HiLink glslCommentSkip glslComment
HiLink glslString String
HiLink glslComment Comment
HiLink glslSpecial SpecialChar
HiLink glslSwizzle SpecialChar
HiLink glslTodo Todo
HiLink glslCppSkip glslCppOut
HiLink glslCppOut2 glslCppOut
HiLink glslCppOut Comment
HiLink glslUniform glslType
HiLink glslState glslType
HiLink glslFunc glslStatement
HiLink glslUnsupported glslError
delcommand HiLink
endif
let b:current_syntax = "glsl"
" vim: ts=8