Skip to content

Commit

Permalink
Add v language, closes #437
Browse files Browse the repository at this point in the history
  • Loading branch information
sheerun committed Dec 7, 2019
1 parent e204a72 commit 4d8423c
Show file tree
Hide file tree
Showing 6 changed files with 354 additions and 1 deletion.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ A collection of language packs for Vim.
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
- It **installs and updates 120+ times faster** than the <!--Package Count-->146<!--/Package Count--> packages it consists of.
- It **installs and updates 120+ times faster** than the <!--Package Count-->147<!--/Package Count--> packages it consists of.
- Solid syntax and indentation support (other features skipped). Only the best language packs.
- All unnecessary files are ignored (like enormous documentation from php support).
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
Expand Down Expand Up @@ -178,6 +178,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [tptp](https://github.com/c-cube/vim-tptp) (syntax)
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
- [typescript](https://github.com/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin)
- [v](https://github.com/ollykel/v-vim) (syntax, indent, ftplugin)
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent, ftplugin)
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax)
Expand Down
1 change: 1 addition & 0 deletions build
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@ PACKS="
tptp:c-cube/vim-tptp
twig:lumiliet/vim-twig
typescript:HerringtonDarkholme/yats.vim
v:ollykel/v-vim
vala:arrufat/vala.vim
vbnet:vim-scripts/vbnet.vim
vcl:smerrill/vcl-vim-plugin
Expand Down
8 changes: 8 additions & 0 deletions ftdetect/polyglot.vim
Original file line number Diff line number Diff line change
Expand Up @@ -1473,6 +1473,14 @@ autocmd BufNewFile,BufRead *.tsx setlocal filetype=typescriptreact
augroup end
endif

if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'v') == -1
augroup filetypedetect
" v, from vlang.vim in ollykel/v-vim
au BufNewFile,BufRead *.v set filetype=vlang
au BufNewFile,BufRead *.v set syntax=vlang
augroup end
endif

if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vala') == -1
augroup filetypedetect
" vala, from vala.vim in arrufat/vala.vim
Expand Down
6 changes: 6 additions & 0 deletions ftplugin/vlang.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'v') == -1

setlocal commentstring=//\ %s
setlocal makeprg=v\ %

endif
69 changes: 69 additions & 0 deletions indent/vlang.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'v') == -1

" Based on the Go identation file.
"
" Copyright 2011 The Go Authors. All rights reserved.
" Use of this source code is governed by a BSD-style
" license that can be found in the LICENSE file.

if exists("b:did_indent")
finish
endif
let b:did_indent = 1

setlocal nolisp
setlocal autoindent
setlocal indentexpr=VlangIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=)

if exists("*VlangIndent")
finish
endif

let s:cpo_save = &cpo
set cpo&vim

function! VlangIndent(lnum) abort
let prevlnum = prevnonblank(a:lnum-1)
if prevlnum == 0
return 0
endif

let prevl = substitute(getline(prevlnum), '//.*$', '', '')
let thisl = substitute(getline(a:lnum), '//.*$', '', '')
let previ = indent(prevlnum)

let ind = previ

if prevl =~ '[({]\s*$'
" previous line opened a block
let ind += shiftwidth()
endif
if prevl =~# '^\s*\(case .*\|default\):$'
" previous line is part of a switch statement
let ind += shiftwidth()
endif

if thisl =~ '^\s*[)}]'
" this line closed a block
let ind -= shiftwidth()
endif

" Colons are tricky.
" We want to outdent if it's part of a switch ("case foo:" or "default:").
" We ignore trying to deal with jump labels because (a) they're rare, and
" (b) they're hard to disambiguate from a composite literal key.
if thisl =~# '^\s*\(case .*\|default\):$'
let ind -= shiftwidth()
endif

return ind
endfunction

" restore Vi compatibility settings
let &cpo = s:cpo_save
unlet s:cpo_save

" vim: sw=2 ts=2 et

endif
268 changes: 268 additions & 0 deletions syntax/vlang.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
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 /\<fn\>/
syn match vDeclaration /\<fn\>/
syn match vDeclaration contained /\<fn\>/

" 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 /\<json\.\(encode\|decode\)\>/

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 "\(\<chan\)\@<=\s\+\(<-\)\@="
" value-ignoring receives in a few contexts
syn match vSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+"
endif

" Space-tab error
if v_highlight_space_tab_error != 0
syn match vSpaceError display " \+\t"me=e-1
endif

" Trailing white space error
if v_highlight_trailing_whitespace_error != 0
syn match vSpaceError display excludenl "\s\+$"
endif

hi def link vSpaceError Error

" Function calls and Fields are from: https://github.com/fatih/vim-go/blob/master/syntax/go.vim
" Function calls;
if v_highlight_function_calls
syn match vFunctionCall /\w\+\ze\s*(/ contains=vBuiltins,vDeclaration
syn match vFunctionName display contained /\s\w\+/
hi def link vFunctionName Special
endif

hi def link vFunctionCall Special

" Fields;
if v_highlight_fields
" 1. Match a sequence of word characters coming after a '.'
" 2. Require the following but dont match it: ( \@= see :h E59)
" - The symbols: / - + * % OR
" - The symbols: [] {} <> ) 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

0 comments on commit 4d8423c

Please sign in to comment.