summaryrefslogtreecommitdiff
path: root/misc/vim/autoload/go/complete.vim
diff options
context:
space:
mode:
Diffstat (limited to 'misc/vim/autoload/go/complete.vim')
-rw-r--r--misc/vim/autoload/go/complete.vim48
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