diff options
| -rw-r--r-- | autoload/go/complete.vim | 78 | ||||
| -rwxr-xr-x | build.sh | 1 | ||||
| -rw-r--r-- | compiler/go.vim | 30 | ||||
| -rw-r--r-- | ftdetect/gofiletype.vim | 23 | ||||
| -rw-r--r-- | ftplugin/go.vim | 17 | ||||
| -rw-r--r-- | ftplugin/go/fmt.vim | 63 | ||||
| -rw-r--r-- | ftplugin/go/import.vim | 250 | ||||
| -rwxr-xr-x | ftplugin/go/test.sh | 78 | ||||
| -rw-r--r-- | indent/go.vim | 65 | ||||
| -rw-r--r-- | syntax/go.vim | 207 | ||||
| -rw-r--r-- | syntax/godoc.vim | 20 | 
11 files changed, 832 insertions, 0 deletions
| diff --git a/autoload/go/complete.vim b/autoload/go/complete.vim new file mode 100644 index 00000000..80fa4515 --- /dev/null +++ b/autoload/go/complete.vim @@ -0,0 +1,78 @@ +" 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. +" +" This file provides a utility function that performs auto-completion of +" package names, for use by other commands. + +let s:goos = $GOOS +let s:goarch = $GOARCH + +if len(s:goos) == 0 +  if exists('g:golang_goos') +    let s:goos = g:golang_goos +  elseif has('win32') || has('win64') +    let s:goos = 'windows' +  elseif has('macunix') +    let s:goos = 'darwin' +  else +    let s:goos = '*' +  endif +endif + +if len(s:goarch) == 0 +  if exists('g:golang_goarch') +    let s:goarch = g:golang_goarch +  else +    let s:goarch = '*' +  endif +endif + +function! go#complete#Package(ArgLead, CmdLine, CursorPos) +  let dirs = [] + +  if executable('go') +    let goroot = substitute(system('go env GOROOT'), '\n', '', 'g') +    if v:shell_error +      echomsg '\'go env GOROOT\' failed' +    endif +  else +    let goroot = $GOROOT +  endif + +  if len(goroot) != 0 && isdirectory(goroot) +    let dirs += [goroot] +  endif + +  let pathsep = ':' +  if s:goos == 'windows' +    let pathsep = ';' +  endif +  let workspaces = split($GOPATH, pathsep) +  if workspaces != [] +    let dirs += workspaces +  endif + +  if len(dirs) == 0 +    " should not happen +    return [] +  endif + +  let ret = {} +  for dir in dirs +    " this may expand to multiple lines +    let root = split(expand(dir . '/pkg/' . s:goos . '_' . s:goarch), "\n") +    for r in root +      for i in split(globpath(r, a:ArgLead.'*'), "\n") +        if isdirectory(i) +          let i .= '/' +        elseif i !~ '\.a$' +          continue +        endif +        let i = substitute(substitute(i[len(r)+1:], '[\\]', '/', 'g'), '\.a$', '', 'g') +        let ret[i] = i +      endfor +    endfor +  endfor +  return sort(keys(ret)) +endfunction @@ -50,6 +50,7 @@ syntax 'slim-template/vim-slim' &  syntax 'vim-scripts/XSLT-syntax' &  syntax 'vim-scripts/python.vim--Vasiliev' &  syntax 'vim-scripts/octave.vim--' & +syntax 'uggedal/go-vim' &  wait diff --git a/compiler/go.vim b/compiler/go.vim new file mode 100644 index 00000000..2c8cce49 --- /dev/null +++ b/compiler/go.vim @@ -0,0 +1,30 @@ +" Copyright 2013 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. +" +" compiler/go.vim: Vim compiler file for Go. + +if exists("current_compiler") +    finish +endif +let current_compiler = "go" + +if exists(":CompilerSet") != 2 +    command -nargs=* CompilerSet setlocal <args> +endif + +let s:save_cpo = &cpo +set cpo-=C + +CompilerSet makeprg=go\ build +CompilerSet errorformat= +        \%-G#\ %.%#, +        \%A%f:%l:%c:\ %m, +        \%A%f:%l:\ %m, +        \%C%*\\s%m, +        \%-G%.%# + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim:ts=4:sw=4:et diff --git a/ftdetect/gofiletype.vim b/ftdetect/gofiletype.vim new file mode 100644 index 00000000..b658f6b0 --- /dev/null +++ b/ftdetect/gofiletype.vim @@ -0,0 +1,23 @@ +" We take care to preserve the user's fileencodings and fileformats, +" because those settings are global (not buffer local), yet we want +" to override them for loading Go files, which are defined to be UTF-8. +let s:current_fileformats = '' +let s:current_fileencodings = '' + +" define fileencodings to open as utf-8 encoding even if it's ascii. +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 + +" restore fileencodings as others +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() diff --git a/ftplugin/go.vim b/ftplugin/go.vim new file mode 100644 index 00000000..8066733c --- /dev/null +++ b/ftplugin/go.vim @@ -0,0 +1,17 @@ +" Copyright 2013 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 filetype plugin for Go. + +if exists("b:did_ftplugin") +    finish +endif +let b:did_ftplugin = 1 + +setlocal comments=s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//\ %s + +let b:undo_ftplugin = "setl com< cms<" + +" vim:ts=4:sw=4:et diff --git a/ftplugin/go/fmt.vim b/ftplugin/go/fmt.vim new file mode 100644 index 00000000..5447d457 --- /dev/null +++ b/ftplugin/go/fmt.vim @@ -0,0 +1,63 @@ +" 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. +" +" fmt.vim: Vim command to format Go files with gofmt. +" +" This filetype plugin add a new commands for go buffers: +" +"   :Fmt +" +"       Filter the current Go buffer through gofmt. +"       It tries to preserve cursor position and avoids +"       replacing the buffer with stderr output. +" +" Options: +" +"   g:go_fmt_commands [default=1] +" +"       Flag to indicate whether to enable the commands listed above. +" +if exists("b:did_ftplugin_go_fmt") +    finish +endif + + +if !exists("g:go_fmt_commands") +    let g:go_fmt_commands = 1 +endif + + +if g:go_fmt_commands +    command! -buffer Fmt call s:GoFormat() +endif + +function! s:GoFormat() +    let view = winsaveview() +    silent %!gofmt +    if v:shell_error +        let errors = [] +        for line in getline(1, line('$')) +            let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') +            if !empty(tokens) +                call add(errors, {"filename": @%, +                                 \"lnum":     tokens[2], +                                 \"col":      tokens[3], +                                 \"text":     tokens[4]}) +            endif +        endfor +        if empty(errors) +            % | " Couldn't detect gofmt error format, output errors +        endif +        undo +        if !empty(errors) +            call setloclist(0, errors, 'r') +        endif +        echohl Error | echomsg "Gofmt returned error" | echohl None +    endif +    call winrestview(view) +endfunction + +let b:did_ftplugin_go_fmt = 1 + +" vim:ts=4:sw=4:et diff --git a/ftplugin/go/import.vim b/ftplugin/go/import.vim new file mode 100644 index 00000000..91c8697a --- /dev/null +++ b/ftplugin/go/import.vim @@ -0,0 +1,250 @@ +" 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. +" +" import.vim: Vim commands to import/drop Go packages. +" +" This filetype plugin adds three new commands for go buffers: +" +"   :Import {path} +" +"       Import ensures that the provided package {path} is imported +"       in the current Go buffer, using proper style and ordering. +"       If {path} is already being imported, an error will be +"       displayed and the buffer will be untouched. +" +"   :ImportAs {localname} {path} +" +"       Same as Import, but uses a custom local name for the package. +" +"   :Drop {path} +" +"       Remove the import line for the provided package {path}, if +"       present in the current Go buffer.  If {path} is not being +"       imported, an error will be displayed and the buffer will be +"       untouched. +" +" If you would like to add shortcuts, you can do so by doing the following: +" +"   Import fmt +"   au Filetype go nnoremap <buffer> <LocalLeader>f :Import fmt<CR> +" +"   Drop fmt +"   au Filetype go nnoremap <buffer> <LocalLeader>F :Drop fmt<CR> +" +"   Import the word under your cursor +"   au Filetype go nnoremap <buffer> <LocalLeader>k +"       \ :exe 'Import ' . expand('<cword>')<CR> +" +" The backslash '\' is the default maplocalleader, so it is possible that +" your vim is set to use a different character (:help maplocalleader). +" +" Options: +" +"   g:go_import_commands [default=1] +" +"       Flag to indicate whether to enable the commands listed above. +" +if exists("b:did_ftplugin_go_import") +    finish +endif + +if !exists("g:go_import_commands") +    let g:go_import_commands = 1 +endif + +if g:go_import_commands +    command! -buffer -nargs=? -complete=customlist,go#complete#Package Drop call s:SwitchImport(0, '', <f-args>) +    command! -buffer -nargs=1 -complete=customlist,go#complete#Package Import call s:SwitchImport(1, '', <f-args>) +    command! -buffer -nargs=* -complete=customlist,go#complete#Package ImportAs call s:SwitchImport(1, <f-args>) +endif + +function! s:SwitchImport(enabled, localname, path) +    let view = winsaveview() +    let path = a:path + +    " Quotes are not necessary, so remove them if provided. +    if path[0] == '"' +        let path = strpart(path, 1) +    endif +    if path[len(path)-1] == '"' +        let path = strpart(path, 0, len(path) - 1) +    endif +    if path == '' +        call s:Error('Import path not provided') +        return +    endif + +    " Extract any site prefix (e.g. github.com/). +    " If other imports with the same prefix are grouped separately, +    " we will add this new import with them. +    " Only up to and including the first slash is used. +    let siteprefix = matchstr(path, "^[^/]*/") + +    let qpath = '"' . path . '"' +    if a:localname != '' +        let qlocalpath = a:localname . ' ' . qpath +    else +        let qlocalpath = qpath +    endif +    let indentstr = 0 +    let packageline = -1 " Position of package name statement +    let appendline = -1  " Position to introduce new import +    let deleteline = -1  " Position of line with existing import +    let linesdelta = 0   " Lines added/removed + +    " Find proper place to add/remove import. +    let line = 0 +    while line <= line('$') +        let linestr = getline(line) + +        if linestr =~# '^package\s' +            let packageline = line +            let appendline = line + +        elseif linestr =~# '^import\s\+(' +            let appendstr = qlocalpath +            let indentstr = 1 +            let appendline = line +            let firstblank = -1 +            let lastprefix = "" +            while line <= line("$") +                let line = line + 1 +                let linestr = getline(line) +                let m = matchlist(getline(line), '^\()\|\(\s\+\)\(\S*\s*\)"\(.\+\)"\)') +                if empty(m) +                    if siteprefix == "" && a:enabled +                        " must be in the first group +                        break +                    endif +                    " record this position, but keep looking +                    if firstblank < 0 +                        let firstblank = line +                    endif +                    continue +                endif +                if m[1] == ')' +                    " if there's no match, add it to the first group +                    if appendline < 0 && firstblank >= 0 +                        let appendline = firstblank +                    endif +                    break +                endif +                let lastprefix = matchstr(m[4], "^[^/]*/") +                if a:localname != '' && m[3] != '' +                    let qlocalpath = printf('%-' . (len(m[3])-1) . 's %s', a:localname, qpath) +                endif +                let appendstr = m[2] . qlocalpath +                let indentstr = 0 +                if m[4] == path +                    let appendline = -1 +                    let deleteline = line +                    break +                elseif m[4] < path +                    " don't set candidate position if we have a site prefix, +                    " we've passed a blank line, and this doesn't share the same +                    " site prefix. +                    if siteprefix == "" || firstblank < 0 || match(m[4], "^" . siteprefix) >= 0 +                        let appendline = line +                    endif +                elseif siteprefix != "" && match(m[4], "^" . siteprefix) >= 0 +                    " first entry of site group +                    let appendline = line - 1 +                    break +                endif +            endwhile +            break + +        elseif linestr =~# '^import ' +            if appendline == packageline +                let appendstr = 'import ' . qlocalpath +                let appendline = line - 1 +            endif +            let m = matchlist(linestr, '^import\(\s\+\)\(\S*\s*\)"\(.\+\)"') +            if !empty(m) +                if m[3] == path +                    let appendline = -1 +                    let deleteline = line +                    break +                endif +                if m[3] < path +                    let appendline = line +                endif +                if a:localname != '' && m[2] != '' +                    let qlocalpath = printf("%s %" . len(m[2])-1 . "s", a:localname, qpath) +                endif +                let appendstr = 'import' . m[1] . qlocalpath +            endif + +        elseif linestr =~# '^\(var\|const\|type\|func\)\>' +            break + +        endif +        let line = line + 1 +    endwhile + +    " Append or remove the package import, as requested. +    if a:enabled +        if deleteline != -1 +            call s:Error(qpath . ' already being imported') +        elseif appendline == -1 +            call s:Error('No package line found') +        else +            if appendline == packageline +                call append(appendline + 0, '') +                call append(appendline + 1, 'import (') +                call append(appendline + 2, ')') +                let appendline += 2 +                let linesdelta += 3 +                let appendstr = qlocalpath +                let indentstr = 1 +            endif +            call append(appendline, appendstr) +            execute appendline + 1 +            if indentstr +                execute 'normal >>' +            endif +            let linesdelta += 1 +        endif +    else +        if deleteline == -1 +            call s:Error(qpath . ' not being imported') +        else +            execute deleteline . 'd' +            let linesdelta -= 1 + +            if getline(deleteline-1) =~# '^import\s\+(' && getline(deleteline) =~# '^)' +                " Delete empty import block +                let deleteline -= 1 +                execute deleteline . "d" +                execute deleteline . "d" +                let linesdelta -= 2 +            endif + +            if getline(deleteline) == '' && getline(deleteline - 1) == '' +                " Delete spacing for removed line too. +                execute deleteline . "d" +                let linesdelta -= 1 +            endif +        endif +    endif + +    " Adjust view for any changes. +    let view.lnum += linesdelta +    let view.topline += linesdelta +    if view.topline < 0 +        let view.topline = 0 +    endif + +    " Put buffer back where it was. +    call winrestview(view) + +endfunction + +function! s:Error(s) +    echohl Error | echo a:s | echohl None +endfunction + +let b:did_ftplugin_go_import = 1 + +" vim:ts=4:sw=4:et diff --git a/ftplugin/go/test.sh b/ftplugin/go/test.sh new file mode 100755 index 00000000..d8a5b895 --- /dev/null +++ b/ftplugin/go/test.sh @@ -0,0 +1,78 @@ +#!/bin/bash -e +# +# Copyright 2012 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. +# +# Tests for import.vim. + +cd $(dirname $0) + +cat > base.go <<EOF +package test + +import ( +	"bytes" +	"io" +	"net" + +	"mycorp/foo" +) +EOF + +fail=0 + +# usage: test_one command pattern +# Pattern is a PCRE expression that will match across lines. +test_one() { +  echo 2>&1 -n "$1: " +  vim -e -s -u /dev/null -U /dev/null --noplugin -c "source import.vim" \ +    -c "$1" -c 'wq! test.go' base.go +  # ensure blank lines are treated correctly +  if ! gofmt test.go | cmp test.go -; then +    echo 2>&1 "gofmt conflict" +    gofmt test.go | diff -u test.go - | sed "s/^/	/" 2>&1 +    fail=1 +    return +  fi +  if ! [[ $(cat test.go) =~ $2 ]]; then +    echo 2>&1 "$2 did not match" +    cat test.go | sed "s/^/	/" 2>&1 +    fail=1 +    return +  fi +  echo 2>&1 "ok" +} + +# Tests for Import + +test_one "Import baz" '"baz".*"bytes"' +test_one "Import io/ioutil" '"io".*"io/ioutil".*"net"' +test_one "Import myc" '"io".*"myc".*"net"'  # prefix of a site prefix +test_one "Import nat" '"io".*"nat".*"net"' +test_one "Import net/http" '"net".*"net/http".*"mycorp/foo"' +test_one "Import zoo" '"net".*"zoo".*"mycorp/foo"' +test_one "Import mycorp/bar" '"net".*"mycorp/bar".*"mycorp/foo"' +test_one "Import mycorp/goo" '"net".*"mycorp/foo".*"mycorp/goo"' + +# Tests for Drop + +cat > base.go <<EOF +package test + +import ( +	"foo" + +	"something" +	"zoo" +) +EOF + +test_one "Drop something" '\([^"]*"foo"[^"]*"zoo"[^"]*\)' + +rm -f base.go test.go +if [ $fail -gt 0 ]; then +  echo 2>&1 "FAIL" +  exit 1 +fi +echo 2>&1 "PASS" 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..1ce6cb27 --- /dev/null +++ b/syntax/go.vim @@ -0,0 +1,207 @@ +" 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 + +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       goType              /\<func\>/ +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 + +" 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..82f78aa3 --- /dev/null +++ b/syntax/godoc.vim @@ -0,0 +1,20 @@ +" 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]*\)$" + +command -nargs=+ HiLink hi def link <args> + +HiLink godocTitle Title + +delcommand HiLink + +let b:current_syntax = "godoc" + +" vim:ts=4 sts=2 sw=2: | 
