You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.4 KiB
VimL
112 lines
2.4 KiB
VimL
9 years ago
|
if !exists("g:go_godef_bin")
|
||
|
let g:go_godef_bin = "godef"
|
||
|
endif
|
||
|
|
||
|
if go#vimproc#has_vimproc()
|
||
|
let s:vim_system = get(g:, 'gocomplete#system_function', 'vimproc#system2')
|
||
|
else
|
||
|
let s:vim_system = get(g:, 'gocomplete#system_function', 'system')
|
||
|
endif
|
||
|
|
||
|
fu! s:system(str, ...)
|
||
|
return call(s:vim_system, [a:str] + a:000)
|
||
|
endf
|
||
|
|
||
|
" modified and improved version of vim-godef
|
||
|
function! go#def#Jump(...)
|
||
|
if !len(a:000)
|
||
|
let arg = "-o=" . go#util#OffsetCursor()
|
||
|
else
|
||
|
let arg = a:1
|
||
|
endif
|
||
|
|
||
|
let bin_path = go#path#CheckBinPath(g:go_godef_bin)
|
||
|
if empty(bin_path)
|
||
|
return
|
||
|
endif
|
||
|
|
||
|
let old_gopath = $GOPATH
|
||
|
let $GOPATH = go#path#Detect()
|
||
|
|
||
|
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
|
||
|
let command = bin_path . " -f=" . shellescape(fname) . " -i " . shellescape(arg)
|
||
|
|
||
|
" get output of godef
|
||
|
let out = s:system(command, join(getbufline(bufnr('%'), 1, '$'), go#util#LineEnding()))
|
||
|
|
||
|
" jump to it
|
||
|
call s:godefJump(out, "")
|
||
|
let $GOPATH = old_gopath
|
||
|
endfunction
|
||
|
|
||
|
|
||
|
function! go#def#JumpMode(mode)
|
||
|
let arg = "-o=" . go#util#OffsetCursor()
|
||
|
|
||
|
let bin_path = go#path#CheckBinPath(g:go_godef_bin)
|
||
|
if empty(bin_path)
|
||
|
return
|
||
|
endif
|
||
|
|
||
|
let old_gopath = $GOPATH
|
||
|
let $GOPATH = go#path#Detect()
|
||
|
|
||
|
let fname = fnamemodify(expand("%"), ':p:gs?\\?/?')
|
||
|
let command = bin_path . " -f=" . shellescape(fname) . " -i " . shellescape(arg)
|
||
|
|
||
|
" get output of godef
|
||
|
let out = s:system(command, join(getbufline(bufnr('%'), 1, '$'), go#util#LineEnding()))
|
||
|
|
||
|
call s:godefJump(out, a:mode)
|
||
|
let $GOPATH = old_gopath
|
||
|
endfunction
|
||
|
|
||
|
|
||
|
function! s:getOffset()
|
||
|
return "-o=" . go#util#OffsetCursor()
|
||
|
endfunction
|
||
|
|
||
|
|
||
|
function! s:godefJump(out, mode)
|
||
|
let old_errorformat = &errorformat
|
||
|
let &errorformat = "%f:%l:%c"
|
||
|
|
||
|
if a:out =~ 'godef: '
|
||
|
let out = substitute(a:out, go#util#LineEnding() . '$', '', '')
|
||
|
echom out
|
||
|
else
|
||
|
let parts = split(a:out, ':')
|
||
|
" parts[0] contains filename
|
||
|
let fileName = parts[0]
|
||
|
|
||
|
" put the error format into location list so we can jump automatically to
|
||
|
" it
|
||
|
lgetexpr a:out
|
||
|
|
||
|
" needed for restoring back user setting this is because there are two
|
||
|
" modes of switchbuf which we need based on the split mode
|
||
|
let old_switchbuf = &switchbuf
|
||
|
|
||
|
if a:mode == "tab"
|
||
|
let &switchbuf = "usetab"
|
||
|
|
||
|
if bufloaded(fileName) == 0
|
||
|
tab split
|
||
|
endif
|
||
|
else
|
||
|
if a:mode == "split"
|
||
|
split
|
||
|
elseif a:mode == "vsplit"
|
||
|
vsplit
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
" jump to file now
|
||
|
sil ll 1
|
||
|
normal! zz
|
||
|
|
||
|
let &switchbuf = old_switchbuf
|
||
|
end
|
||
|
let &errorformat = old_errorformat
|
||
|
endfunction
|