glsl.vim 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. " Vim syntax file the OpenGL Shading Language
  2. " Language: GLSL
  3. " Author: Nathan Cournia <nathan@cournia.com>
  4. " Date: June 30, 2004
  5. " File Types: .frag .vert .glsl .fp .vp
  6. " Version: 1.10.00
  7. " Notes: Adapted from c.vim - Bram Moolenaar <bram.vim.org>
  8. " Adapted from cg.vim - Kevin Bjorke <kbjorke@nvidia.com>
  9. " For version 5.x: Clear all syntax items
  10. " For version 6.x: Quit when a syntax file was already loaded
  11. if version < 600
  12. syntax clear
  13. elseif exists("b:current_syntax")
  14. finish
  15. endif
  16. " a bunch of useful keywords
  17. syn keyword glslConditional if else
  18. syn keyword glslStatement break return continue discard
  19. syn keyword glslRepeat while for do
  20. syn keyword glslTodo contained TODO FIXME XXX
  21. " glslCommentGroup allows adding matches for special things in comments
  22. syn cluster glslCommentGroup contains=glslTodo
  23. "catch errors caused by wrong parenthesis and brackets
  24. 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
  25. if exists("c_no_bracket_error")
  26. syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslCppString
  27. " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
  28. syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslParen,glslString
  29. syn match glslParenError display ")"
  30. syn match glslErrInParen display contained "[{}]"
  31. else
  32. syn region glslParen transparent start='(' end=')' contains=ALLBUT,@glslParenGroup,glslCppParen,glslErrInBracket,glslCppBracket,glslCppString
  33. " glslCppParen: same as glslParen but ends at end-of-line; used in glslDefine
  34. syn region glslCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInBracket,glslParen,glslBracket,glslString
  35. syn match glslParenError display "[\])]"
  36. syn match glslErrInParen display contained "[\]{}]"
  37. syn region glslBracket transparent start='\[' end=']' contains=ALLBUT,@glslParenGroup,glslErrInParen,glslCppParen,glslCppBracket,glslCppString
  38. " glslCppBracket: same as glslParen but ends at end-of-line; used in glslDefine
  39. syn region glslCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@glslParenGroup,glslErrInParen,glslParen,glslBracket,glslString
  40. syn match glslErrInBracket display contained "[);{}]"
  41. endif
  42. "integer number, or floating point number without a dot and with "f".
  43. syn case ignore
  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\)\>"
  48. "hex number
  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*"
  62. syn case match
  63. if exists("c_comment_strings")
  64. " A comment can contain glslString, glslCharacter and glslNumber.
  65. " But a "*/" inside a glslString in a glslComment DOES end the comment! So we
  66. " need to use a special type of glslString: glslCommentString, which also ends on
  67. " "*/", and sees a "*" at the start of the line as glslomment again.
  68. " Unfortunately this doesn't very well work for // type of comments :-(
  69. syntax match glslCommentSkip contained "^\s*\*\($\|\s\+\)"
  70. syntax region glslCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=glslSpecial,glslCommentSkip
  71. syntax region glslComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=glslSpecial
  72. syntax region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslComment2String,glslCharacter,glslNumbersCom,glslSpaceError
  73. syntax region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslCommentString,glslCharacter,glslNumbersCom,glslSpaceError
  74. else
  75. syn region glslCommentL start="//" skip="\\$" end="$" keepend contains=@glslCommentGroup,glslSpaceError
  76. syn region glslComment matchgroup=glslCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@glslCommentGroup,glslCommentStartError,glslSpaceError
  77. endif
  78. " keep a // comment separately, it terminates a preproc. conditional
  79. syntax match glslCommentError display "\*/"
  80. syntax match glslCommentStartError display "/\*"me=e-1 contained
  81. syn keyword glslType void
  82. syn keyword glslType bool bvec2 bvec3 bvec4
  83. syn keyword glslType int ivec2 ivec3 ivec4
  84. syn keyword glslType float vec2 vec3 vec4
  85. syn keyword glslType mat2 mat3 mat4
  86. syn keyword glslType sampler1D sampler2D sampler3D samplerCUBE sampler1DShadow sampler2DShadow
  87. syn keyword glslStructure struct
  88. syn keyword glslStorageClass const attribute varying uniform
  89. syn keyword glslStorageClass in out inout
  90. syn keyword glslConstant __LINE__ __FILE__ __VERSION__
  91. syn keyword glslConstant true false
  92. 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
  93. syn match glslPreCondit display "^\s*#\s*\(else\|endif\)\>"
  94. syn region glslCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=glslCppOut2
  95. syn region glslCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=glslSpaceError,glslCppSkip
  96. syn region glslCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=glslSpaceError,glslCppSkip
  97. "syn match glslLineSkip "\\$"
  98. 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
  99. syn region glslDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@glslPreProglslGroup
  100. syn region glslPreProc start="^\s*#\s*\(pragma\>\|line\>\|error\>\|version\>\|extension\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@glslPreProglslGroup
  101. " Highlight User Labels
  102. 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
  103. syn region glslMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@glslMultiGroup
  104. " Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
  105. syn cluster glslLabelGroup contains=glslUserLabel
  106. syn match glslUserCont display "^\s*\I\i*\s*:$" contains=@glslLabelGroup
  107. syn match glslUserCont display ";\s*\I\i*\s*:$" contains=@glslLabelGroup
  108. syn match glslUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
  109. syn match glslUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@glslLabelGroup
  110. syn match glslUserLabel display "\I\i*" contained
  111. " Avoid recognizing most bitfields as labels
  112. syn match glslBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1
  113. syn match glslBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1
  114. syn keyword glslState gl_Position gl_PointSize gl_ClipVertex
  115. syn keyword glslState gl_FragCoord gl_FrontFacing gl_FragColor gl_FragData gl_FragDepth
  116. " vertex attributes
  117. syn keyword glslState gl_Color gl_SecondaryColor gl_Normal gl_Vertex gl_FogCoord
  118. syn match glslState display "gl_MultiTexCoord\d\+"
  119. " varying variables
  120. syn keyword glslState gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord
  121. " uniforms
  122. syn keyword glslUniform gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix gl_TextureMatrix
  123. syn keyword glslUniform gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial
  124. syn keyword glslUniform gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct
  125. syn keyword glslUniform gl_FrontLightProduct gl_BackLightProduct glTextureEnvColor
  126. syn keyword glslUniform gl_TextureEnvColor gl_Fog
  127. syn match glslUniform display "gl_EyePlane[STRQ]"
  128. syn match glslUniform display "gl_ObjectPlane[STRQ]"
  129. syn keyword glslUniform gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse
  130. syn keyword glslUniform gl_TextureMatrixInverse gl_ModelViewMatrixTranspose gl_ProjectionMatrixTranspose
  131. syn keyword glslUniform gl_ModelViewProjectionMatrixTranspose gl_TextureMatrixTranspose gl_ModelViewMatrixInverseTranspose
  132. syn keyword glslUniform gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose
  133. " uniform types
  134. syn keyword glslType gl_DepthRangeParameters gl_PointParameters gl_MaterialParameters
  135. syn keyword glslType gl_LightSourceParameters gl_LightModelParameters gl_LightModelProducts
  136. syn keyword glslType gl_LightProducts gl_FogParameters
  137. " constants
  138. syn keyword glslConstant gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs
  139. syn keyword glslConstant gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits
  140. syn keyword glslConstant gl_MaxCombinedTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents
  141. syn keyword glslConstant gl_MaxDrawBuffers
  142. " swizzling
  143. syn match glslSwizzle /\.[xyzw]\{1,4\}\>/
  144. syn match glslSwizzle /\.[rgba]\{1,4\}\>/
  145. syn match glslSwizzle /\.[stpq]\{1,4\}\>/
  146. " built in functions
  147. syn keyword glslFunc radians degrees sin cos tan asin acos atan pow exp2 log2 sqrt inversesqrt
  148. syn keyword glslFunc abs sign floor ceil fract mod min max clamp mix step smoothstep
  149. syn keyword glslFunc length distance dot cross normalize ftransform faceforward reflect
  150. syn keyword glslFunc matrixcompmult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not
  151. syn keyword glslFunc texture1D texture1DProj texture1DLod texture1DProjLod
  152. syn keyword glslFunc texture2D texture2DProj texture2DLod texture2DProjLod
  153. syn keyword glslFunc texture3D texture3DProj texture3DLod texture3DProjLod
  154. syn keyword glslFunc textureCube textureCubeLod
  155. syn keyword glslFunc shadow1D shadow1DProj shadow1DLod shadow1DProjLod
  156. syn keyword glslFunc shadow2D shadow2DProj shadow2DLod shadow2DProjLod
  157. syn keyword glslFunc dFdx dFdy fwidth noise1 noise2 noise3 noise4
  158. syn keyword glslFunc refract exp log
  159. " highlight unsupported keywords
  160. syn keyword glslUnsupported asm
  161. syn keyword glslUnsupported class union enum typedef template this packed
  162. syn keyword glslUnsupported goto switch default
  163. syn keyword glslUnsupported inline noinline volatile public static extern external interface
  164. syn keyword glslUnsupported long short double half fixed unsigned
  165. syn keyword glslUnsupported input output
  166. syn keyword glslUnsupported hvec2 hvec3 hvec4 dvec2 dvec3 dvec4 fvec2 fvec3 fvec4
  167. syn keyword glslUnsupported sampler2DRect sampler3DRect sampler2DRectShadow
  168. syn keyword glslUnsupported sizeof cast
  169. syn keyword glslUnsupported namespace using
  170. "wtf?
  171. "let b:c_minlines = 50 " #if 0 constructs can be long
  172. "exec "syn sync ccomment glslComment minlines=" . b:c_minlines
  173. " Define the default highlighting.
  174. " For version 5.7 and earlier: only when not done already
  175. " For version 5.8 and later: only when an item doesn't have highlighting yet
  176. if version >= 508 || !exists("did_glsl_syn_inits")
  177. if version < 508
  178. let did_glsl_syn_inits = 1
  179. command -nargs=+ HiLink hi link <args>
  180. else
  181. command -nargs=+ HiLink hi def link <args>
  182. endif
  183. HiLink glslFormat glslSpecial
  184. HiLink glslCppString glslString
  185. HiLink glslCommentL glslComment
  186. HiLink glslCommentStart glslComment
  187. HiLink glslLabel Label
  188. HiLink glslUserLabel Label
  189. HiLink glslConditional Conditional
  190. HiLink glslRepeat Repeat
  191. HiLink glslCharacter Character
  192. HiLink glslSpecialCharacter glslSpecial
  193. HiLink glslNumber Number
  194. HiLink glslOctal Number
  195. HiLink glslOctalZero PreProc " link this to Error if you want
  196. HiLink glslFloat Float
  197. HiLink glslOctalError glslError
  198. HiLink glslParenError glslError
  199. HiLink glslErrInParen glslError
  200. HiLink glslErrInBracket glslError
  201. HiLink glslCommentError glslError
  202. HiLink glslCommentStartError glslError
  203. HiLink glslSpaceError glslError
  204. HiLink glslSpecialError glslError
  205. HiLink glslOperator Operator
  206. HiLink glslStructure Structure
  207. HiLink glslStorageClass StorageClass
  208. HiLink glslInclude Include
  209. HiLink glslPreProc PreProc
  210. HiLink glslDefine Macro
  211. HiLink glslIncluded glslString
  212. HiLink glslError Error
  213. HiLink glslStatement Statement
  214. HiLink glslPreCondit PreCondit
  215. HiLink glslType Type
  216. HiLink glslConstant Constant
  217. HiLink glslCommentString glslString
  218. HiLink glslComment2String glslString
  219. HiLink glslCommentSkip glslComment
  220. HiLink glslString String
  221. HiLink glslComment Comment
  222. HiLink glslSpecial SpecialChar
  223. HiLink glslSwizzle SpecialChar
  224. HiLink glslTodo Todo
  225. HiLink glslCppSkip glslCppOut
  226. HiLink glslCppOut2 glslCppOut
  227. HiLink glslCppOut Comment
  228. HiLink glslUniform glslType
  229. HiLink glslState glslType
  230. HiLink glslFunc glslStatement
  231. HiLink glslUnsupported glslError
  232. delcommand HiLink
  233. endif
  234. let b:current_syntax = "glsl"
  235. " vim: ts=8