diff options
Diffstat (limited to 'syntax/go.vim')
-rw-r--r-- | syntax/go.vim | 137 |
1 files changed, 103 insertions, 34 deletions
diff --git a/syntax/go.vim b/syntax/go.vim index 3ea87319..69c2b011 100644 --- a/syntax/go.vim +++ b/syntax/go.vim @@ -5,36 +5,13 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1 " license that can be found in the LICENSE file. " " go.vim: Vim syntax file for Go. -" -" Options: -" There are some options for customizing the highlighting; the recommended -" settings are the default values, but you can write: -" let OPTION_NAME = 0 -" in your ~/.vimrc file to disable particular options. You can also write: -" let OPTION_NAME = 1 -" to enable particular options. At present, all options default to off: -" -" - go_highlight_array_whitespace_error -" Highlights white space after "[]". -" - go_highlight_chan_whitespace_error -" Highlights white space around the communications operator that don't follow -" the standard style. -" - go_highlight_extra_types -" Highlights commonly used library types (io.Reader, etc.). -" - go_highlight_space_tab_error -" Highlights instances of tabs following spaces. -" - go_highlight_trailing_whitespace_error -" Highlights trailing white space. -" - go_highlight_string_spellcheck -" Specifies that strings should be spell checked -" - go_highlight_format_strings -" Highlights printf-style operators inside string literals. " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") finish endif +" Set settings to default values. if !exists("g:go_highlight_array_whitespace_error") let g:go_highlight_array_whitespace_error = 0 endif @@ -91,12 +68,52 @@ if !exists("g:go_highlight_generate_tags") let g:go_highlight_generate_tags = 0 endif +if !exists("g:go_highlight_variable_assignments") + let g:go_highlight_variable_assignments = 0 +endif + +if !exists("g:go_highlight_variable_declarations") + let g:go_highlight_variable_declarations = 0 +endif + +let s:fold_block = 1 +let s:fold_import = 1 +let s:fold_varconst = 1 +let s:fold_package_comment = 1 +let s:fold_comment = 0 + +if exists("g:go_fold_enable") + " Enabled by default. + if index(g:go_fold_enable, 'block') == -1 + let s:fold_block = 0 + endif + if index(g:go_fold_enable, 'import') == -1 + let s:fold_import = 0 + endif + if index(g:go_fold_enable, 'varconst') == -1 + let s:fold_varconst = 0 + endif + if index(g:go_fold_enable, 'package_comment') == -1 + let s:fold_package_comment = 0 + endif + + " Disabled by default. + if index(g:go_fold_enable, 'comment') > -1 + let s:fold_comment = 1 + endif +endif + syn case match -syn keyword goDirective package import -syn keyword goDeclaration var const +syn keyword goPackage package +syn keyword goImport import contained +syn keyword goVar var contained +syn keyword goConst const contained -hi def link goDirective Statement +hi def link goPackage Statement +hi def link goImport Statement +hi def link goVar Keyword +hi def link goConst Keyword hi def link goDeclaration Keyword " Keywords within functions @@ -137,8 +154,14 @@ hi def link goPredefinedIdentifiers goBoolean " Comments; their contents syn keyword goTodo contained TODO FIXME XXX BUG syn cluster goCommentGroup contains=goTodo -syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell + syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell +if s:fold_comment + syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold + syn match goComment "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold +else + syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell +endif hi def link goComment Comment hi def link goTodo Todo @@ -191,8 +214,35 @@ syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains= hi def link goCharacter Character " Regions -syn region goBlock start="{" end="}" transparent fold syn region goParen start='(' end=')' transparent +if s:fold_block + syn region goBlock start="{" end="}" transparent fold +else + syn region goBlock start="{" end="}" transparent +endif + +" import +if s:fold_import + syn region goImport start='import (' end=')' transparent fold contains=goImport,goString,goComment +else + syn region goImport start='import (' end=')' transparent contains=goImport,goString,goComment +endif + +" var, const +if s:fold_varconst + syn region goVar start='var (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar + syn region goConst start='const (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar +else + syn region goVar start='var (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar + syn region goConst start='const (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar +endif + +" Single-line var, const, and import. +syn match goSingleDecl /\(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst " Integers syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>" @@ -323,10 +373,10 @@ hi def link goField Identifier " Structs & Interfaces; if g:go_highlight_types != 0 - syn match goTypeConstructor /\<\w\+{/he=e-1 + syn match goTypeConstructor /\<\w\+{\@=/ syn match goTypeDecl /\<type\>/ nextgroup=goTypeName skipwhite skipnl syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl - syn match goDeclType /\<interface\|struct\>/ skipwhite skipnl + syn match goDeclType /\<\(interface\|struct\)\>/ skipwhite skipnl hi def link goReceiverType Type else syn keyword goDeclType struct interface @@ -337,6 +387,18 @@ hi def link goTypeName Type hi def link goTypeDecl Keyword hi def link goDeclType Keyword +" Variable Assignments +if g:go_highlight_variable_assignments != 0 + syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/ + hi def link goVarAssign Special +endif + +" Variable Declarations +if g:go_highlight_variable_declarations != 0 + syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/ + hi def link goVarDefs Special +endif + " Build Constraints if g:go_highlight_build_constraints != 0 syn match goBuildKeyword display contained "+build" @@ -358,15 +420,22 @@ if g:go_highlight_build_constraints != 0 hi def link goBuildCommentStart Comment hi def link goBuildDirectives Type hi def link goBuildKeyword PreProc +endif +if g:go_highlight_build_constraints != 0 || s:fold_package_comment " One or more line comments that are followed immediately by a "package" " declaration are treated like package documentation, so these must be " matched as comments to avoid looking like working build constraints. " The he, me, and re options let the "package" itself be highlighted by " the usual rules. - syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/ - \ end=/\v\n\s*package/he=e-7,me=e-7,re=e-7 - \ contains=@goCommentGroup,@Spell + exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/' + \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' + \ . ' contains=@goCommentGroup,@Spell' + \ . (s:fold_package_comment ? ' fold' : '') + exe 'syn region goPackageComment start=/\v\/\*.*\n(.*\n)*\s*\*\/\npackage/' + \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' + \ . ' contains=@goCommentGroup,@Spell' + \ . (s:fold_package_comment ? ' fold' : '') hi def link goPackageComment Comment endif |