diff options
Diffstat (limited to 'misc/vim/autoload/go')
-rw-r--r-- | misc/vim/autoload/go/complete.vim | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/misc/vim/autoload/go/complete.vim b/misc/vim/autoload/go/complete.vim index d4ae3b97f..cc1013b7d 100644 --- a/misc/vim/autoload/go/complete.vim +++ b/misc/vim/autoload/go/complete.vim @@ -29,21 +29,43 @@ if len(s:goarch) == 0 endif function! go#complete#Package(ArgLead, CmdLine, CursorPos) - let goroot = $GOROOT - if len(goroot) == 0 - " should not occur. - return [] + let dirs = [] + + if executable('go') + let goroot = substitute(system('go env GOROOT'), '\n', '', 'g') + if v:shell_error + echo '\'go env GOROOT\' failed' + endif + else + let goroot = $GOROOT endif + + if len(goroot) != 0 && isdirectory(goroot) + let dirs += [ goroot ] + endif + + let workspaces = split($GOPATH, ':') + if workspaces != [] + let dirs += workspaces + endif + + if len(dirs) == 0 + " should not happen + return [] + endif + let ret = {} - let root = expand(goroot.'/pkg/'.s:goos.'_'.s:goarch) - for i in split(globpath(root, a:ArgLead.'*'), "\n") - if isdirectory(i) - let i .= '/' - elseif i !~ '\.a$' - continue - endif - let i = substitute(substitute(i[len(root)+1:], '[\\]', '/', 'g'), '\.a$', '', 'g') - let ret[i] = i + for dir in dirs + let root = expand(dir . '/pkg/' . s:goos . '_' . s:goarch) + for i in split(globpath(root, a:ArgLead.'*'), "\n") + if isdirectory(i) + let i .= '/' + elseif i !~ '\.a$' + continue + endif + let i = substitute(substitute(i[len(root)+1:], '[\\]', '/', 'g'), '\.a$', '', 'g') + let ret[i] = i + endfor endfor return sort(keys(ret)) endfunction |