go.vim 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. if !exists("g:go_highlight_fields")
  2. let g:go_highlight_fields = 0
  3. endif
  4. if !exists("g:go_highlight_functions")
  5. let g:go_highlight_functions = 0
  6. endif
  7. if !exists("g:go_highlight_types")
  8. let g:go_highlight_types = 0
  9. endif
  10. if !exists("g:go_highlight_methods")
  11. let g:go_highlight_methods = 0
  12. endif
  13. if g:go_highlight_fields != 0
  14. syn match goField /\(\.\)\@1<=\w\+\([.\ \n\r\:\)\[,+-\*}\\\]]\)\@=/
  15. endif
  16. " Order matters...
  17. if g:go_highlight_functions != 0
  18. " FIXME: This is too greedy
  19. syn match listOfTypes /\([^ ,)]\+\(,\|)\)\@=\)\+/ contains=@goDeclarations,@goDeclTypeBegin,goMapKeyRegion,goFunctionParamRegion,goFunctionReturnRegion,goDeclStructRegion,goDeclInterfaceRegion contained
  20. syn match listOfVars /\([,(]\s*\)\@<=\w\+\(\(, \w\+\)*, \w\+ \)\@=/ contained
  21. endif
  22. if g:go_highlight_types != 0
  23. syn clear goTypeDecl
  24. syn clear goTypeName
  25. syn clear goDeclType
  26. syn match goTypeConstructor /\<\w\+\({\)\@1=/
  27. syn cluster validTypeContains contains=goComment,goDeclSIName,goDeclTypeField,goDeclTypeName
  28. " FIXME: not sure I _need_ to state goDecl_Region
  29. syn cluster validStructContains contains=goComment,goDeclSIName,goDeclTypeField,goDeclTypeSep,goDeclNestedStructType,goString,goRawString,goMapType,goMapKeyRegion,goDeclStructRegion,goDeclInterfaceRegion,goPointerOperator
  30. syn cluster validInterfaceContains contains=goComment,goFunction,goNestedInterfaceType
  31. syn match goDeclTypeField /\w\+/ nextgroup=goDeclTypeSep,@goDeclTypeBegin skipwhite contained
  32. syn match goDeclTypeSep /,/ nextgroup=goDeclTypeField skipwhite contained
  33. syn match goDeclNestedStructType /\w\+\s*\($\|\/\)\@=/ skipwhite contained
  34. syn match goDeclTypeName /\w\+/ nextgroup=@goDeclTypeBegin skipwhite contained
  35. syn match goTypeDecl /\<type\>/ nextgroup=goDeclTypeName,goTypeRegion skipwhite skipnl
  36. syn region goTypeRegion matchgroup=goContainer start=/(/ end=/)/ contains=@validTypeContains skipwhite fold contained
  37. syn region goDeclStructRegion matchgroup=goContainer start=/{/ end=/}/ contains=@validStructContains skipwhite fold contained
  38. syn region goDeclInterfaceRegion matchgroup=goContainer start=/{/ end=/}/ contains=@validInterfaceContains skipwhite fold contained
  39. syn match goNestedInterfaceType /\w\+/ contained
  40. syn match goDeclTypeStart /\*/ contains=OperatorChars nextgroup=goDeclTypeStart,goDeclTypeNamespace,goDeclTypeType,goMapType,@goDeclarations skipwhite contained
  41. syn region goDeclTypeStart matchgroup=goContainer start=/\[/ end=/\]/ contains=@goNumbers nextgroup=goDeclTypeStart,goDeclTypeNamespace,goDeclTypeType,goMapType,@goDeclarations skipwhite transparent contained
  42. syn match goDeclTypeType /\w\+/ contains=goMapType,@goDeclarations skipwhite contained
  43. syn match goDeclTypeNamespace /\w\+\./ contains=OperatorChars nextgroup=goDeclTypeType skipwhite contained
  44. syn cluster goDeclTypeBegin contains=goDeclTypeStart,goDeclTypeType,goDeclTypeNamespace,goDeclaration,goMapType,goDeclStruct,goDeclInterface
  45. syn region goMapKeyRegion matchgroup=goContainer start=/\[/ end=/\]/ contains=@goDeclTypeBegin,goDeclaration nextgroup=@goDeclTypeBegin skipwhite contained
  46. syn keyword goMapType map nextgroup=goMapKeyRegion skipwhite
  47. " This is important in order to differentiate "field type" from "field struct"
  48. " and "field interface"
  49. " FIXME: seems fishy, see @validStructContains
  50. syn match goDeclSIName /\w\+\(\s\([*\[\] ]\)*\<\(struct\|interface\)\>\)\@=/ nextgroup=@goDeclTypeBegin,goDeclStruct,goDeclInterface skipwhite contained
  51. syn match goDeclStruct /\<struct\>/ nextgroup=goDeclStructRegion skipwhite skipnl
  52. syn match goDeclInterface /\<interface\>/ nextgroup=goDeclInterfaceRegion skipwhite skipnl
  53. syn match goVarName /[^, ]\+/ nextgroup=goVarSep,@goDeclTypeBegin,goMapType skipwhite contained
  54. syn match goVarSep /,/ nextgroup=goVarName skipwhite contained
  55. syn region goVarRegion matchgroup=goContainer start=/(/ end=/)/ transparent contained
  56. syn keyword goVarDecl var nextgroup=goVarName,goVarRegion skipwhite
  57. syn region goTypeAssertionRegion matchgroup=goContainer start=/(/ end=/)/ contains=@goDeclTypeBegin,goMapType,goMapKeyRegion skipwhite contained
  58. syn match goTypeAssertionOp /\.\((\)\@=/ nextgroup=goTypeAssertionRegion skipwhite
  59. endif
  60. if g:go_highlight_functions != 0
  61. syn clear goFunctionCall
  62. syn clear goFunction
  63. syn clear goReceiverType
  64. syn match goFunctionCall /\(\.\)\@1<!\w\+\((\)\@1=/ nextgroup=goFuncMethCallRegion
  65. " FIXME: [^,()] is a lazy hack-fix that works in-tandem with listOfTypes
  66. syn match goFunctionReturn /[^,()]\{-}\({\|\/\|$\)\@=/ contains=@goDeclarations,@goDeclTypeBegin,goComment skipwhite contained
  67. syn region goFunctionParamRegion matchgroup=goContainer start=/(/ end=/)/ contains=@goDeclarations,listOfTypes,listOfVars,OperatorChars nextgroup=goFunctionReturn,goFunctionReturnRegion skipwhite transparent contained
  68. syn region goFunctionReturnRegion matchgroup=goContainer start=/(/ end=/)/ contains=@goDeclarations,listOfTypes,listOfVars,OperatorChars skipwhite transparent contained
  69. syn match goFunction /\w\+\((\)\@1=/ nextgroup=goFunctionParamRegion skipwhite contained
  70. syn match goDeclaration /\<func\>/ nextgroup=goReceiverRegion,goFunction,goFunctionParamRegion skipwhite skipnl
  71. " Use the space between func and ( to determine if the next group is a
  72. " receiver or an inlined function (which matches gofmt)
  73. syn region goReceiverRegion matchgroup=goContainer start=/ (/ end=/)/ contains=goReceiverVar,goPointerOperator,@goDeclTypeBegin nextgroup=goFunction skipwhite contained
  74. syn match goReceiverVar /\w\+ / nextgroup=goPointerOperator,@goDeclTypeBegin skipnl contained
  75. syn match goPointerOperator /\*/ nextgroup=@goDeclTypeBegin skipwhite skipnl contained
  76. endif
  77. if g:go_highlight_methods != 0
  78. syn clear goMethodCall
  79. syn match goMethodCall /\(\.\)\@1<=\w\+\((\)\@1=/ nextgroup=goFuncMethCallRegion
  80. endif
  81. syn cluster goDeclarations contains=goDeclaration,goDeclStruct,goDeclInterface
  82. syn cluster goTypes contains=goType,goSignedInts,goUnsignedInts,goFloats,goComplexes
  83. syn cluster goNumbers contains=goDecimalInt,goHexadecimalInt,goOctalInt,goFloat,goImaginary,goImaginaryFloat
  84. syn region goFuncMethCallRegion matchgroup=goContainer start=/(/ end=/)/ transparent contained
  85. syn match goLiteralStructField /\w\+\ze:[^=]/
  86. " Order is important, so redefine
  87. syn match goBuiltins /\<\(append\|cap\|close\|complex\|copy\|delete\|imag\|len\)\((\)\@=/ nextgroup=goBuiltinRegion
  88. syn match goBuiltins /\<\(make\|new\|panic\|print\|println\|real\|recover\)\((\)\@=/ nextgroup=goBuiltinRegion
  89. syn region goBuiltinRegion matchgroup=goContainer start=/(/ end=/)/ transparent contained
  90. hi link goPointerOperator Operator
  91. hi link goTypeAssertionOp Operator
  92. hi link goVarSep Operator
  93. hi link goDeclTypeSep Operator
  94. hi link goTypeConstructor Type
  95. hi link goDeclSIName Type
  96. hi link goDeclTypeType Type
  97. hi link goNestedInterfaceType Type
  98. hi link goMapType Type
  99. hi link goDeclTypeName Type
  100. hi link goDeclNestedStructType Type
  101. hi link goVarDecl goDeclaration
  102. hi link goDeclInterface goDeclaration
  103. hi link goDeclStruct goDeclaration
  104. hi link goFunction Function
  105. hi link goMethodCall Function
  106. hi link goFunctionCall Function
  107. hi link goContainer ContainerChars
  108. hi link goLiteralStructField Special