| " 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 |