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