if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'v') == -1 " Vim syntax file " Language: V " Maintainer: Oliver Kelton (https://github.com/ollykel) " Last Change: 2019 Jun 13 " NOTE: largely based on go.vim, maintained by David Barnett " see David Barnett (https://github.com/google/vim-ft-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 on. " " - g:v_highlight_array_whitespace_error " Highlights white space after "[]". " - g:v_highlight_chan_whitespace_error " Highlights white space around the communications operator that don't " follow the standard style. " Highlights commonly used library types (io.Reader, etc.). " - g:v_highlight_space_tab_error " Highlights instances of tabs following spaces. " - g:v_highlight_trailing_whitespace_error " Highlights trailing white space. " Quit when a (custom) syntax file was already loaded if exists('b:current_syntax') finish endif if !exists('g:v_highlight_array_whitespace_error') let g:v_highlight_array_whitespace_error = 1 endif if !exists('g:v_highlight_chan_whitespace_error') let g:v_highlight_chan_whitespace_error = 1 endif if !exists('g:v_highlight_space_tab_error') let g:v_highlight_space_tab_error = 1 endif if !exists('g:v_highlight_trailing_whitespace_error') let g:v_highlight_trailing_whitespace_error = 1 endif if !exists('g:v_highlight_function_calls') let g:v_highlight_function_calls = 1 endif if !exists('g:v_highlight_fields') let g:v_highlight_fields = 1 endif syn case match syn match vDeclType "\<\(struct\|interface\)\>" syn keyword vDirective module import syn keyword vDeclaration pub mut const type enum syn region vIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ syn match vIncluded display contained "<[^>]*>" syn match vFlagDefinition display contained "\s\i[^\n]*" syn match vInclude display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=vIncluded syn match vFlag display "^\s*\zs\(%:\|#\)\s*flag\>\s*[^\n]*" contains=vFlagDefinition syn region vShebang display start=/^#!/ end=/$/ hi def link vDirective Statement hi def link vDeclaration Keyword hi def link vDeclType Keyword hi def link vInclude Include hi def link vFlag Include hi def link vIncluded vString hi def link vFlagDefinition vString hi def link vShebang Include " Keywords within functions syn keyword vStatement defer go goto return break continue fallthrough syn keyword vConditional if else switch match or syn keyword vLabel case default syn keyword vRepeat for in syn match vCodeGen /$if\>/ syn match vCodeGen /\.fields\>/ syn match vCodeGen /\.$\i*\>/ hi def link vStatement Statement hi def link vConditional Conditional hi def link vLabel Label hi def link vRepeat Repeat hi def link vCodeGen Identifier " Predefined types syn keyword vType chan map bool string error voidptr syn keyword vSignedInts int i8 i16 i32 i64 rune intptr syn keyword vUnsignedInts byte uint u8 u16 u32 u64 byteptr syn keyword vFloats f32 f64 floatptr syn keyword vComplexes complex64 complex128 hi def link vType Type hi def link vSignedInts Type hi def link vUnsignedInts Type hi def link vFloats Type hi def link vComplexes Type " Treat fn specially: it's a declaration at the start of a line, but a type " elsewhere. Order matters here. " syn match vType /\/ syn match vDeclaration /\/ syn match vDeclaration contained /\/ " Predefined functions and values syn keyword vBuiltins assert C cap complex copy delete exit imag syn keyword vBuiltins print println eprint eprintln print_backtrace syn keyword vBuiltins float_calloc ok memdup range_int real recover syn keyword vBuiltins malloc byte_calloc float_calloc syn keyword vBuiltins isok isnil panic on_panic syn keyword vConstants iota true false syn match vBuiltins /\/ hi def link vBuiltins Keyword hi def link vConstants Keyword " Comments; their contents syn keyword vTodo contained TODO FIXME XXX BUG syn cluster vCommentGroup contains=vTodo syn region vComment start="/\*" end="\*/" contains=@vCommentGroup,@Spell syn region vComment start="//" end="$" contains=@vCommentGroup,@Spell hi def link vComment Comment hi def link vTodo Todo " Go escapes syn match vEscapeOctal display contained "\\[0-7]\{3}" syn match vEscapeVar display contained "\$[0-9A-Za-z\.]*" syn match vEscapeVar display contained "\${[^}]*}" syn match vEscapeC display contained +\\[abfnrtv\\'"]+ syn match vEscapeX display contained "\\x\x\{2}" syn match vEscapeU display contained "\\u\x\{4}" syn match vEscapeBigU display contained "\\U\x\{8}" syn match vEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+ hi def link vEscapeOctal vSpecialString hi def link vEscapeVar vSpecialString hi def link vEscapeC vSpecialString hi def link vEscapeX vSpecialString hi def link vEscapeU vSpecialString hi def link vEscapeBigU vSpecialString hi def link vSpecialString Special hi def link vEscapeError Error " Strings and their contents syn cluster vStringGroup contains=vEscapeOctal,vEscapeVar,vEscapeC,vEscapeX,vEscapeU,vEscapeBigU,vEscapeError syn region vString start=+"+ skip=+\\\\\|\\'+ end=+"+ contains=@vStringGroup syn region vRawString start=+`+ end=+`+ hi def link vString String hi def link vRawString String " Characters; their contents syn cluster vCharacterGroup contains=vEscapeOctal,vEscapeC,vEscapeVar,vEscapeX,vEscapeU,vEscapeBigU syn region vCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@vCharacterGroup hi def link vCharacter Character " Regions syn region vBlock start="{" end="}" transparent fold syn region vParen start='(' end=')' transparent " Integers syn match vDecimalInt "\<\d\+\([Ee]\d\+\)\?\>" syn match vHexadecimalInt "\<0x\x\+\>" syn match vOctalInt "\<0\o\+\>" syn match vOctalError "\<0\o*[89]\d*\>" hi def link vDecimalInt Integer hi def link vHexadecimalInt Integer hi def link vOctalInt Integer hi def link Integer Number " Floating point syn match vFloat "\<\d\+\.\d*\([Ee][-+]\d\+\)\?\>" syn match vFloat "\<\.\d\+\([Ee][-+]\d\+\)\?\>" syn match vFloat "\<\d\+[Ee][-+]\d\+\>" hi def link vFloat Float " Imaginary literals syn match vImaginary "\<\d\+i\>" syn match vImaginary "\<\d\+\.\d*\([Ee][-+]\d\+\)\?i\>" syn match vImaginary "\<\.\d\+\([Ee][-+]\d\+\)\?i\>" syn match vImaginary "\<\d\+[Ee][-+]\d\+i\>" hi def link vImaginary Number " Generics syn match vGenericBrackets display contained "[<>]" syn match vInterfaceDeclaration display "\s*\zsinterface\s*\i*\s*<[^>]*>" contains=vDeclType,vGenericBrackets syn match vStructDeclaration display "\s*\zsstruct\s*\i*\s*<[^>]*>" contains=vDeclType,vGenericBrackets " vFunctionName only appears when v_highlight_function_calls set syn match vFuncDeclaration display "\s*\zsfn\s*\i*\s*<[^>]*>" contains=vFunctionName,vDeclaration,vGenericBrackets hi def link vGenericBrackets Identifier " Spaces after "[]" if v_highlight_array_whitespace_error != 0 syn match vSpaceError display "\(\[\]\)\@<=\s\+" endif " Spacing errors around the 'chan' keyword if v_highlight_chan_whitespace_error != 0 " receive-only annotation on chan type syn match vSpaceError display "\(<-\)\@<=\s\+\(chan\>\)\@=" " send-only annotation on chan type syn match vSpaceError display "\(\ ) OR " - The symbols: \n \r space OR " - The symbols: , : . " 3. Have the start of highlight (hs) be the start of matched " pattern (s) offsetted one to the right (+1) (see :h E401) syn match vField /\.\w\+\ \%(\%([\/\-\+*%]\)\|\ \%([\[\]{}<\>\)]\)\|\ \%([\!=\^|&]\)\|\ \%([\n\r\ ]\)\|\ \%([,\:.]\)\)\@=/hs=s+1 endif hi def link vField Identifier " Search backwards for a global declaration to start processing the syntax. "syn sync match vSync grouphere NONE /^\(const\|var\|type\|func\)\>/ " There's a bug in the implementation of grouphere. For now, use the " following as a more expensive/less precise workaround. syn sync minlines=500 let b:current_syntax = 'vlang' " vim: sw=2 sts=2 et endif