1 " Copyright 2009 The Go Authors. All rights reserved.
2 " Use of this source code is governed by a BSD-style
3 " license that can be found in the LICENSE file.
5 " go.vim: Vim syntax file for Go.
8 " There are some options for customizing the highlighting; the recommended
9 " settings are the default values, but you can write:
11 " in your ~/.vimrc file to disable particular options. You can also write:
13 " to enable particular options. At present, all options default to on.
15 " - go_highlight_array_whitespace_error
16 " Highlights white space after "[]".
17 " - go_highlight_chan_whitespace_error
18 " Highlights white space around the communications operator that don't follow
20 " - go_highlight_extra_types
21 " Highlights commonly used library types (os.Error, etc.).
22 " - go_highlight_space_tab_error
23 " Highlights instances of tabs following spaces.
24 " - go_highlight_trailing_whitespace_error
25 " Highlights trailing white space.
27 " Quit when a (custom) syntax file was already loaded
28 if exists("b:current_syntax")
32 if !exists("go_highlight_array_whitespace_error")
33 let go_highlight_array_whitespace_error = 1
35 if !exists("go_highlight_chan_whitespace_error")
36 let go_highlight_chan_whitespace_error = 1
38 if !exists("go_highlight_extra_types")
39 let go_highlight_extra_types = 1
41 if !exists("go_highlight_space_tab_error")
42 let go_highlight_space_tab_error = 1
44 if !exists("go_highlight_trailing_whitespace_error")
45 let go_highlight_trailing_whitespace_error = 1
50 syn keyword goDirective package import
51 syn keyword goDeclaration var const type
52 syn keyword goDeclType struct interface
54 hi def link goDirective Statement
55 hi def link goDeclaration Keyword
56 hi def link goDeclType Keyword
58 " Keywords within functions
59 syn keyword goStatement defer go goto return break continue fallthrough
60 syn keyword goConditional if else switch select
61 syn keyword goLabel case default
62 syn keyword goRepeat for range
64 hi def link goStatement Statement
65 hi def link goConditional Conditional
66 hi def link goLabel Label
67 hi def link goRepeat Repeat
70 syn keyword goType chan map bool string
71 syn keyword goSignedInts int int8 int16 int32 int64
72 syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr
73 syn keyword goFloats float float32 float64
74 syn keyword goComplexes complex complex64 complex128
76 hi def link goType Type
77 hi def link goSignedInts Type
78 hi def link goUnsignedInts Type
79 hi def link goFloats Type
80 hi def link goComplexes Type
82 " Treat func specially: it's a declaration at the start of a line, but a type
83 " elsewhere. Order matters here.
84 syn match goType /\<func\>/
85 syn match goDeclaration /^func\>/
87 " Predefined functions and values
88 syn keyword goBuiltins append cap close closed cmplx copy imag len
89 syn keyword goBuiltins make new panic print println real recover
90 syn keyword goConstants iota true false nil
92 hi def link goBuiltins Keyword
93 hi def link goConstants Keyword
95 " Comments; their contents
96 syn keyword goTodo contained TODO FIXME XXX BUG
97 syn cluster goCommentGroup contains=goTodo
98 syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell
99 syn region goComment start="//" end="$" contains=@goCommentGroup,@Spell
101 hi def link goComment Comment
102 hi def link goTodo Todo
105 syn match goEscapeOctal display contained "\\[0-7]\{3}"
106 syn match goEscapeC display contained +\\[abfnrtv\\'"]+
107 syn match goEscapeX display contained "\\x\x\{2}"
108 syn match goEscapeU display contained "\\u\x\{4}"
109 syn match goEscapeBigU display contained "\\U\x\{8}"
110 syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+
112 hi def link goEscapeOctal goSpecialString
113 hi def link goEscapeC goSpecialString
114 hi def link goEscapeX goSpecialString
115 hi def link goEscapeU goSpecialString
116 hi def link goEscapeBigU goSpecialString
117 hi def link goSpecialString Special
118 hi def link goEscapeError Error
120 " Strings and their contents
121 syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError
122 syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup
123 syn region goRawString start=+`+ end=+`+
125 hi def link goString String
126 hi def link goRawString String
128 " Characters; their contents
129 syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU
130 syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup
132 hi def link goCharacter Character
135 syn region goBlock start="{" end="}" transparent fold
136 syn region goParen start='(' end=')' transparent
139 syn match goDecimalInt "\<\d\+\([Ee]\d\+\)\?\>"
140 syn match goHexadecimalInt "\<0x\x\+\>"
141 syn match goOctalInt "\<0\o\+\>"
142 syn match goOctalError "\<0\o*[89]\d*\>"
144 hi def link goDecimalInt Integer
145 hi def link goHexadecimalInt Integer
146 hi def link goOctalInt Integer
147 hi def link Integer Number
150 syn match goFloat "\<\d\+\.\d*\([Ee][-+]\d\+\)\?\>"
151 syn match goFloat "\<\.\d\+\([Ee][-+]\d\+\)\?\>"
152 syn match goFloat "\<\d\+[Ee][-+]\d\+\>"
154 hi def link goFloat Float
157 syn match goImaginary "\<\d\+i\>"
158 syn match goImaginary "\<\d\+\.\d*\([Ee][-+]\d\+\)\?i\>"
159 syn match goImaginary "\<\.\d\+\([Ee][-+]\d\+\)\?i\>"
160 syn match goImaginary "\<\d\+[Ee][-+]\d\+i\>"
162 hi def link goImaginary Number
165 if go_highlight_array_whitespace_error != 0
166 syn match goSpaceError display "\(\[\]\)\@<=\s\+"
169 " Spacing errors around the 'chan' keyword
170 if go_highlight_chan_whitespace_error != 0
171 " receive-only annotation on chan type
172 syn match goSpaceError display "\(<-\)\@<=\s\+\(chan\>\)\@="
173 " send-only annotation on chan type
174 syn match goSpaceError display "\(\<chan\)\@<=\s\+\(<-\)\@="
175 " value-ignoring receives in a few contexts
176 syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+"
179 " Extra types commonly seen
180 if go_highlight_extra_types != 0
181 syn match goExtraType /\<bytes\.\(Buffer\)\>/
182 syn match goExtraType /\<io\.\(Reader\|Writer\|ReadWriter\|ReadWriteCloser\)\>/
183 syn match goExtraType /\<\(os\.Error\)\>/
184 syn match goExtraType /\<reflect\.\w*\(Type\|Value\)\>/
185 syn match goExtraType /\<unsafe\.Pointer\>/
189 if go_highlight_space_tab_error != 0
190 syn match goSpaceError display " \+\t"me=e-1
193 " Trailing white space error
194 if go_highlight_trailing_whitespace_error != 0
195 syn match goSpaceError display excludenl "\s\+$"
198 hi def link goExtraType Type
199 hi def link goSpaceError Error
201 let b:current_syntax = "go"