Merge commit '408cc8c0e65ec303a698871b8b519715771446ba' as 'vim/bundle/golang'
commit
1eab15d79b
@ -0,0 +1,103 @@
|
|||||||
|
" 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#PackageMembers(package, member)
|
||||||
|
silent! let content = system('godoc ' . a:package)
|
||||||
|
if v:shell_error || !len(content)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
let lines = filter(split(content, "\n"),"v:val !~ '^\\s\\+$'")
|
||||||
|
try
|
||||||
|
let mx1 = '^\s\+\(\S+\)\s\+=\s\+.*'
|
||||||
|
let mx2 = '^\%(const\|var\|type\|func\) \([A-Z][^ (]\+\).*'
|
||||||
|
let candidates =
|
||||||
|
\ map(filter(copy(lines), 'v:val =~ mx1'), 'substitute(v:val, mx1, "\\1", "")')
|
||||||
|
\ + map(filter(copy(lines), 'v:val =~ mx2'), 'substitute(v:val, mx2, "\\1", "")')
|
||||||
|
return filter(candidates, '!stridx(v:val, a:member)')
|
||||||
|
catch
|
||||||
|
return []
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#complete#Package(ArgLead, CmdLine, CursorPos)
|
||||||
|
let dirs = []
|
||||||
|
|
||||||
|
let words = split(a:CmdLine, '\s\+', 1)
|
||||||
|
if len(words) > 2
|
||||||
|
" Complete package members
|
||||||
|
return go#complete#PackageMembers(words[1], words[2])
|
||||||
|
endif
|
||||||
|
|
||||||
|
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")
|
||||||
|
call add(root, expand(dir . '/src'))
|
||||||
|
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
|
@ -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
|
@ -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()
|
@ -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
|
@ -0,0 +1,69 @@
|
|||||||
|
" 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.
|
||||||
|
"
|
||||||
|
" g:gofmt_command [default="gofmt"]
|
||||||
|
"
|
||||||
|
" Flag naming the gofmt executable to use.
|
||||||
|
"
|
||||||
|
if exists("b:did_ftplugin_go_fmt")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:go_fmt_commands")
|
||||||
|
let g:go_fmt_commands = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:gofmt_command")
|
||||||
|
let g:gofmt_command = "gofmt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:go_fmt_commands
|
||||||
|
command! -buffer Fmt call s:GoFormat()
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:GoFormat()
|
||||||
|
let view = winsaveview()
|
||||||
|
silent execute "%!" . g:gofmt_command
|
||||||
|
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 setqflist(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
|
@ -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
|
@ -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"
|
@ -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
|
@ -0,0 +1,6 @@
|
|||||||
|
This is a mirror of the misc/vim portion of the official Go repository. It is
|
||||||
|
automatically updated.
|
||||||
|
|
||||||
|
Any contributions or issues should be made to the official repository.
|
||||||
|
|
||||||
|
http://golang.org/doc/contribute.html
|
@ -0,0 +1,130 @@
|
|||||||
|
" 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.
|
||||||
|
"
|
||||||
|
" godoc.vim: Vim command to see godoc.
|
||||||
|
"
|
||||||
|
"
|
||||||
|
" Commands:
|
||||||
|
"
|
||||||
|
" :Godoc
|
||||||
|
"
|
||||||
|
" Open the relevant Godoc for either the word[s] passed to the command or
|
||||||
|
" the, by default, the word under the cursor.
|
||||||
|
"
|
||||||
|
" Options:
|
||||||
|
"
|
||||||
|
" g:go_godoc_commands [default=1]
|
||||||
|
"
|
||||||
|
" Flag to indicate whether to enable the commands listed above.
|
||||||
|
|
||||||
|
if exists("g:loaded_godoc")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:loaded_godoc = 1
|
||||||
|
|
||||||
|
let s:buf_nr = -1
|
||||||
|
let s:last_word = ''
|
||||||
|
|
||||||
|
if !exists('g:go_godoc_commands')
|
||||||
|
let g:go_godoc_commands = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if g:go_godoc_commands
|
||||||
|
command! -nargs=* -range -complete=customlist,go#complete#Package Godoc :call s:Godoc(<f-args>)
|
||||||
|
endif
|
||||||
|
|
||||||
|
nnoremap <silent> <Plug>(godoc-keyword) :<C-u>call <SID>Godoc('')<CR>
|
||||||
|
|
||||||
|
function! s:GodocView()
|
||||||
|
if !bufexists(s:buf_nr)
|
||||||
|
leftabove new
|
||||||
|
file `="[Godoc]"`
|
||||||
|
let s:buf_nr = bufnr('%')
|
||||||
|
elseif bufwinnr(s:buf_nr) == -1
|
||||||
|
leftabove split
|
||||||
|
execute s:buf_nr . 'buffer'
|
||||||
|
delete _
|
||||||
|
elseif bufwinnr(s:buf_nr) != bufwinnr('%')
|
||||||
|
execute bufwinnr(s:buf_nr) . 'wincmd w'
|
||||||
|
endif
|
||||||
|
|
||||||
|
setlocal filetype=godoc
|
||||||
|
setlocal bufhidden=delete
|
||||||
|
setlocal buftype=nofile
|
||||||
|
setlocal noswapfile
|
||||||
|
setlocal nobuflisted
|
||||||
|
setlocal modifiable
|
||||||
|
setlocal nocursorline
|
||||||
|
setlocal nocursorcolumn
|
||||||
|
setlocal iskeyword+=:
|
||||||
|
setlocal iskeyword-=-
|
||||||
|
|
||||||
|
nnoremap <buffer> <silent> K :Godoc<cr>
|
||||||
|
|
||||||
|
au BufHidden <buffer> call let <SID>buf_nr = -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:GodocWord(word)
|
||||||
|
if !executable('godoc')
|
||||||
|
echohl WarningMsg
|
||||||
|
echo "godoc command not found."
|
||||||
|
echo " install with: go get code.google.com/p/go.tools/cmd/godoc"
|
||||||
|
echohl None
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let word = a:word
|
||||||
|
silent! let content = system('godoc ' . word)
|
||||||
|
if v:shell_error || !len(content)
|
||||||
|
if len(s:last_word)
|
||||||
|
silent! let content = system('godoc ' . s:last_word.'/'.word)
|
||||||
|
if v:shell_error || !len(content)
|
||||||
|
echo 'No documentation found for "' . word . '".'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let word = s:last_word.'/'.word
|
||||||
|
else
|
||||||
|
echo 'No documentation found for "' . word . '".'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
let s:last_word = word
|
||||||
|
silent! call s:GodocView()
|
||||||
|
setlocal modifiable
|
||||||
|
silent! %d _
|
||||||
|
silent! put! =content
|
||||||
|
silent! normal gg
|
||||||
|
setlocal nomodifiable
|
||||||
|
setfiletype godoc
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:Godoc(...)
|
||||||
|
if !len(a:000)
|
||||||
|
let oldiskeyword = &iskeyword
|
||||||
|
setlocal iskeyword+=.
|
||||||
|
let word = expand('<cword>')
|
||||||
|
let &iskeyword = oldiskeyword
|
||||||
|
let word = substitute(word, '[^a-zA-Z0-9\\/._~-]', '', 'g')
|
||||||
|
let words = split(word, '\.\ze[^./]\+$')
|
||||||
|
else
|
||||||
|
let words = a:000
|
||||||
|
endif
|
||||||
|
if !len(words)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if s:GodocWord(words[0])
|
||||||
|
if len(words) > 1
|
||||||
|
if search('^\%(const\|var\|type\|\s\+\) ' . words[1] . '\s\+=\s')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if search('^func ' . words[1] . '(')
|
||||||
|
silent! normal zt
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
echo 'No documentation found for "' . words[1] . '".'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim:ts=4:sw=4:et
|
@ -0,0 +1,101 @@
|
|||||||
|
Vim plugins for Go (http://golang.org)
|
||||||
|
======================================
|
||||||
|
|
||||||
|
To use all the Vim plugins, add these lines to your $HOME/.vimrc.
|
||||||
|
|
||||||
|
" Some Linux distributions set filetype in /etc/vimrc.
|
||||||
|
" Clear filetype flags before changing runtimepath to force Vim to reload them.
|
||||||
|
filetype off
|
||||||
|
filetype plugin indent off
|
||||||
|
set runtimepath+=$GOROOT/misc/vim
|
||||||
|
filetype plugin indent on
|
||||||
|
syntax on
|
||||||
|
|
||||||
|
If you want to select fewer plugins, use the instructions in the rest of
|
||||||
|
this file.
|
||||||
|
|
||||||
|
A popular configuration is to gofmt Go source files when they are saved.
|
||||||
|
To do that, add this line to the end of your $HOME/.vimrc.
|
||||||
|
|
||||||
|
autocmd FileType go autocmd BufWritePre <buffer> Fmt
|
||||||
|
|
||||||
|
|
||||||
|
Vim syntax highlighting
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
To install automatic syntax highlighting for GO programs:
|
||||||
|
|
||||||
|
1. Copy or link the filetype detection script to the ftdetect directory
|
||||||
|
underneath your vim runtime directory (normally $HOME/.vim/ftdetect)
|
||||||
|
2. Copy or link syntax/go.vim to the syntax directory underneath your vim
|
||||||
|
runtime directory (normally $HOME/.vim/syntax). Linking this file rather
|
||||||
|
than just copying it will ensure any changes are automatically reflected
|
||||||
|
in your syntax highlighting.
|
||||||
|
3. Add the following line to your .vimrc file (normally $HOME/.vimrc):
|
||||||
|
|
||||||
|
syntax on
|
||||||
|
|
||||||
|
In a typical unix environment you might accomplish this using the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
mkdir -p $HOME/.vim/ftdetect
|
||||||
|
mkdir -p $HOME/.vim/syntax
|
||||||
|
mkdir -p $HOME/.vim/autoload/go
|
||||||
|
ln -s $GOROOT/misc/vim/ftdetect/gofiletype.vim $HOME/.vim/ftdetect/
|
||||||
|
ln -s $GOROOT/misc/vim/syntax/go.vim $HOME/.vim/syntax
|
||||||
|
ln -s $GOROOT/misc/vim/autoload/go/complete.vim $HOME/.vim/autoload/go
|
||||||
|
echo "syntax on" >> $HOME/.vimrc
|
||||||
|
|
||||||
|
|
||||||
|
Vim filetype plugins
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
To install one of the available filetype plugins:
|
||||||
|
|
||||||
|
1. Same as 1 above.
|
||||||
|
2. Copy or link ftplugin/go.vim to the ftplugin directory underneath your vim
|
||||||
|
runtime directory (normally $HOME/.vim/ftplugin). Copy or link one or more
|
||||||
|
additional plugins from ftplugin/go/*.vim to the Go-specific subdirectory
|
||||||
|
in the same place ($HOME/.vim/ftplugin/go/*.vim).
|
||||||
|
3. Add the following line to your .vimrc file (normally $HOME/.vimrc):
|
||||||
|
|
||||||
|
filetype plugin on
|
||||||
|
|
||||||
|
|
||||||
|
Vim indentation plugin
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
To install automatic indentation:
|
||||||
|
|
||||||
|
1. Same as 1 above.
|
||||||
|
2. Copy or link indent/go.vim to the indent directory underneath your vim
|
||||||
|
runtime directory (normally $HOME/.vim/indent).
|
||||||
|
3. Add the following line to your .vimrc file (normally $HOME/.vimrc):
|
||||||
|
|
||||||
|
filetype indent on
|
||||||
|
|
||||||
|
|
||||||
|
Vim compiler plugin
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
To install the compiler plugin:
|
||||||
|
|
||||||
|
1. Same as 1 above.
|
||||||
|
2. Copy or link compiler/go.vim to the compiler directory underneath your vim
|
||||||
|
runtime directory (normally $HOME/.vim/compiler).
|
||||||
|
3. Activate the compiler plugin with ":compiler go". To always enable the
|
||||||
|
compiler plugin in Go source files add an autocommand to your .vimrc file
|
||||||
|
(normally $HOME/.vimrc):
|
||||||
|
|
||||||
|
autocmd FileType go compiler go
|
||||||
|
|
||||||
|
|
||||||
|
Godoc plugin
|
||||||
|
------------
|
||||||
|
|
||||||
|
To install godoc plugin:
|
||||||
|
|
||||||
|
1. Same as 1 above.
|
||||||
|
2. Copy or link plugin/godoc.vim to $HOME/.vim/plugin/godoc,
|
||||||
|
syntax/godoc.vim to $HOME/.vim/syntax/godoc.vim,
|
||||||
|
and autoload/go/complete.vim to $HOME/.vim/autoload/go/complete.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"
|
@ -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][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:
|
Loading…
Reference in New Issue