diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2013-11-02 23:27:57 +0100 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-11-02 23:27:57 +0100 | 
| commit | 30c1920e4fa4e612238e1f435907c40ecfa47f33 (patch) | |
| tree | f88ffb408895a5baf93fe81fdd12acba17f32d44 /autoload/go | |
| parent | 57cfac7ae384466c3ff2543a9200319dc1d459a0 (diff) | |
| download | vim-polyglot-30c1920e4fa4e612238e1f435907c40ecfa47f33.tar.gz vim-polyglot-30c1920e4fa4e612238e1f435907c40ecfa47f33.zip | |
Massive update :)v1.4.1
Diffstat (limited to 'autoload/go')
| -rw-r--r-- | autoload/go/complete.vim | 70 | 
1 files changed, 51 insertions, 19 deletions
| diff --git a/autoload/go/complete.vim b/autoload/go/complete.vim index cc1013b7..8dd43de4 100644 --- a/autoload/go/complete.vim +++ b/autoload/go/complete.vim @@ -28,43 +28,75 @@ if len(s:goarch) == 0    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 -          echo '\'go env GOROOT\' failed' -      endif +    let goroot = substitute(system('go env GOROOT'), '\n', '', 'g') +    if v:shell_error +      echomsg '\'go env GOROOT\' failed' +    endif    else -      let goroot = $GOROOT +    let goroot = $GOROOT    endif    if len(goroot) != 0 && isdirectory(goroot) -    let dirs += [ goroot ] +    let dirs += [goroot]    endif -  let workspaces = split($GOPATH, ':') +  let pathsep = ':' +  if s:goos == 'windows' +    let pathsep = ';' +  endif +  let workspaces = split($GOPATH, pathsep)    if workspaces != [] -      let dirs += workspaces +    let dirs += workspaces    endif    if len(dirs) == 0 -      " should not happen -      return [] +    " should not happen +    return []    endif    let ret = {}    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 +    " 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)) | 
