182 lines
5.5 KiB
VimL
182 lines
5.5 KiB
VimL
function! go#tool#Files()
|
|
if IsWin()
|
|
let command = 'go list -f "{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}"'
|
|
else
|
|
let command = "go list -f '{{range $f := .GoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}'"
|
|
endif
|
|
let out = go#tool#ExecuteInDir(command)
|
|
return split(out, '\n')
|
|
endfunction
|
|
|
|
function! go#tool#Deps()
|
|
if IsWin()
|
|
let command = 'go list -f "{{range $f := .Deps}}{{$f}}{{printf \"\n\"}}{{end}}"'
|
|
else
|
|
let command = "go list -f $'{{range $f := .Deps}}{{$f}}\n{{end}}'"
|
|
endif
|
|
let out = go#tool#ExecuteInDir(command)
|
|
return split(out, '\n')
|
|
endfunction
|
|
|
|
function! go#tool#Imports()
|
|
let imports = {}
|
|
if IsWin()
|
|
let command = 'go list -f "{{range $f := .Imports}}{{$f}}{{printf \"\n\"}}{{end}}"'
|
|
else
|
|
let command = "go list -f $'{{range $f := .Imports}}{{$f}}\n{{end}}'"
|
|
endif
|
|
let out = go#tool#ExecuteInDir(command)
|
|
if v:shell_error
|
|
echo out
|
|
return imports
|
|
endif
|
|
|
|
for package_path in split(out, '\n')
|
|
let package_name = fnamemodify(package_path, ":t:r")
|
|
let imports[package_name] = package_path
|
|
endfor
|
|
|
|
return imports
|
|
endfunction
|
|
|
|
function! go#tool#ShowErrors(out)
|
|
let errors = []
|
|
for line in split(a:out, '\n')
|
|
let fatalerrors = matchlist(line, '^\(fatal error:.*\)$')
|
|
let tokens = matchlist(line, '^\s*\(.\{-}\):\(\d\+\):\s*\(.*\)')
|
|
|
|
if !empty(fatalerrors)
|
|
call add(errors, {"text": fatalerrors[1]})
|
|
elseif !empty(tokens)
|
|
call add(errors, {"filename" : expand("%:p:h:") . "/" . tokens[1],
|
|
\"lnum": tokens[2],
|
|
\"text": tokens[3]})
|
|
elseif !empty(errors)
|
|
" Preserve indented lines.
|
|
" This comes up especially with multi-line test output.
|
|
if match(line, '^\s') >= 0
|
|
call add(errors, {"text": line})
|
|
endif
|
|
endif
|
|
endfor
|
|
|
|
if !empty(errors)
|
|
call setqflist(errors, 'r')
|
|
return
|
|
endif
|
|
|
|
if empty(errors)
|
|
" Couldn't detect error format, output errors
|
|
echo a:out
|
|
endif
|
|
endfunction
|
|
|
|
function! go#tool#ExecuteInDir(cmd) abort
|
|
let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
|
let dir = getcwd()
|
|
try
|
|
execute cd.'`=expand("%:p:h")`'
|
|
let out = system(a:cmd)
|
|
finally
|
|
execute cd.'`=dir`'
|
|
endtry
|
|
return out
|
|
endfunction
|
|
|
|
" Exists checks whether the given importpath exists or not. It returns 0 if
|
|
" the importpath exists under GOPATH.
|
|
function! go#tool#Exists(importpath)
|
|
let command = "go list ". a:importpath
|
|
let out = go#tool#ExecuteInDir(command)
|
|
|
|
if v:shell_error
|
|
return -1
|
|
endif
|
|
|
|
return 0
|
|
endfunction
|
|
|
|
" BinPath checks whether the given binary exists or not and returns the path
|
|
" of the binary. It returns an empty string doesn't exists.
|
|
function! go#tool#BinPath(binpath)
|
|
" remove whitespaces if user applied something like 'goimports '
|
|
let binpath = substitute(a:binpath, '^\s*\(.\{-}\)\s*$', '\1', '')
|
|
|
|
" if it's in PATH just return it
|
|
if executable(binpath)
|
|
return binpath
|
|
endif
|
|
|
|
|
|
" just get the basename
|
|
let basename = fnamemodify(binpath, ":t")
|
|
|
|
" check if we have an appropriate bin_path
|
|
let go_bin_path = GetBinPath()
|
|
if empty(go_bin_path)
|
|
echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it."
|
|
return ""
|
|
endif
|
|
|
|
" append our GOBIN and GOPATH paths and be sure they can be found there...
|
|
" let us search in our GOBIN and GOPATH paths
|
|
let old_path = $PATH
|
|
let $PATH = $PATH . PathSep() .go_bin_path
|
|
|
|
if !executable(binpath)
|
|
echo "vim-go: could not find '" . basename . "'. Run :GoInstallBinaries to fix it."
|
|
return ""
|
|
endif
|
|
|
|
" restore back!
|
|
if go_bin_path
|
|
let $PATH = old_path
|
|
endif
|
|
|
|
return go_bin_path . '/' . basename
|
|
endfunction
|
|
|
|
" following two functions are from: https://github.com/mattn/gist-vim
|
|
" thanks @mattn
|
|
function! s:get_browser_command()
|
|
let go_play_browser_command = get(g:, 'go_play_browser_command', '')
|
|
if go_play_browser_command == ''
|
|
if IsWin()
|
|
let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
|
|
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
|
|
let go_play_browser_command = 'open %URL%'
|
|
elseif executable('xdg-open')
|
|
let go_play_browser_command = 'xdg-open %URL%'
|
|
elseif executable('firefox')
|
|
let go_play_browser_command = 'firefox %URL% &'
|
|
else
|
|
let go_play_browser_command = ''
|
|
endif
|
|
endif
|
|
return go_play_browser_command
|
|
endfunction
|
|
|
|
function! go#tool#OpenBrowser(url)
|
|
let cmd = s:get_browser_command()
|
|
if len(cmd) == 0
|
|
redraw
|
|
echohl WarningMsg
|
|
echo "It seems that you don't have general web browser. Open URL below."
|
|
echohl None
|
|
echo a:url
|
|
return
|
|
endif
|
|
if cmd =~ '^!'
|
|
let cmd = substitute(cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
silent! exec cmd
|
|
elseif cmd =~ '^:[A-Z]'
|
|
let cmd = substitute(cmd, '%URL%', '\=a:url', 'g')
|
|
exec cmd
|
|
else
|
|
let cmd = substitute(cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
call system(cmd)
|
|
endif
|
|
endfunction
|
|
|
|
|
|
" vim:ts=4:sw=4:et
|