From 964107c604a3dc559c30febfe2a08be31659170d Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Wed, 13 Aug 2014 00:55:50 +0200 Subject: [PATCH] Switch to official go package, closes #28 --- build | 6 +- ftdetect/polyglot.vim | 15 +++ indent/go.vim | 65 ++++++++++ syntax/go.vim | 276 ++++++++++++++++++++++++++++++++++++++++++ syntax/godoc.vim | 47 +++++++ 5 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 indent/go.vim create mode 100644 syntax/go.vim create mode 100644 syntax/godoc.vim diff --git a/build b/build index 157be75..ba798d5 100755 --- a/build +++ b/build @@ -3,6 +3,7 @@ set -E DIRS="syntax indent compiler autoload ftplugin ftdetect after/syntax after/indent after/ftplugin after/ftdetect" +DIRS_BASIC="syntax indent ftdetect after/syntax after/indent after/ftdetect" download() { for pack in $1; do @@ -21,10 +22,11 @@ extract() { name="$(printf "$pack" | cut -d ':' -f 1)" path="$(printf "$pack" | cut -d ':' -f 2)" dir="tmp/$(printf "$path" | cut -d '/' -f 2)" + directories="DIRS$(printf "$pack" | cut -d ':' -f 3)" printf -- "- [$name](https://github.com/$path) (" subdirs="" - for subdir in $DIRS; do + for subdir in ${!directories}; do if [ -d "$dir/$subdir" ]; then base="$(basename "$subdir")" if [[ "$subdirs" != *"$base"* ]]; then @@ -82,7 +84,7 @@ PACKS=" emblem:heartsentwined/vim-emblem erlang:oscarh/vimerl git:tpope/vim-git - go:jnwhiteh/vim-golang + go:fatih/vim-go:_BASIC haml:tpope/vim-haml handlebars:mustache/vim-mustache-handlebars haskell:travitch/hasksyn diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index edfca72..59621bd 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -38,6 +38,21 @@ autocmd BufNewFile,BufRead * \ if getline(1) =~ '^From \x\{40\} Mon Sep 17 00:00:00 2001$' | \ set filetype=gitsendemail | \ endif +let s:current_fileformats = '' +let s:current_fileencodings = '' +function! s:gofiletype_pre() + let s:current_fileformats = &g:fileformats + let s:current_fileencodings = &g:fileencodings + set fileencodings=utf-8 fileformats=unix + setlocal filetype=go +endfunction +function! s:gofiletype_post() + let &g:fileformats = s:current_fileformats + let &g:fileencodings = s:current_fileencodings +endfunction +au BufNewFile *.go setlocal filetype=go fileencoding=utf-8 fileformat=unix +au BufRead *.go call s:gofiletype_pre() +au BufReadPost *.go call s:gofiletype_post() autocmd BufNewFile,BufRead *.haml,*.hamlbars,*.hamlc setf haml autocmd BufNewFile,BufRead *.sass setf sass autocmd BufNewFile,BufRead *.scss setf scss diff --git a/indent/go.vim b/indent/go.vim new file mode 100644 index 0000000..faf4d79 --- /dev/null +++ b/indent/go.vim @@ -0,0 +1,65 @@ +" 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. +" +" indent/go.vim: Vim indent file for Go. +" +" TODO: +" - function invocations split across lines +" - general line splits (line ends in an operator) + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" C indentation is too far off useful, mainly due to Go's := operator. +" Let's just define our own. +setlocal nolisp +setlocal autoindent +setlocal indentexpr=GoIndent(v:lnum) +setlocal indentkeys+=<:>,0=},0=) + +if exists("*GoIndent") + finish +endif + +function! GoIndent(lnum) + let prevlnum = prevnonblank(a:lnum-1) + if prevlnum == 0 + " top of file + return 0 + endif + + " grab the previous and current line, stripping comments. + 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 += &sw + endif + if prevl =~# '^\s*\(case .*\|default\):$' + " previous line is part of a switch statement + let ind += &sw + endif + " TODO: handle if the previous line is a label. + + if thisl =~ '^\s*[)}]' + " this line closed a block + let ind -= &sw + 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 -= &sw + endif + + return ind +endfunction diff --git a/syntax/go.vim b/syntax/go.vim new file mode 100644 index 0000000..7637782 --- /dev/null +++ b/syntax/go.vim @@ -0,0 +1,276 @@ +" Copyright 2009 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. +" +" 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 on. +" +" - 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. + +" Quit when a (custom) syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +if !exists("go_highlight_array_whitespace_error") + let go_highlight_array_whitespace_error = 1 +endif + +if !exists("go_highlight_chan_whitespace_error") + let go_highlight_chan_whitespace_error = 1 +endif + +if !exists("go_highlight_extra_types") + let go_highlight_extra_types = 1 +endif + +if !exists("go_highlight_space_tab_error") + let go_highlight_space_tab_error = 1 +endif + +if !exists("go_highlight_trailing_whitespace_error") + let go_highlight_trailing_whitespace_error = 1 +endif + +if !exists("go_highlight_operators") + let go_highlight_operators = 1 +endif + +if !exists("go_highlight_functions") + let go_highlight_functions = 1 +endif + +if !exists("go_highlight_methods") + let go_highlight_methods = 1 +endif + +if !exists("go_highlight_structs") + let go_highlight_structs = 1 +endif + +syn case match + +syn keyword goDirective package import +syn keyword goDeclaration var const type +syn keyword goDeclType struct interface + +hi def link goDirective Statement +hi def link goDeclaration Keyword +hi def link goDeclType Keyword + +" Keywords within functions +syn keyword goStatement defer go goto return break continue fallthrough +syn keyword goConditional if else switch select +syn keyword goLabel case default +syn keyword goRepeat for range + +hi def link goStatement Statement +hi def link goConditional Conditional +hi def link goLabel Label +hi def link goRepeat Repeat + +" Predefined types +syn keyword goType chan map bool string error +syn keyword goSignedInts int int8 int16 int32 int64 rune +syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr +syn keyword goFloats float32 float64 +syn keyword goComplexes complex64 complex128 + +hi def link goType Type +hi def link goSignedInts Type +hi def link goUnsignedInts Type +hi def link goFloats Type +hi def link goComplexes Type + +" Treat func specially: it's a declaration at the start of a line, but a type +" elsewhere. Order matters here. +syn match goDeclaration /\/ + + +" Predefined functions and values +syn keyword goBuiltins append cap close complex copy delete imag len +syn keyword goBuiltins make new panic print println real recover +syn keyword goConstants iota true false nil + +hi def link goBuiltins Keyword +hi def link goConstants Keyword + +" 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=@goCommentGroup,@Spell + +hi def link goComment Comment +hi def link goTodo Todo + +" Go escapes +syn match goEscapeOctal display contained "\\[0-7]\{3}" +syn match goEscapeC display contained +\\[abfnrtv\\'"]+ +syn match goEscapeX display contained "\\x\x\{2}" +syn match goEscapeU display contained "\\u\x\{4}" +syn match goEscapeBigU display contained "\\U\x\{8}" +syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+ + +hi def link goEscapeOctal goSpecialString +hi def link goEscapeC goSpecialString +hi def link goEscapeX goSpecialString +hi def link goEscapeU goSpecialString +hi def link goEscapeBigU goSpecialString +hi def link goSpecialString Special +hi def link goEscapeError Error + +" Strings and their contents +syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError +syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup +syn region goRawString start=+`+ end=+`+ + +hi def link goString String +hi def link goRawString String + +" Characters; their contents +syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU +syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup + +hi def link goCharacter Character + +" Regions +syn region goBlock start="{" end="}" transparent fold +syn region goParen start='(' end=')' transparent + +" Integers +syn match goDecimalInt "\<\d\+\([Ee]\d\+\)\?\>" +syn match goHexadecimalInt "\<0x\x\+\>" +syn match goOctalInt "\<0\o\+\>" +syn match goOctalError "\<0\o*[89]\d*\>" + +hi def link goDecimalInt Integer +hi def link goHexadecimalInt Integer +hi def link goOctalInt Integer +hi def link Integer Number + +" Floating point +syn match goFloat "\<\d\+\.\d*\([Ee][-+]\d\+\)\?\>" +syn match goFloat "\<\.\d\+\([Ee][-+]\d\+\)\?\>" +syn match goFloat "\<\d\+[Ee][-+]\d\+\>" + +hi def link goFloat Float + +" Imaginary literals +syn match goImaginary "\<\d\+i\>" +syn match goImaginary "\<\d\+\.\d*\([Ee][-+]\d\+\)\?i\>" +syn match goImaginary "\<\.\d\+\([Ee][-+]\d\+\)\?i\>" +syn match goImaginary "\<\d\+[Ee][-+]\d\+i\>" + +hi def link goImaginary Number + +" Spaces after "[]" +if go_highlight_array_whitespace_error != 0 + syn match goSpaceError display "\(\[\]\)\@<=\s\+" +endif + +" Spacing errors around the 'chan' keyword +if go_highlight_chan_whitespace_error != 0 + " receive-only annotation on chan type + syn match goSpaceError display "\(<-\)\@<=\s\+\(chan\>\)\@=" + " send-only annotation on chan type + syn match goSpaceError display "\(\/ + syn match goExtraType /\/ + syn match goExtraType /\/ + syn match goExtraType /\/ +endif + +" Space-tab error +if go_highlight_space_tab_error != 0 + syn match goSpaceError display " \+\t"me=e-1 +endif + +" Trailing white space error +if go_highlight_trailing_whitespace_error != 0 + syn match goSpaceError display excludenl "\s\+$" +endif + +hi def link goExtraType Type +hi def link goSpaceError Error + + + +" included from: https://github.com/athom/more-colorful.vim/blob/master/after/syntax/go.vim +" +" Comments; their contents +syn keyword goTodo contained NOTE +hi def link goTodo Todo + + +" Operators; +if go_highlight_operators != 0 + syn match goOperator /:=/ + syn match goOperator />=/ + syn match goOperator /<=/ + syn match goOperator /==/ + syn match goOperator /!=/ + syn match goOperator /+=/ + syn match goOperator /-=/ + syn match goOperator /\s>\s/ + syn match goOperator /\s<\s/ + syn match goOperator /\s+\s/ + syn match goOperator /\s-\s/ + syn match goOperator /\s\*\s/ + syn match goOperator /\s\/\s/ + syn match goOperator /\s%\s/ +endif +hi def link goOperator Operator + +" Functions; +if go_highlight_functions != 0 + syn match goFunction /\(func\s\+\)\@<=\w\+\((\)\@=/ + syn match goFunction /\()\s\+\)\@<=\w\+\((\)\@=/ +endif +hi def link goFunction Function + +" Methods; +if go_highlight_methods != 0 + syn match goMethod /\(\.\)\@<=\w\+\((\)\@=/ +endif +hi def link goMethod Type + +" Structs; +if go_highlight_structs != 0 + syn match goStruct /\(.\)\@<=\w\+\({\)\@=/ + syn match goStructDef /\(type\s\+\)\@<=\w\+\(\s\+struct\s\+{\)\@=/ +endif +hi def link goStruct Function +hi def link goStructDef Function + +" Search backwards for a global declaration to start processing the syntax. +"syn sync match goSync 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 = "go" diff --git a/syntax/godoc.vim b/syntax/godoc.vim new file mode 100644 index 0000000..0fba208 --- /dev/null +++ b/syntax/godoc.vim @@ -0,0 +1,47 @@ +" 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:current_syntax") + finish +endif + +syn case match + +syn match godocTitle "^\([A-Z][A-Z ]*\)$" +hi def link godocTitle Title + +" Single Line Definitions +syn match godocMethodRec /\i\+\ze)/ contained +syn match godocMethodName /) \zs\i\+\ze(/ contained +syn match godocMethod /^func \((\i\+ [^)]*)\) \i\+(/ contains=godocMethodRec,godocMethodName +syn match godocFunction /^func \zs\i\+\ze(/ + +syn match godocType /^type \zs\i\+\ze.*/ +syn match godocVar /^var \zs\i\+\ze.*/ +syn match godocConst /^const \zs\i\+\ze.*/ + +hi def link godocMethodRec Type +hi def link godocType Type +hi def link godocMethodName Function +hi def link godocFunction Function +hi def link godocVar Identifier +hi def link godocConst Identifier + +" Definition Blocks +syn region godocComment start="/\*" end="\*/" contained +syn region godocComment start="//" end="$" contained +syn match godocDefinition /^\s\+\i\+/ contained + +syn region godocVarBlock start=/^var (/ end=/^)/ contains=godocComment,godocDefinition +syn region godocConstBlock start=/^const (/ end=/^)/ contains=godocComment,godocDefinition +syn region godocTypeBlock start=/^type \i\+ \(interface\|struct\) {/ end=/^}/ matchgroup=godocType contains=godocComment,godocType + +hi def link godocComment Comment +hi def link godocDefinition Identifier + +syn sync minlines=500 + +let b:current_syntax = "godoc" + +" vim:ts=4 sts=2 sw=2: