xref: /vim-8.2.3635/runtime/syntax/go.vim (revision 34cc7d8c)
190df4b9dSBram Moolenaar" Copyright 2009 The Go Authors. All rights reserved.
290df4b9dSBram Moolenaar" Use of this source code is governed by a BSD-style
390df4b9dSBram Moolenaar" license that can be found in the LICENSE file.
4fb539273SBram Moolenaar"
590df4b9dSBram Moolenaar" go.vim: Vim syntax file for Go.
690df4b9dSBram Moolenaar" Language:             Go
790df4b9dSBram Moolenaar" Maintainer:           Billie Cleek <[email protected]>
8*34cc7d8cSBram Moolenaar" Latest Revision:      2021-09-18
990df4b9dSBram Moolenaar" License:              BSD-style. See LICENSE file in source repository.
1090df4b9dSBram Moolenaar" Repository:           https://github.com/fatih/vim-go
11fb539273SBram Moolenaar
12fb539273SBram Moolenaar" Quit when a (custom) syntax file was already loaded
1390df4b9dSBram Moolenaarif exists("b:current_syntax")
14fb539273SBram Moolenaar  finish
15fb539273SBram Moolenaarendif
16fb539273SBram Moolenaar
1790df4b9dSBram Moolenaarlet s:keepcpo = &cpo
1890df4b9dSBram Moolenaarset cpo&vim
1990df4b9dSBram Moolenaar
2090df4b9dSBram Moolenaarfunction! s:FoldEnable(...) abort
2190df4b9dSBram Moolenaar  if a:0 > 0
2290df4b9dSBram Moolenaar    return index(s:FoldEnable(), a:1) > -1
23fb539273SBram Moolenaar  endif
2490df4b9dSBram Moolenaar  return get(g:, 'go_fold_enable', ['block', 'import', 'varconst', 'package_comment'])
2590df4b9dSBram Moolenaarendfunction
2690df4b9dSBram Moolenaar
2790df4b9dSBram Moolenaarfunction! s:HighlightArrayWhitespaceError() abort
2890df4b9dSBram Moolenaar  return get(g:, 'go_highlight_array_whitespace_error', 0)
2990df4b9dSBram Moolenaarendfunction
3090df4b9dSBram Moolenaar
3190df4b9dSBram Moolenaarfunction! s:HighlightChanWhitespaceError() abort
3290df4b9dSBram Moolenaar  return get(g:, 'go_highlight_chan_whitespace_error', 0)
3390df4b9dSBram Moolenaarendfunction
3490df4b9dSBram Moolenaar
3590df4b9dSBram Moolenaarfunction! s:HighlightExtraTypes() abort
3690df4b9dSBram Moolenaar  return get(g:, 'go_highlight_extra_types', 0)
3790df4b9dSBram Moolenaarendfunction
3890df4b9dSBram Moolenaar
3990df4b9dSBram Moolenaarfunction! s:HighlightSpaceTabError() abort
4090df4b9dSBram Moolenaar  return get(g:, 'go_highlight_space_tab_error', 0)
4190df4b9dSBram Moolenaarendfunction
4290df4b9dSBram Moolenaar
4390df4b9dSBram Moolenaarfunction! s:HighlightTrailingWhitespaceError() abort
4490df4b9dSBram Moolenaar  return get(g:, 'go_highlight_trailing_whitespace_error', 0)
4590df4b9dSBram Moolenaarendfunction
4690df4b9dSBram Moolenaar
4790df4b9dSBram Moolenaarfunction! s:HighlightOperators() abort
4890df4b9dSBram Moolenaar  return get(g:, 'go_highlight_operators', 0)
4990df4b9dSBram Moolenaarendfunction
5090df4b9dSBram Moolenaar
5190df4b9dSBram Moolenaarfunction! s:HighlightFunctions() abort
5290df4b9dSBram Moolenaar  return get(g:, 'go_highlight_functions', 0)
5390df4b9dSBram Moolenaarendfunction
5490df4b9dSBram Moolenaar
5590df4b9dSBram Moolenaarfunction! s:HighlightFunctionParameters() abort
5690df4b9dSBram Moolenaar  return get(g:, 'go_highlight_function_parameters', 0)
5790df4b9dSBram Moolenaarendfunction
5890df4b9dSBram Moolenaar
5990df4b9dSBram Moolenaarfunction! s:HighlightFunctionCalls() abort
6090df4b9dSBram Moolenaar  return get(g:, 'go_highlight_function_calls', 0)
6190df4b9dSBram Moolenaarendfunction
6290df4b9dSBram Moolenaar
6390df4b9dSBram Moolenaarfunction! s:HighlightFields() abort
6490df4b9dSBram Moolenaar  return get(g:, 'go_highlight_fields', 0)
6590df4b9dSBram Moolenaarendfunction
6690df4b9dSBram Moolenaar
6790df4b9dSBram Moolenaarfunction! s:HighlightTypes() abort
6890df4b9dSBram Moolenaar  return get(g:, 'go_highlight_types', 0)
6990df4b9dSBram Moolenaarendfunction
7090df4b9dSBram Moolenaar
7190df4b9dSBram Moolenaarfunction! s:HighlightBuildConstraints() abort
7290df4b9dSBram Moolenaar  return get(g:, 'go_highlight_build_constraints', 0)
7390df4b9dSBram Moolenaarendfunction
7490df4b9dSBram Moolenaar
7590df4b9dSBram Moolenaarfunction! s:HighlightStringSpellcheck() abort
7690df4b9dSBram Moolenaar  return get(g:, 'go_highlight_string_spellcheck', 1)
7790df4b9dSBram Moolenaarendfunction
7890df4b9dSBram Moolenaar
7990df4b9dSBram Moolenaarfunction! s:HighlightFormatStrings() abort
8090df4b9dSBram Moolenaar  return get(g:, 'go_highlight_format_strings', 1)
8190df4b9dSBram Moolenaarendfunction
8290df4b9dSBram Moolenaar
8390df4b9dSBram Moolenaarfunction! s:HighlightGenerateTags() abort
8490df4b9dSBram Moolenaar  return get(g:, 'go_highlight_generate_tags', 0)
8590df4b9dSBram Moolenaarendfunction
8690df4b9dSBram Moolenaar
8790df4b9dSBram Moolenaarfunction! s:HighlightVariableAssignments() abort
8890df4b9dSBram Moolenaar  return get(g:, 'go_highlight_variable_assignments', 0)
8990df4b9dSBram Moolenaarendfunction
9090df4b9dSBram Moolenaar
9190df4b9dSBram Moolenaarfunction! s:HighlightVariableDeclarations() abort
9290df4b9dSBram Moolenaar  return get(g:, 'go_highlight_variable_declarations', 0)
9390df4b9dSBram Moolenaarendfunction
94fb539273SBram Moolenaar
95fb539273SBram Moolenaarsyn case match
96fb539273SBram Moolenaar
9790df4b9dSBram Moolenaarsyn keyword     goPackage           package
9890df4b9dSBram Moolenaarsyn keyword     goImport            import    contained
9990df4b9dSBram Moolenaarsyn keyword     goVar               var       contained
10090df4b9dSBram Moolenaarsyn keyword     goConst             const     contained
101fb539273SBram Moolenaar
10290df4b9dSBram Moolenaarhi def link     goPackage           Statement
10390df4b9dSBram Moolenaarhi def link     goImport            Statement
10490df4b9dSBram Moolenaarhi def link     goVar               Keyword
10590df4b9dSBram Moolenaarhi def link     goConst             Keyword
106fb539273SBram Moolenaarhi def link     goDeclaration       Keyword
107fb539273SBram Moolenaar
108fb539273SBram Moolenaar" Keywords within functions
109fb539273SBram Moolenaarsyn keyword     goStatement         defer go goto return break continue fallthrough
110fb539273SBram Moolenaarsyn keyword     goConditional       if else switch select
111fb539273SBram Moolenaarsyn keyword     goLabel             case default
112fb539273SBram Moolenaarsyn keyword     goRepeat            for range
113fb539273SBram Moolenaar
114fb539273SBram Moolenaarhi def link     goStatement         Statement
115fb539273SBram Moolenaarhi def link     goConditional       Conditional
116fb539273SBram Moolenaarhi def link     goLabel             Label
117fb539273SBram Moolenaarhi def link     goRepeat            Repeat
118fb539273SBram Moolenaar
119fb539273SBram Moolenaar" Predefined types
120fb539273SBram Moolenaarsyn keyword     goType              chan map bool string error
121fb539273SBram Moolenaarsyn keyword     goSignedInts        int int8 int16 int32 int64 rune
122fb539273SBram Moolenaarsyn keyword     goUnsignedInts      byte uint uint8 uint16 uint32 uint64 uintptr
123fb539273SBram Moolenaarsyn keyword     goFloats            float32 float64
124fb539273SBram Moolenaarsyn keyword     goComplexes         complex64 complex128
125fb539273SBram Moolenaar
126fb539273SBram Moolenaarhi def link     goType              Type
127fb539273SBram Moolenaarhi def link     goSignedInts        Type
128fb539273SBram Moolenaarhi def link     goUnsignedInts      Type
129fb539273SBram Moolenaarhi def link     goFloats            Type
130fb539273SBram Moolenaarhi def link     goComplexes         Type
131fb539273SBram Moolenaar
132fb539273SBram Moolenaar" Predefined functions and values
133fb539273SBram Moolenaarsyn keyword     goBuiltins                 append cap close complex copy delete imag len
134fb539273SBram Moolenaarsyn keyword     goBuiltins                 make new panic print println real recover
13590df4b9dSBram Moolenaarsyn keyword     goBoolean                  true false
13690df4b9dSBram Moolenaarsyn keyword     goPredefinedIdentifiers    nil iota
137fb539273SBram Moolenaar
13890df4b9dSBram Moolenaarhi def link     goBuiltins                 Identifier
13990df4b9dSBram Moolenaarhi def link     goBoolean                  Boolean
14090df4b9dSBram Moolenaarhi def link     goPredefinedIdentifiers    goBoolean
141fb539273SBram Moolenaar
142fb539273SBram Moolenaar" Comments; their contents
143fb539273SBram Moolenaarsyn keyword     goTodo              contained TODO FIXME XXX BUG
144fb539273SBram Moolenaarsyn cluster     goCommentGroup      contains=goTodo
14590df4b9dSBram Moolenaar
14690df4b9dSBram Moolenaarsyn region      goComment           start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell
14790df4b9dSBram Moolenaarif s:FoldEnable('comment')
14890df4b9dSBram Moolenaar  syn region    goComment           start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold
14990df4b9dSBram Moolenaar  syn match     goComment           "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold
15090df4b9dSBram Moolenaarelse
151fb539273SBram Moolenaar  syn region    goComment           start="/\*" end="\*/" contains=@goCommentGroup,@Spell
15290df4b9dSBram Moolenaarendif
153fb539273SBram Moolenaar
154fb539273SBram Moolenaarhi def link     goComment           Comment
155fb539273SBram Moolenaarhi def link     goTodo              Todo
156fb539273SBram Moolenaar
15790df4b9dSBram Moolenaarif s:HighlightGenerateTags()
15890df4b9dSBram Moolenaar  syn match       goGenerateVariables contained /\%(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/
15990df4b9dSBram Moolenaar  syn region      goGenerate          start="^\s*//go:generate" end="$" contains=goGenerateVariables
16090df4b9dSBram Moolenaar  hi def link     goGenerate          PreProc
16190df4b9dSBram Moolenaar  hi def link     goGenerateVariables Special
16290df4b9dSBram Moolenaarendif
16390df4b9dSBram Moolenaar
164fb539273SBram Moolenaar" Go escapes
165fb539273SBram Moolenaarsyn match       goEscapeOctal       display contained "\\[0-7]\{3}"
166fb539273SBram Moolenaarsyn match       goEscapeC           display contained +\\[abfnrtv\\'"]+
167fb539273SBram Moolenaarsyn match       goEscapeX           display contained "\\x\x\{2}"
168fb539273SBram Moolenaarsyn match       goEscapeU           display contained "\\u\x\{4}"
169fb539273SBram Moolenaarsyn match       goEscapeBigU        display contained "\\U\x\{8}"
170fb539273SBram Moolenaarsyn match       goEscapeError       display contained +\\[^0-7xuUabfnrtv\\'"]+
171fb539273SBram Moolenaar
172fb539273SBram Moolenaarhi def link     goEscapeOctal       goSpecialString
173fb539273SBram Moolenaarhi def link     goEscapeC           goSpecialString
174fb539273SBram Moolenaarhi def link     goEscapeX           goSpecialString
175fb539273SBram Moolenaarhi def link     goEscapeU           goSpecialString
176fb539273SBram Moolenaarhi def link     goEscapeBigU        goSpecialString
177fb539273SBram Moolenaarhi def link     goSpecialString     Special
178fb539273SBram Moolenaarhi def link     goEscapeError       Error
179fb539273SBram Moolenaar
180fb539273SBram Moolenaar" Strings and their contents
181fb539273SBram Moolenaarsyn cluster     goStringGroup       contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError
18290df4b9dSBram Moolenaarif s:HighlightStringSpellcheck()
18390df4b9dSBram Moolenaar  syn region      goString            start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell
18490df4b9dSBram Moolenaar  syn region      goRawString         start=+`+ end=+`+ contains=@Spell
18590df4b9dSBram Moolenaarelse
186fb539273SBram Moolenaar  syn region      goString            start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup
187fb539273SBram Moolenaar  syn region      goRawString         start=+`+ end=+`+
18890df4b9dSBram Moolenaarendif
18990df4b9dSBram Moolenaar
19090df4b9dSBram Moolenaarif s:HighlightFormatStrings()
19190df4b9dSBram Moolenaar  " [n] notation is valid for specifying explicit argument indexes
19290df4b9dSBram Moolenaar  " 1. Match a literal % not preceded by a %.
19390df4b9dSBram Moolenaar  " 2. Match any number of -, #, 0, space, or +
19490df4b9dSBram Moolenaar  " 3. Match * or [n]* or any number or nothing before a .
19590df4b9dSBram Moolenaar  " 4. Match * or [n]* or any number or nothing after a .
19690df4b9dSBram Moolenaar  " 5. Match [n] or nothing before a verb
19790df4b9dSBram Moolenaar  " 6. Match a formatting verb
19890df4b9dSBram Moolenaar  syn match       goFormatSpecifier   /\
19990df4b9dSBram Moolenaar        \%([^%]\%(%%\)*\)\
20090df4b9dSBram Moolenaar        \@<=%[-#0 +]*\
20190df4b9dSBram Moolenaar        \%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\
20290df4b9dSBram Moolenaar        \%(\.\%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\)\=\
20390df4b9dSBram Moolenaar        \%(\[\d\+\]\)\=[vTtbcdoqxXUeEfFgGspw]/ contained containedin=goString,goRawString
20490df4b9dSBram Moolenaar  hi def link     goFormatSpecifier   goSpecialString
20590df4b9dSBram Moolenaarendif
206fb539273SBram Moolenaar
207fb539273SBram Moolenaarhi def link     goString            String
208fb539273SBram Moolenaarhi def link     goRawString         String
209fb539273SBram Moolenaar
210fb539273SBram Moolenaar" Characters; their contents
211fb539273SBram Moolenaarsyn cluster     goCharacterGroup    contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU
212fb539273SBram Moolenaarsyn region      goCharacter         start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup
213fb539273SBram Moolenaar
214fb539273SBram Moolenaarhi def link     goCharacter         Character
215fb539273SBram Moolenaar
216fb539273SBram Moolenaar" Regions
217fb539273SBram Moolenaarsyn region      goParen             start='(' end=')' transparent
21890df4b9dSBram Moolenaarif s:FoldEnable('block')
21990df4b9dSBram Moolenaar  syn region    goBlock             start="{" end="}" transparent fold
22090df4b9dSBram Moolenaarelse
22190df4b9dSBram Moolenaar  syn region    goBlock             start="{" end="}" transparent
22290df4b9dSBram Moolenaarendif
22390df4b9dSBram Moolenaar
22490df4b9dSBram Moolenaar" import
22590df4b9dSBram Moolenaarif s:FoldEnable('import')
22690df4b9dSBram Moolenaar  syn region    goImport            start='import (' end=')' transparent fold contains=goImport,goString,goComment
22790df4b9dSBram Moolenaarelse
22890df4b9dSBram Moolenaar  syn region    goImport            start='import (' end=')' transparent contains=goImport,goString,goComment
22990df4b9dSBram Moolenaarendif
23090df4b9dSBram Moolenaar
23190df4b9dSBram Moolenaar" var, const
23290df4b9dSBram Moolenaarif s:FoldEnable('varconst')
23390df4b9dSBram Moolenaar  syn region    goVar               start='var ('   end='^\s*)$' transparent fold
23490df4b9dSBram Moolenaar                        \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
23590df4b9dSBram Moolenaar  syn region    goConst             start='const (' end='^\s*)$' transparent fold
23690df4b9dSBram Moolenaar                        \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
23790df4b9dSBram Moolenaarelse
23890df4b9dSBram Moolenaar  syn region    goVar               start='var ('   end='^\s*)$' transparent
23990df4b9dSBram Moolenaar                        \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
24090df4b9dSBram Moolenaar  syn region    goConst             start='const (' end='^\s*)$' transparent
24190df4b9dSBram Moolenaar                        \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
24290df4b9dSBram Moolenaarendif
24390df4b9dSBram Moolenaar
24490df4b9dSBram Moolenaar" Single-line var, const, and import.
24590df4b9dSBram Moolenaarsyn match       goSingleDecl        /\%(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst
246fb539273SBram Moolenaar
247fb539273SBram Moolenaar" Integers
24890df4b9dSBram Moolenaarsyn match       goDecimalInt        "\<-\=\(0\|[1-9]_\?\(\d\|\d\+_\?\d\+\)*\)\%([Ee][-+]\=\d\+\)\=\>"
24990df4b9dSBram Moolenaarsyn match       goDecimalError      "\<-\=\(_\(\d\+_*\)\+\|\([1-9]\d*_*\)\+__\(\d\+_*\)\+\|\([1-9]\d*_*\)\+_\+\)\%([Ee][-+]\=\d\+\)\=\>"
25090df4b9dSBram Moolenaarsyn match       goHexadecimalInt    "\<-\=0[xX]_\?\(\x\+_\?\)\+\>"
25190df4b9dSBram Moolenaarsyn match       goHexadecimalError  "\<-\=0[xX]_\?\(\x\+_\?\)*\(\([^ \t0-9A-Fa-f_)]\|__\)\S*\|_\)\>"
25290df4b9dSBram Moolenaarsyn match       goOctalInt          "\<-\=0[oO]\?_\?\(\o\+_\?\)\+\>"
253*34cc7d8cSBram Moolenaarsyn match       goOctalError        "\<-\=0[0-7oO_]*\(\([^ \t0-7oOxX_/)\]\}\:;]\|[oO]\{2,\}\|__\)\S*\|_\|[oOxX]\)\>"
25490df4b9dSBram Moolenaarsyn match       goBinaryInt         "\<-\=0[bB]_\?\([01]\+_\?\)\+\>"
25590df4b9dSBram Moolenaarsyn match       goBinaryError       "\<-\=0[bB]_\?[01_]*\([^ \t01_)]\S*\|__\S*\|_\)\>"
256fb539273SBram Moolenaar
257fb539273SBram Moolenaarhi def link     goDecimalInt        Integer
25890df4b9dSBram Moolenaarhi def link     goDecimalError      Error
259fb539273SBram Moolenaarhi def link     goHexadecimalInt    Integer
26090df4b9dSBram Moolenaarhi def link     goHexadecimalError  Error
261fb539273SBram Moolenaarhi def link     goOctalInt          Integer
26290df4b9dSBram Moolenaarhi def link     goOctalError        Error
26390df4b9dSBram Moolenaarhi def link     goBinaryInt         Integer
26490df4b9dSBram Moolenaarhi def link     goBinaryError       Error
265fb539273SBram Moolenaarhi def link     Integer             Number
266fb539273SBram Moolenaar
267fb539273SBram Moolenaar" Floating point
26890df4b9dSBram Moolenaarsyn match       goFloat             "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=\>"
26990df4b9dSBram Moolenaarsyn match       goFloat             "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=\>"
270fb539273SBram Moolenaar
271fb539273SBram Moolenaarhi def link     goFloat             Float
272fb539273SBram Moolenaar
273fb539273SBram Moolenaar" Imaginary literals
27490df4b9dSBram Moolenaarsyn match       goImaginary         "\<-\=\d\+i\>"
27590df4b9dSBram Moolenaarsyn match       goImaginary         "\<-\=\d\+[Ee][-+]\=\d\+i\>"
27690df4b9dSBram Moolenaarsyn match       goImaginaryFloat    "\<-\=\d\+\.\d*\%([Ee][-+]\=\d\+\)\=i\>"
27790df4b9dSBram Moolenaarsyn match       goImaginaryFloat    "\<-\=\.\d\+\%([Ee][-+]\=\d\+\)\=i\>"
278fb539273SBram Moolenaar
279fb539273SBram Moolenaarhi def link     goImaginary         Number
28090df4b9dSBram Moolenaarhi def link     goImaginaryFloat    Float
281fb539273SBram Moolenaar
282fb539273SBram Moolenaar" Spaces after "[]"
28390df4b9dSBram Moolenaarif s:HighlightArrayWhitespaceError()
28490df4b9dSBram Moolenaar  syn match goSpaceError display "\%(\[\]\)\@<=\s\+"
285fb539273SBram Moolenaarendif
286fb539273SBram Moolenaar
287fb539273SBram Moolenaar" Spacing errors around the 'chan' keyword
28890df4b9dSBram Moolenaarif s:HighlightChanWhitespaceError()
289fb539273SBram Moolenaar  " receive-only annotation on chan type
29090df4b9dSBram Moolenaar  "
29190df4b9dSBram Moolenaar  " \(\<chan\>\)\@<!<-  (only pick arrow when it doesn't come after a chan)
29290df4b9dSBram Moolenaar  " this prevents picking up 'chan<- chan<-' but not '<- chan'
29390df4b9dSBram Moolenaar  syn match goSpaceError display "\%(\%(\<chan\>\)\@<!<-\)\@<=\s\+\%(\<chan\>\)\@="
29490df4b9dSBram Moolenaar
295fb539273SBram Moolenaar  " send-only annotation on chan type
29690df4b9dSBram Moolenaar  "
29790df4b9dSBram Moolenaar  " \(<-\)\@<!\<chan\>  (only pick chan when it doesn't come after an arrow)
29890df4b9dSBram Moolenaar  " this prevents picking up '<-chan <-chan' but not 'chan <-'
29990df4b9dSBram Moolenaar  syn match goSpaceError display "\%(\%(<-\)\@<!\<chan\>\)\@<=\s\+\%(<-\)\@="
30090df4b9dSBram Moolenaar
301fb539273SBram Moolenaar  " value-ignoring receives in a few contexts
30290df4b9dSBram Moolenaar  syn match goSpaceError display "\%(\%(^\|[={(,;]\)\s*<-\)\@<=\s\+"
303fb539273SBram Moolenaarendif
304fb539273SBram Moolenaar
305fb539273SBram Moolenaar" Extra types commonly seen
30690df4b9dSBram Moolenaarif s:HighlightExtraTypes()
30790df4b9dSBram Moolenaar  syn match goExtraType /\<bytes\.\%(Buffer\)\>/
30890df4b9dSBram Moolenaar  syn match goExtraType /\<context\.\%(Context\)\>/
30990df4b9dSBram Moolenaar  syn match goExtraType /\<io\.\%(Reader\|ReadSeeker\|ReadWriter\|ReadCloser\|ReadWriteCloser\|Writer\|WriteCloser\|Seeker\)\>/
31090df4b9dSBram Moolenaar  syn match goExtraType /\<reflect\.\%(Kind\|Type\|Value\)\>/
311fb539273SBram Moolenaar  syn match goExtraType /\<unsafe\.Pointer\>/
312fb539273SBram Moolenaarendif
313fb539273SBram Moolenaar
314fb539273SBram Moolenaar" Space-tab error
31590df4b9dSBram Moolenaarif s:HighlightSpaceTabError()
316fb539273SBram Moolenaar  syn match goSpaceError display " \+\t"me=e-1
317fb539273SBram Moolenaarendif
318fb539273SBram Moolenaar
319fb539273SBram Moolenaar" Trailing white space error
32090df4b9dSBram Moolenaarif s:HighlightTrailingWhitespaceError()
321fb539273SBram Moolenaar  syn match goSpaceError display excludenl "\s\+$"
322fb539273SBram Moolenaarendif
323fb539273SBram Moolenaar
324fb539273SBram Moolenaarhi def link     goExtraType         Type
325fb539273SBram Moolenaarhi def link     goSpaceError        Error
326fb539273SBram Moolenaar
32790df4b9dSBram Moolenaar
32890df4b9dSBram Moolenaar
32990df4b9dSBram Moolenaar" included from: https://github.com/athom/more-colorful.vim/blob/master/after/syntax/go.vim
33090df4b9dSBram Moolenaar"
33190df4b9dSBram Moolenaar" Comments; their contents
33290df4b9dSBram Moolenaarsyn keyword     goTodo              contained NOTE
33390df4b9dSBram Moolenaarhi def link     goTodo              Todo
33490df4b9dSBram Moolenaar
33590df4b9dSBram Moolenaarsyn match goVarArgs /\.\.\./
33690df4b9dSBram Moolenaar
33790df4b9dSBram Moolenaar" Operators;
33890df4b9dSBram Moolenaarif s:HighlightOperators()
33990df4b9dSBram Moolenaar  " match single-char operators:          - + % < > ! & | ^ * =
34090df4b9dSBram Moolenaar  " and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= ==
34190df4b9dSBram Moolenaar  syn match goOperator /[-+%<>!&|^*=]=\?/
34290df4b9dSBram Moolenaar  " match / and /=
34390df4b9dSBram Moolenaar  syn match goOperator /\/\%(=\|\ze[^/*]\)/
34490df4b9dSBram Moolenaar  " match two-char operators:               << >> &^
34590df4b9dSBram Moolenaar  " and corresponding three-char operators: <<= >>= &^=
34690df4b9dSBram Moolenaar  syn match goOperator /\%(<<\|>>\|&^\)=\?/
34790df4b9dSBram Moolenaar  " match remaining two-char operators: := && || <- ++ --
34890df4b9dSBram Moolenaar  syn match goOperator /:=\|||\|<-\|++\|--/
34990df4b9dSBram Moolenaar  " match ...
35090df4b9dSBram Moolenaar
35190df4b9dSBram Moolenaar  hi def link     goPointerOperator   goOperator
35290df4b9dSBram Moolenaar  hi def link     goVarArgs           goOperator
35390df4b9dSBram Moolenaarendif
35490df4b9dSBram Moolenaarhi def link     goOperator          Operator
35590df4b9dSBram Moolenaar
35690df4b9dSBram Moolenaar" Functions;
35790df4b9dSBram Moolenaarif s:HighlightFunctions() || s:HighlightFunctionParameters()
35890df4b9dSBram Moolenaar  syn match goDeclaration       /\<func\>/ nextgroup=goReceiver,goFunction,goSimpleParams skipwhite skipnl
35990df4b9dSBram Moolenaar  syn match goReceiverVar       /\w\+\ze\s\+\%(\w\|\*\)/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained
36090df4b9dSBram Moolenaar  syn match goPointerOperator   /\*/ nextgroup=goReceiverType contained skipwhite skipnl
36190df4b9dSBram Moolenaar  syn match goFunction          /\w\+/ nextgroup=goSimpleParams contained skipwhite skipnl
36290df4b9dSBram Moolenaar  syn match goReceiverType      /\w\+/ contained
36390df4b9dSBram Moolenaar  if s:HighlightFunctionParameters()
36490df4b9dSBram Moolenaar    syn match goSimpleParams      /(\%(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goParamName,goType nextgroup=goFunctionReturn skipwhite skipnl
36590df4b9dSBram Moolenaar    syn match goFunctionReturn   /(\%(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goParamName,goType skipwhite skipnl
36690df4b9dSBram Moolenaar    syn match goParamName        /\w\+\%(\s*,\s*\w\+\)*\ze\s\+\%(\w\|\.\|\*\|\[\)/ contained nextgroup=goParamType skipwhite skipnl
36790df4b9dSBram Moolenaar    syn match goParamType        /\%([^,)]\|\_s\)\+,\?/ contained nextgroup=goParamName skipwhite skipnl
36890df4b9dSBram Moolenaar                          \ contains=goVarArgs,goType,goSignedInts,goUnsignedInts,goFloats,goComplexes,goDeclType,goBlock
36990df4b9dSBram Moolenaar    hi def link   goReceiverVar    goParamName
37090df4b9dSBram Moolenaar    hi def link   goParamName      Identifier
37190df4b9dSBram Moolenaar  endif
37290df4b9dSBram Moolenaar  syn match goReceiver          /(\s*\w\+\%(\s\+\*\?\s*\w\+\)\?\s*)\ze\s*\w/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl
37390df4b9dSBram Moolenaarelse
37490df4b9dSBram Moolenaar  syn keyword goDeclaration func
37590df4b9dSBram Moolenaarendif
37690df4b9dSBram Moolenaarhi def link     goFunction          Function
37790df4b9dSBram Moolenaar
37890df4b9dSBram Moolenaar" Function calls;
37990df4b9dSBram Moolenaarif s:HighlightFunctionCalls()
38090df4b9dSBram Moolenaar  syn match goFunctionCall      /\w\+\ze(/ contains=goBuiltins,goDeclaration
38190df4b9dSBram Moolenaarendif
38290df4b9dSBram Moolenaarhi def link     goFunctionCall      Type
38390df4b9dSBram Moolenaar
38490df4b9dSBram Moolenaar" Fields;
38590df4b9dSBram Moolenaarif s:HighlightFields()
38690df4b9dSBram Moolenaar  " 1. Match a sequence of word characters coming after a '.'
38790df4b9dSBram Moolenaar  " 2. Require the following but dont match it: ( \@= see :h E59)
38890df4b9dSBram Moolenaar  "    - The symbols: / - + * %   OR
38990df4b9dSBram Moolenaar  "    - The symbols: [] {} <> )  OR
39090df4b9dSBram Moolenaar  "    - The symbols: \n \r space OR
39190df4b9dSBram Moolenaar  "    - The symbols: , : .
39290df4b9dSBram Moolenaar  " 3. Have the start of highlight (hs) be the start of matched
39390df4b9dSBram Moolenaar  "    pattern (s) offsetted one to the right (+1) (see :h E401)
39490df4b9dSBram Moolenaar  syn match       goField   /\.\w\+\
39590df4b9dSBram Moolenaar        \%(\%([\/\-\+*%]\)\|\
39690df4b9dSBram Moolenaar        \%([\[\]{}<\>\)]\)\|\
39790df4b9dSBram Moolenaar        \%([\!=\^|&]\)\|\
39890df4b9dSBram Moolenaar        \%([\n\r\ ]\)\|\
39990df4b9dSBram Moolenaar        \%([,\:.]\)\)\@=/hs=s+1
40090df4b9dSBram Moolenaarendif
40190df4b9dSBram Moolenaarhi def link    goField              Identifier
40290df4b9dSBram Moolenaar
40390df4b9dSBram Moolenaar" Structs & Interfaces;
40490df4b9dSBram Moolenaarif s:HighlightTypes()
40590df4b9dSBram Moolenaar  syn match goTypeConstructor      /\<\w\+{\@=/
40690df4b9dSBram Moolenaar  syn match goTypeDecl             /\<type\>/ nextgroup=goTypeName skipwhite skipnl
40790df4b9dSBram Moolenaar  syn match goTypeName             /\w\+/ contained nextgroup=goDeclType skipwhite skipnl
40890df4b9dSBram Moolenaar  syn match goDeclType             /\<\%(interface\|struct\)\>/ skipwhite skipnl
40990df4b9dSBram Moolenaar  hi def link     goReceiverType      Type
41090df4b9dSBram Moolenaarelse
41190df4b9dSBram Moolenaar  syn keyword goDeclType           struct interface
41290df4b9dSBram Moolenaar  syn keyword goDeclaration        type
41390df4b9dSBram Moolenaarendif
41490df4b9dSBram Moolenaarhi def link     goTypeConstructor   Type
41590df4b9dSBram Moolenaarhi def link     goTypeName          Type
41690df4b9dSBram Moolenaarhi def link     goTypeDecl          Keyword
41790df4b9dSBram Moolenaarhi def link     goDeclType          Keyword
41890df4b9dSBram Moolenaar
41990df4b9dSBram Moolenaar" Variable Assignments
42090df4b9dSBram Moolenaarif s:HighlightVariableAssignments()
42190df4b9dSBram Moolenaar  syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/
42290df4b9dSBram Moolenaar  hi def link   goVarAssign         Special
42390df4b9dSBram Moolenaarendif
42490df4b9dSBram Moolenaar
42590df4b9dSBram Moolenaar" Variable Declarations
42690df4b9dSBram Moolenaarif s:HighlightVariableDeclarations()
42790df4b9dSBram Moolenaar  syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/
42890df4b9dSBram Moolenaar  hi def link   goVarDefs           Special
42990df4b9dSBram Moolenaarendif
43090df4b9dSBram Moolenaar
43190df4b9dSBram Moolenaar" Build Constraints
43290df4b9dSBram Moolenaarif s:HighlightBuildConstraints()
433*34cc7d8cSBram Moolenaar  syn match   goBuildKeyword      display contained "+build\|go:build"
43490df4b9dSBram Moolenaar  " Highlight the known values of GOOS, GOARCH, and other +build options.
43590df4b9dSBram Moolenaar  syn keyword goBuildDirectives   contained
43690df4b9dSBram Moolenaar        \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9
43790df4b9dSBram Moolenaar        \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64
43890df4b9dSBram Moolenaar        \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc
43990df4b9dSBram Moolenaar        \ s390 s390x sparc sparc64 cgo ignore race
44090df4b9dSBram Moolenaar
44190df4b9dSBram Moolenaar  " Other words in the build directive are build tags not listed above, so
44290df4b9dSBram Moolenaar  " avoid highlighting them as comments by using a matchgroup just for the
44390df4b9dSBram Moolenaar  " start of the comment.
44490df4b9dSBram Moolenaar  " The rs=s+2 option lets the \s*+build portion be part of the inner region
44590df4b9dSBram Moolenaar  " instead of the matchgroup so it will be highlighted as a goBuildKeyword.
44690df4b9dSBram Moolenaar  syn region  goBuildComment      matchgroup=goBuildCommentStart
44790df4b9dSBram Moolenaar        \ start="//\s*+build\s"rs=s+2 end="$"
44890df4b9dSBram Moolenaar        \ contains=goBuildKeyword,goBuildDirectives
44990df4b9dSBram Moolenaar  hi def link goBuildCommentStart Comment
45090df4b9dSBram Moolenaar  hi def link goBuildDirectives   Type
45190df4b9dSBram Moolenaar  hi def link goBuildKeyword      PreProc
45290df4b9dSBram Moolenaarendif
45390df4b9dSBram Moolenaar
45490df4b9dSBram Moolenaarif s:HighlightBuildConstraints() || s:FoldEnable('package_comment')
45590df4b9dSBram Moolenaar  " One or more line comments that are followed immediately by a "package"
45690df4b9dSBram Moolenaar  " declaration are treated like package documentation, so these must be
45790df4b9dSBram Moolenaar  " matched as comments to avoid looking like working build constraints.
45890df4b9dSBram Moolenaar  " The he, me, and re options let the "package" itself be highlighted by
45990df4b9dSBram Moolenaar  " the usual rules.
46090df4b9dSBram Moolenaar  exe 'syn region  goPackageComment    start=/\v(\/\/.*\n)+\s*package/'
46190df4b9dSBram Moolenaar        \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7'
46290df4b9dSBram Moolenaar        \ . ' contains=@goCommentGroup,@Spell'
46390df4b9dSBram Moolenaar        \ . (s:FoldEnable('package_comment') ? ' fold' : '')
46490df4b9dSBram Moolenaar  exe 'syn region  goPackageComment    start=/\v^\s*\/\*.*\n(.*\n)*\s*\*\/\npackage/'
46590df4b9dSBram Moolenaar        \ . ' end=/\v\*\/\n\s*package/he=e-7,me=e-7,re=e-7'
46690df4b9dSBram Moolenaar        \ . ' contains=@goCommentGroup,@Spell'
46790df4b9dSBram Moolenaar        \ . (s:FoldEnable('package_comment') ? ' fold' : '')
46890df4b9dSBram Moolenaar  hi def link goPackageComment    Comment
46990df4b9dSBram Moolenaarendif
47090df4b9dSBram Moolenaar
47190df4b9dSBram Moolenaar" :GoCoverage commands
47290df4b9dSBram Moolenaarhi def link goCoverageNormalText Comment
47390df4b9dSBram Moolenaar
474fb539273SBram Moolenaar" Search backwards for a global declaration to start processing the syntax.
475fb539273SBram Moolenaar"syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/
476fb539273SBram Moolenaar
477fb539273SBram Moolenaar" There's a bug in the implementation of grouphere. For now, use the
478fb539273SBram Moolenaar" following as a more expensive/less precise workaround.
479fb539273SBram Moolenaarsyn sync minlines=500
480fb539273SBram Moolenaar
48190df4b9dSBram Moolenaarlet b:current_syntax = "go"
48290df4b9dSBram Moolenaar
48390df4b9dSBram Moolenaarlet &cpo = s:keepcpo
48490df4b9dSBram Moolenaarunlet s:keepcpo
485fb539273SBram Moolenaar
486fb539273SBram Moolenaar" vim: sw=2 sts=2 et
487