vimrc/sources_non_forked/vim-go/autoload/go/complete.vim

139 lines
4 KiB
VimL
Raw Normal View History

2014-10-31 21:30:24 +00:00
if !exists("g:go_gocode_bin")
let g:go_gocode_bin = "gocode"
endif
fu! s:gocodeCurrentBuffer()
let buf = getline(1, '$')
if &encoding != 'utf-8'
let buf = map(buf, 'iconv(v:val, &encoding, "utf-8")')
endif
if &l:fileformat == 'dos'
" XXX: line2byte() depend on 'fileformat' option.
" so if fileformat is 'dos', 'buf' must include '\r'.
let buf = map(buf, 'v:val."\r"')
endif
let file = tempname()
call writefile(buf, file)
return file
endf
fu! s:gocodeCommand(cmd, preargs, args)
for i in range(0, len(a:args) - 1)
2016-05-14 11:57:54 +00:00
let a:args[i] = go#util#Shellescape(a:args[i])
2014-10-31 21:30:24 +00:00
endfor
for i in range(0, len(a:preargs) - 1)
2016-05-14 11:57:54 +00:00
let a:preargs[i] = go#util#Shellescape(a:preargs[i])
2014-10-31 21:30:24 +00:00
endfor
2015-07-13 10:22:46 +00:00
let bin_path = go#path#CheckBinPath(g:go_gocode_bin)
2015-01-18 12:58:28 +00:00
if empty(bin_path)
return
2014-10-31 21:30:24 +00:00
endif
2015-07-13 10:22:46 +00:00
" we might hit cache problems, as gocode doesn't handle well different
" GOPATHS: https://github.com/nsf/gocode/issues/239
let old_gopath = $GOPATH
let $GOPATH = go#path#Detect()
2016-05-14 11:57:54 +00:00
let result = go#util#System(printf('%s %s %s %s', go#util#Shellescape(bin_path), join(a:preargs), go#util#Shellescape(a:cmd), join(a:args)))
2015-07-13 10:22:46 +00:00
let $GOPATH = old_gopath
2016-05-14 11:57:54 +00:00
if go#util#ShellError() != 0
2014-10-31 21:30:24 +00:00
return "[\"0\", []]"
else
if &encoding != 'utf-8'
let result = iconv(result, 'utf-8', &encoding)
endif
return result
endif
endf
fu! s:gocodeCurrentBufferOpt(filename)
return '-in=' . a:filename
endf
fu! s:gocodeAutocomplete()
let filename = s:gocodeCurrentBuffer()
let result = s:gocodeCommand('autocomplete',
\ [s:gocodeCurrentBufferOpt(filename), '-f=vim'],
2016-03-20 18:01:44 +00:00
\ [expand('%:p'), go#util#OffsetCursor()])
2014-10-31 21:30:24 +00:00
call delete(filename)
return result
endf
2016-03-20 18:01:44 +00:00
function! go#complete#GetInfo()
let offset = go#util#OffsetCursor()+1
2014-10-31 21:30:24 +00:00
let filename = s:gocodeCurrentBuffer()
let result = s:gocodeCommand('autocomplete',
\ [s:gocodeCurrentBufferOpt(filename), '-f=godit'],
2016-03-20 18:01:44 +00:00
\ [expand('%:p'), offset])
2014-10-31 21:30:24 +00:00
call delete(filename)
" first line is: Charcount,,NumberOfCandidates, i.e: 8,,1
" following lines are candiates, i.e: func foo(name string),,foo(
let out = split(result, '\n')
" no candidates are found
if len(out) == 1
2015-01-18 12:58:28 +00:00
return ""
2014-10-31 21:30:24 +00:00
endif
" only one candiate is found
if len(out) == 2
return split(out[1], ',,')[0]
endif
" to many candidates are available, pick one that maches the word under the
" cursor
let infos = []
for info in out[1:]
call add(infos, split(info, ',,')[0])
endfor
let wordMatch = '\<' . expand("<cword>") . '\>'
" escape single quotes in wordMatch before passing it to filter
let wordMatch = substitute(wordMatch, "'", "''", "g")
let filtered = filter(infos, "v:val =~ '".wordMatch."'")
if len(filtered) == 1
return filtered[0]
endif
2015-01-18 12:58:28 +00:00
return ""
2014-10-31 21:30:24 +00:00
endfunction
2016-03-14 10:04:57 +00:00
function! go#complete#Info(auto)
" auto is true if we were called by g:go_auto_type_info's autocmd
2014-10-31 21:30:24 +00:00
let result = go#complete#GetInfo()
2015-01-18 12:58:28 +00:00
if !empty(result)
2016-03-14 10:04:57 +00:00
" if auto, and the result is a PANIC by gocode, hide it
if a:auto && result ==# 'PANIC PANIC PANIC' | return | endif
2014-10-31 21:30:24 +00:00
echo "vim-go: " | echohl Function | echon result | echohl None
endif
2015-01-18 12:58:28 +00:00
endfunction
2014-10-31 21:30:24 +00:00
2015-03-14 20:02:10 +00:00
function! s:trim_bracket(val)
let a:val.word = substitute(a:val.word, '[(){}\[\]]\+$', '', '')
return a:val
endfunction
2014-10-31 21:30:24 +00:00
fu! go#complete#Complete(findstart, base)
"findstart = 1 when we need to get the text length
if a:findstart == 1
execute "silent let g:gocomplete_completions = " . s:gocodeAutocomplete()
return col('.') - g:gocomplete_completions[0] - 1
"findstart = 0 when we need to return the list of completions
else
2015-03-14 20:02:10 +00:00
let s = getline(".")[col('.') - 1]
if s =~ '[(){}\{\}]'
return map(copy(g:gocomplete_completions[1]), 's:trim_bracket(v:val)')
endif
2014-10-31 21:30:24 +00:00
return g:gocomplete_completions[1]
endif
endf
" vim:ts=4:sw=4:et