diff options
| -rwxr-xr-x | build | 6 | ||||
| -rw-r--r-- | ftdetect/polyglot.vim | 15 | ||||
| -rw-r--r-- | indent/go.vim | 65 | ||||
| -rw-r--r-- | syntax/go.vim | 276 | ||||
| -rw-r--r-- | syntax/godoc.vim | 47 | 
5 files changed, 407 insertions, 2 deletions
| @@ -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 edfca72e..59621bdd 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 00000000..faf4d79e --- /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 00000000..76377829 --- /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       /\<func\>/ + + +" 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 "\(\<chan\)\@<=\s\+\(<-\)\@=" +  " value-ignoring receives in a few contexts +  syn match goSpaceError display "\(\(^\|[={(,;]\)\s*<-\)\@<=\s\+" +endif + +" Extra types commonly seen +if go_highlight_extra_types != 0 +  syn match goExtraType /\<bytes\.\(Buffer\)\>/ +  syn match goExtraType /\<io\.\(Reader\|Writer\|ReadWriter\|ReadWriteCloser\)\>/ +  syn match goExtraType /\<reflect\.\(Kind\|Type\|Value\)\>/ +  syn match goExtraType /\<unsafe\.Pointer\>/ +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 00000000..0fba2080 --- /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: | 
