mirror of
				https://github.com/amix/vimrc
				synced 2025-10-31 23:13:35 +08:00 
			
		
		
		
	Updated plugins
This commit is contained in:
		| @ -19,7 +19,7 @@ if has('reltime') | |||||||
|     lockvar! g:_SYNTASTIC_START |     lockvar! g:_SYNTASTIC_START | ||||||
| endif | endif | ||||||
|  |  | ||||||
| let g:_SYNTASTIC_VERSION = '3.7.0-55' | let g:_SYNTASTIC_VERSION = '3.7.0-62' | ||||||
| lockvar g:_SYNTASTIC_VERSION | lockvar g:_SYNTASTIC_VERSION | ||||||
|  |  | ||||||
| " Sanity checks {{{1 | " Sanity checks {{{1 | ||||||
|  | |||||||
| @ -0,0 +1,22 @@ | |||||||
|  | "============================================================================ | ||||||
|  | "File:        mixedindentlint.vim | ||||||
|  | "Description: Mixed indentation linter for vim | ||||||
|  | "Maintainer:  Payton Swick <payton@foolord.com> | ||||||
|  | "License:     This program is free software. It comes without any warranty, | ||||||
|  | "             to the extent permitted by applicable law. You can redistribute | ||||||
|  | "             it and/or modify it under the terms of the Do What The Fuck You | ||||||
|  | "             Want To Public License, Version 2, as published by Sam Hocevar. | ||||||
|  | "             See http://sam.zoy.org/wtfpl/COPYING for more details. | ||||||
|  | "============================================================================ | ||||||
|  |  | ||||||
|  | if exists('g:loaded_syntastic_css_mixedindentlint_checker') | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_syntastic_css_mixedindentlint_checker = 1 | ||||||
|  |  | ||||||
|  | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  |     \ 'filetype': 'css', | ||||||
|  |     \ 'name': 'mixedindentlint', | ||||||
|  |     \ 'redirect': 'javascript/mixedindentlint'}) | ||||||
|  |  | ||||||
|  | " vim: set et sts=4 sw=4: | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | "============================================================================ | ||||||
|  | "File:        mixedindentlint.vim | ||||||
|  | "Description: Mixed indentation linter for vim | ||||||
|  | "Maintainer:  Payton Swick <payton@foolord.com> | ||||||
|  | "License:     This program is free software. It comes without any warranty, | ||||||
|  | "             to the extent permitted by applicable law. You can redistribute | ||||||
|  | "             it and/or modify it under the terms of the Do What The Fuck You | ||||||
|  | "             Want To Public License, Version 2, as published by Sam Hocevar. | ||||||
|  | "             See http://sam.zoy.org/wtfpl/COPYING for more details. | ||||||
|  | "============================================================================ | ||||||
|  |  | ||||||
|  | if exists('g:loaded_syntastic_javascript_mixedindentlint_checker') | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_syntastic_javascript_mixedindentlint_checker = 1 | ||||||
|  |  | ||||||
|  | let s:save_cpo = &cpo | ||||||
|  | set cpo&vim | ||||||
|  |  | ||||||
|  | function! SyntaxCheckers_javascript_mixedindentlint_GetLocList() dict | ||||||
|  |     let makeprg = self.makeprgBuild({}) | ||||||
|  |  | ||||||
|  |     let errorformat = 'Line %l in "%f" %.%#' | ||||||
|  |  | ||||||
|  |     return SyntasticMake({ | ||||||
|  |         \ 'makeprg': makeprg, | ||||||
|  |         \ 'errorformat': errorformat, | ||||||
|  |         \ 'subtype': 'Style', | ||||||
|  |         \ 'defaults': { 'text': 'Indentation differs from rest of file' }, | ||||||
|  |         \ 'returns': [0, 1] }) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  |     \ 'filetype': 'javascript', | ||||||
|  |     \ 'name': 'mixedindentlint'}) | ||||||
|  |  | ||||||
|  | let &cpo = s:save_cpo | ||||||
|  | unlet s:save_cpo | ||||||
|  |  | ||||||
|  | " vim: set sw=4 sts=4 et fdm=marker: | ||||||
| @ -44,7 +44,6 @@ endfunction | |||||||
|  |  | ||||||
| function! SyntaxCheckers_r_lint_GetLocList() dict | function! SyntaxCheckers_r_lint_GetLocList() dict | ||||||
|     let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' |     let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' | ||||||
|     let setwd = 'setwd("' . escape(getcwd(), '"\') . '"); ' |  | ||||||
|     let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . |     let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . | ||||||
|         \ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' . |         \ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' . | ||||||
|         \       'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') . |         \       'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') . | ||||||
|  | |||||||
| @ -50,7 +50,7 @@ function! SyntaxCheckers_r_lintr_IsAvailable() dict | |||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
| function! SyntaxCheckers_r_lintr_GetLocList() dict | function! SyntaxCheckers_r_lintr_GetLocList() dict | ||||||
|     let setwd = syntastic#util#isRunningWindows() ? 'setwd(''' . escape(getcwd(), '"\') . '''); ' : '' |     let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' | ||||||
|     let makeprg = self.getExecEscaped() . ' --slave --no-restore --no-save' . |     let makeprg = self.getExecEscaped() . ' --slave --no-restore --no-save' . | ||||||
|         \ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' . |         \ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' . | ||||||
|         \       'lint(cache = ' . g:syntastic_r_lintr_cache . ', commandArgs(TRUE), ' . g:syntastic_r_lintr_linters . ')') . |         \       'lint(cache = ' . g:syntastic_r_lintr_cache . ', commandArgs(TRUE), ' . g:syntastic_r_lintr_linters . ')') . | ||||||
|  | |||||||
| @ -0,0 +1,22 @@ | |||||||
|  | "============================================================================ | ||||||
|  | "File:        mixedindentlint.vim | ||||||
|  | "Description: Mixed indentation linter for vim | ||||||
|  | "Maintainer:  Payton Swick <payton@foolord.com> | ||||||
|  | "License:     This program is free software. It comes without any warranty, | ||||||
|  | "             to the extent permitted by applicable law. You can redistribute | ||||||
|  | "             it and/or modify it under the terms of the Do What The Fuck You | ||||||
|  | "             Want To Public License, Version 2, as published by Sam Hocevar. | ||||||
|  | "             See http://sam.zoy.org/wtfpl/COPYING for more details. | ||||||
|  | "============================================================================ | ||||||
|  |  | ||||||
|  | if exists('g:loaded_syntastic_scss_mixedindentlint_checker') | ||||||
|  |     finish | ||||||
|  | endif | ||||||
|  | let g:loaded_syntastic_scss_mixedindentlint_checker = 1 | ||||||
|  |  | ||||||
|  | call g:SyntasticRegistry.CreateAndRegisterChecker({ | ||||||
|  |     \ 'filetype': 'scss', | ||||||
|  |     \ 'name': 'mixedindentlint', | ||||||
|  |     \ 'redirect': 'javascript/mixedindentlint'}) | ||||||
|  |  | ||||||
|  | " vim: set et sts=4 sw=4: | ||||||
| @ -320,6 +320,8 @@ function! s:repo_translate(spec) dict abort | |||||||
|     return 'fugitive://'.self.dir().'//'.ref |     return 'fugitive://'.self.dir().'//'.ref | ||||||
|   elseif a:spec =~# '^:' |   elseif a:spec =~# '^:' | ||||||
|     return 'fugitive://'.self.dir().'//0/'.a:spec[1:-1] |     return 'fugitive://'.self.dir().'//0/'.a:spec[1:-1] | ||||||
|  |   elseif a:spec ==# '@' | ||||||
|  |     return self.dir('HEAD') | ||||||
|   elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(self.dir(a:spec)) |   elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(self.dir(a:spec)) | ||||||
|     return self.dir(a:spec) |     return self.dir(a:spec) | ||||||
|   elseif filereadable(self.dir('refs/'.a:spec)) |   elseif filereadable(self.dir('refs/'.a:spec)) | ||||||
| @ -1258,7 +1260,7 @@ function! s:Grep(cmd,bang,arg) abort | |||||||
|   try |   try | ||||||
|     execute cd.'`=s:repo().tree()`' |     execute cd.'`=s:repo().tree()`' | ||||||
|     let &grepprg = s:repo().git_command('--no-pager', 'grep', '-n', '--no-color') |     let &grepprg = s:repo().git_command('--no-pager', 'grep', '-n', '--no-color') | ||||||
|     let &grepformat = '%f:%l:%m,%f' |     let &grepformat = '%f:%l:%m,%m %f match%ts,%f' | ||||||
|     exe a:cmd.'! '.escape(matchstr(a:arg,'\v\C.{-}%($|[''" ]\@=\|)@='),'|') |     exe a:cmd.'! '.escape(matchstr(a:arg,'\v\C.{-}%($|[''" ]\@=\|)@='),'|') | ||||||
|     let list = a:cmd =~# '^l' ? getloclist(0) : getqflist() |     let list = a:cmd =~# '^l' ? getloclist(0) : getqflist() | ||||||
|     for entry in list |     for entry in list | ||||||
| @ -1406,6 +1408,7 @@ function! s:Edit(cmd,bang,...) abort | |||||||
|   catch /^fugitive:/ |   catch /^fugitive:/ | ||||||
|     return 'echoerr v:errmsg' |     return 'echoerr v:errmsg' | ||||||
|   endtry |   endtry | ||||||
|  |   let file = s:sub(file, '/$', '') | ||||||
|   if a:cmd ==# 'read' |   if a:cmd ==# 'read' | ||||||
|     return 'silent %delete_|read '.s:fnameescape(file).'|silent 1delete_|diffupdate|'.line('.') |     return 'silent %delete_|read '.s:fnameescape(file).'|silent 1delete_|diffupdate|'.line('.') | ||||||
|   else |   else | ||||||
| @ -2175,7 +2178,7 @@ call s:command("-bar -bang -range -nargs=* -complete=customlist,s:EditComplete G | |||||||
|  |  | ||||||
| function! s:Browse(bang,line1,count,...) abort | function! s:Browse(bang,line1,count,...) abort | ||||||
|   try |   try | ||||||
|     let rev = a:0 ? substitute(join(a:000, ' '),'@[[:alnum:]_-]*\%(://.\{-\}\)\=$','','') : '' |     let rev = a:0 ? substitute(join(a:000, ' '),'@[[:alnum:]_-]\w\+\%(://.\{-\}\)\=$','','') : '' | ||||||
|     if rev ==# '' |     if rev ==# '' | ||||||
|       let expanded = s:buffer().rev() |       let expanded = s:buffer().rev() | ||||||
|     elseif rev ==# ':' |     elseif rev ==# ':' | ||||||
| @ -2218,7 +2221,7 @@ function! s:Browse(bang,line1,count,...) abort | |||||||
|       endif |       endif | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if a:0 && join(a:000, ' ') =~# '@[[:alnum:]_-]*\%(://.\{-\}\)\=$' |     if a:0 && join(a:000, ' ') =~# '@[[:alnum:]_-]\+\%(://.\{-\}\)\=$' | ||||||
|       let remote = matchstr(join(a:000, ' '),'@\zs[[:alnum:]_-]\+\%(://.\{-\}\)\=$') |       let remote = matchstr(join(a:000, ' '),'@\zs[[:alnum:]_-]\+\%(://.\{-\}\)\=$') | ||||||
|     elseif path =~# '^\.git/refs/remotes/.' |     elseif path =~# '^\.git/refs/remotes/.' | ||||||
|       let remote = matchstr(path,'^\.git/refs/remotes/\zs[^/]\+') |       let remote = matchstr(path,'^\.git/refs/remotes/\zs[^/]\+') | ||||||
| @ -2319,27 +2322,21 @@ function! s:github_url(opts, ...) abort | |||||||
|       return root . '/commits/' . branch |       return root . '/commits/' . branch | ||||||
|     endif |     endif | ||||||
|   elseif path =~# '^\.git/refs/tags/' |   elseif path =~# '^\.git/refs/tags/' | ||||||
|     return root . '/releases/tag/' . matchstr(path,'[^/]\+$') |     return root . '/releases/tag/' . path[15:-1] | ||||||
|   elseif path =~# '^\.git/refs/.' |   elseif path =~# '^\.git/refs/remotes/[^/]\+/.' | ||||||
|     return root . '/commits/' . matchstr(path,'[^/]\+$') |     return root . '/commits/' . matchstr(path,'remotes/[^/]\+/\zs.*') | ||||||
|   elseif path =~# '.git/\%(config$\|hooks\>\)' |   elseif path =~# '.git/\%(config$\|hooks\>\)' | ||||||
|     return root . '/admin' |     return root . '/admin' | ||||||
|   elseif path =~# '^\.git\>' |   elseif path =~# '^\.git\>' | ||||||
|     return root |     return root | ||||||
|   endif |   endif | ||||||
|   if a:opts.revision =~# '^[[:alnum:]._-]\+:' |   if a:opts.commit =~# '^\d\=$' | ||||||
|     let commit = matchstr(a:opts.revision,'^[^:]*') |     let commit = a:opts.repo.rev_parse('HEAD') | ||||||
|   elseif a:opts.commit =~# '^\d\=$' |  | ||||||
|     let local = matchstr(a:opts.repo.head_ref(),'\<refs/heads/\zs.*') |  | ||||||
|     let commit = a:opts.repo.git_chomp('config','branch.'.local.'.merge')[11:-1] |  | ||||||
|     if commit ==# '' |  | ||||||
|       let commit = local |  | ||||||
|     endif |  | ||||||
|   else |   else | ||||||
|     let commit = a:opts.commit |     let commit = a:opts.commit | ||||||
|   endif |   endif | ||||||
|   if a:opts.type == 'tree' |   if get(a:opts, 'type', '') ==# 'tree' || a:opts.path =~# '/$' | ||||||
|     let url = s:sub(root . '/tree/' . commit . '/' . path,'/$','') |     let url = substitute(root . '/tree/' . commit . '/' . path, '/$', '', 'g') | ||||||
|   elseif a:opts.type == 'blob' |   elseif a:opts.type == 'blob' | ||||||
|     let url = root . '/blob/' . commit . '/' . path |     let url = root . '/blob/' . commit . '/' . path | ||||||
|     if get(a:opts, 'line2') && a:opts.line1 == a:opts.line2 |     if get(a:opts, 'line2') && a:opts.line1 == a:opts.line2 | ||||||
| @ -2372,10 +2369,8 @@ function! s:instaweb_url(opts) abort | |||||||
|     endif |     endif | ||||||
|     let url .= ';h=' . a:opts.repo.rev_parse(a:opts.commit . (a:opts.path == '' ? '' : ':' . a:opts.path)) |     let url .= ';h=' . a:opts.repo.rev_parse(a:opts.commit . (a:opts.path == '' ? '' : ':' . a:opts.path)) | ||||||
|   else |   else | ||||||
|     if a:opts.type ==# 'blob' |     if a:opts.type ==# 'blob' && empty(a:opts.commit) | ||||||
|       let tmp = tempname() |       let url .= ';h='.a:opts.repo.git_chomp('hash-object', '-w', a:opts.path) | ||||||
|       silent execute 'write !'.a:opts.repo.git_command('hash-object','-w','--stdin').' > '.tmp |  | ||||||
|       let url .= ';h=' . readfile(tmp)[0] |  | ||||||
|     else |     else | ||||||
|       try |       try | ||||||
|         let url .= ';h=' . a:opts.repo.rev_parse((a:opts.commit == '' ? 'HEAD' : ':' . a:opts.commit) . ':' . a:opts.path) |         let url .= ';h=' . a:opts.repo.rev_parse((a:opts.commit == '' ? 'HEAD' : ':' . a:opts.commit) . ':' . a:opts.path) | ||||||
| @ -2855,7 +2850,7 @@ function! s:cfile() abort | |||||||
|       elseif getline('.') =~# '^[+-]' && search('^@@ -\d\+,\d\+ +\d\+,','bnW') |       elseif getline('.') =~# '^[+-]' && search('^@@ -\d\+,\d\+ +\d\+,','bnW') | ||||||
|         let type = getline('.')[0] |         let type = getline('.')[0] | ||||||
|         let lnum = line('.') - 1 |         let lnum = line('.') - 1 | ||||||
|         let offset = -1 |         let offset = 0 | ||||||
|         while getline(lnum) !~# '^@@ -\d\+,\d\+ +\d\+,' |         while getline(lnum) !~# '^@@ -\d\+,\d\+ +\d\+,' | ||||||
|           if getline(lnum) =~# '^[ '.type.']' |           if getline(lnum) =~# '^[ '.type.']' | ||||||
|             let offset += 1 |             let offset += 1 | ||||||
|  | |||||||
| @ -46,10 +46,11 @@ disabled/enabled easily. | |||||||
|  |  | ||||||
| ## Install | ## Install | ||||||
|  |  | ||||||
| Vim-go follows the standard runtime path structure, so I highly recommend to use | Vim-go follows the standard runtime path structure, so I highly recommend to | ||||||
| a common and well known plugin manager to install vim-go. Do not use vim-go with | use a common and well known plugin manager to install vim-go. Do not use vim-go | ||||||
| other Go oriented vim plugins. For Pathogen just clone the repo. For other plugin managers | with other Go oriented vim plugins. For Pathogen just clone the repo. For other | ||||||
| add the appropriate lines and execute the plugin's install command. | plugin managers add the appropriate lines and execute the plugin's install | ||||||
|  | command. | ||||||
|  |  | ||||||
| *  [Pathogen](https://github.com/tpope/vim-pathogen) | *  [Pathogen](https://github.com/tpope/vim-pathogen) | ||||||
|   * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` |   * `git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go` | ||||||
| @ -64,8 +65,9 @@ Please be sure all necessary binaries are installed (such as `gocode`, `godef`, | |||||||
| `goimports`, etc.). You can easily install them with the included | `goimports`, etc.). You can easily install them with the included | ||||||
| `:GoInstallBinaries` command. If invoked, all necessary binaries will be | `:GoInstallBinaries` command. If invoked, all necessary binaries will be | ||||||
| automatically downloaded and installed to your `$GOBIN` environment (if not set | automatically downloaded and installed to your `$GOBIN` environment (if not set | ||||||
| it will use `$GOPATH/bin`). Note that this command requires `git` for fetching the individual Go | it will use `$GOPATH/bin`). Note that this command requires `git` for fetching | ||||||
| packages. Additionally, use `:GoUpdateBinaries` to update the installed binaries. | the individual Go packages. Additionally, use `:GoUpdateBinaries` to update the | ||||||
|  | installed binaries. | ||||||
|  |  | ||||||
| ### Optional | ### Optional | ||||||
|  |  | ||||||
| @ -156,19 +158,6 @@ More `<Plug>` mappings can be seen with `:he go-mappings`. Also these are just | |||||||
| recommendations, you are free to create more advanced mappings or functions | recommendations, you are free to create more advanced mappings or functions | ||||||
| based on `:he go-commands`. | based on `:he go-commands`. | ||||||
|  |  | ||||||
| ### Location list navigation |  | ||||||
|  |  | ||||||
| All commands support collecting and displaying errors in Vim's location |  | ||||||
|   list. |  | ||||||
|  |  | ||||||
| Quickly navigate through these location lists with `:lne` for next error and `:lp`  |  | ||||||
| for previous.  You can also bind these to keys, for example: |  | ||||||
|  |  | ||||||
| ```vim |  | ||||||
| map <C-n> :lne<CR> |  | ||||||
| map <C-m> :lp<CR> |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| ## Settings | ## Settings | ||||||
| Below are some settings you might find useful. For the full list see `:he go-settings`. | Below are some settings you might find useful. For the full list see `:he go-settings`. | ||||||
|  |  | ||||||
| @ -214,7 +203,21 @@ let g:go_bin_path = expand("~/.gotools") | |||||||
| let g:go_bin_path = "/home/fatih/.mypath"      "or give absolute path | let g:go_bin_path = "/home/fatih/.mypath"      "or give absolute path | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| ## Using with Syntastic | ### Location list navigation | ||||||
|  |  | ||||||
|  | All commands support collecting and displaying errors in Vim's location | ||||||
|  |   list. | ||||||
|  |  | ||||||
|  | Quickly navigate through these location lists with `:lne` for next error and `:lp`  | ||||||
|  | for previous.  You can also bind these to keys, for example: | ||||||
|  |  | ||||||
|  | ```vim | ||||||
|  | map <C-n> :lne<CR> | ||||||
|  | map <C-m> :lp<CR> | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ### Using with Syntastic | ||||||
| Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while saving and opening | Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while saving and opening | ||||||
| files. The following fixes this: | files. The following fixes this: | ||||||
|  |  | ||||||
|  | |||||||
| @ -14,24 +14,30 @@ endfunction | |||||||
| " default it tries to call simply 'go build', but it first tries to get all | " default it tries to call simply 'go build', but it first tries to get all | ||||||
| " dependent files for the current folder and passes it to go build. | " dependent files for the current folder and passes it to go build. | ||||||
| function! go#cmd#Build(bang, ...) | function! go#cmd#Build(bang, ...) | ||||||
|     let default_makeprg = &makeprg |     " expand all wildcards(i.e: '%' to the current file name) | ||||||
|  |     let goargs = map(copy(a:000), "expand(v:val)") | ||||||
|  |  | ||||||
|  |     " escape all shell arguments before we pass it to make | ||||||
|  |     let goargs = go#util#Shelllist(goargs, 1) | ||||||
|  |  | ||||||
|  |     " create our command arguments. go build discards any results when it | ||||||
|  |     " compiles multiple packages. So we pass the `errors` package just as an | ||||||
|  |     " placeholder with the current folder (indicated with '.') | ||||||
|  |     let args = ["build"]  + goargs + [".", "errors"] | ||||||
|  |  | ||||||
|  |     " if we have nvim, call it asynchronously and return early ;) | ||||||
|  |     if has('nvim') | ||||||
|  |         call go#jobcontrol#Spawn("build", args) | ||||||
|  |         return | ||||||
|  |     endif | ||||||
|  |  | ||||||
|     let old_gopath = $GOPATH |     let old_gopath = $GOPATH | ||||||
|     let $GOPATH = go#path#Detect() |     let $GOPATH = go#path#Detect() | ||||||
|  |     let default_makeprg = &makeprg | ||||||
|  |     let &makeprg = "go " . join(args, ' ') | ||||||
|  |  | ||||||
|     let l:tmpname = tempname() |  | ||||||
|  |  | ||||||
|     if v:shell_error |  | ||||||
|         let &makeprg = "go build . errors" |  | ||||||
|     else |  | ||||||
|         " :make expands '%' and '#' wildcards, so they must also be escaped |  | ||||||
|         let goargs = go#util#Shelljoin(map(copy(a:000), "expand(v:val)"), 1) |  | ||||||
|         let gofiles = go#util#Shelljoin(go#tool#Files(), 1) |  | ||||||
|         let &makeprg = "go build -o " . l:tmpname . ' ' . goargs . ' ' . gofiles |  | ||||||
|     endif |  | ||||||
|  |  | ||||||
|     echon "vim-go: " | echohl Identifier | echon "building ..."| echohl None |  | ||||||
|     if g:go_dispatch_enabled && exists(':Make') == 2 |     if g:go_dispatch_enabled && exists(':Make') == 2 | ||||||
|  |         call go#util#EchoProgress("building dispatched ...") | ||||||
|         silent! exe 'Make' |         silent! exe 'Make' | ||||||
|     else |     else | ||||||
|         silent! exe 'lmake!' |         silent! exe 'lmake!' | ||||||
| @ -47,20 +53,30 @@ function! go#cmd#Build(bang, ...) | |||||||
|             call go#list#JumpToFirst() |             call go#list#JumpToFirst() | ||||||
|         endif |         endif | ||||||
|     else |     else | ||||||
|         redraws! | echon "vim-go: " | echohl Function | echon "[build] SUCCESS"| echohl None |         call go#util#EchoSuccess("[build] SUCCESS") | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|  |  | ||||||
|     call delete(l:tmpname) |  | ||||||
|     let &makeprg = default_makeprg |     let &makeprg = default_makeprg | ||||||
|     let $GOPATH = old_gopath |     let $GOPATH = old_gopath | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  |  | ||||||
|  | " Run runs the current file (and their dependencies if any) in a new terminal. | ||||||
|  | function! go#cmd#RunTerm(mode) | ||||||
|  |     let cmd = "go run ".  go#util#Shelljoin(go#tool#Files()) | ||||||
|  |     call go#term#newmode(cmd, a:mode) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
| " Run runs the current file (and their dependencies if any) and outputs it. | " Run runs the current file (and their dependencies if any) and outputs it. | ||||||
| " This is intented to test small programs and play with them. It's not | " This is intented to test small programs and play with them. It's not | ||||||
| " suitable for long running apps, because vim is blocking by default and | " suitable for long running apps, because vim is blocking by default and | ||||||
| " calling long running apps will block the whole UI. | " calling long running apps will block the whole UI. | ||||||
| function! go#cmd#Run(bang, ...) | function! go#cmd#Run(bang, ...) | ||||||
|  |     if has('nvim') | ||||||
|  |         call go#cmd#RunTerm('') | ||||||
|  |         return | ||||||
|  |     endif | ||||||
|  |  | ||||||
|     let old_gopath = $GOPATH |     let old_gopath = $GOPATH | ||||||
|     let $GOPATH = go#path#Detect() |     let $GOPATH = go#path#Detect() | ||||||
|  |  | ||||||
| @ -90,27 +106,8 @@ function! go#cmd#Run(bang, ...) | |||||||
|         exe 'lmake!' |         exe 'lmake!' | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     " Remove any nonvalid filename from the location list to avoid opening an |  | ||||||
|     " empty buffer. See https://github.com/fatih/vim-go/issues/287 for |  | ||||||
|     " details. |  | ||||||
|     let items = go#list#Get() |     let items = go#list#Get() | ||||||
|     let errors = [] |     let errors = go#tool#FilterValids(items) | ||||||
|     let is_readable = {} |  | ||||||
|  |  | ||||||
|     for item in items |  | ||||||
|         let filename = bufname(item.bufnr) |  | ||||||
|         if !has_key(is_readable, filename) |  | ||||||
|             let is_readable[filename] = filereadable(filename) |  | ||||||
|         endif |  | ||||||
|         if is_readable[filename] |  | ||||||
|             call add(errors, item) |  | ||||||
|         endif |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     for k in keys(filter(is_readable, '!v:val')) |  | ||||||
|         echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon  '"' . k . '"' |  | ||||||
|         echohl Identifier | echon " from location list (nonvalid filename)" | echohl None |  | ||||||
|     endfor |  | ||||||
|  |  | ||||||
|     call go#list#Populate(errors) |     call go#list#Populate(errors) | ||||||
|     call go#list#Window(len(errors)) |     call go#list#Window(len(errors)) | ||||||
| @ -149,33 +146,51 @@ endfunction | |||||||
| " compile the tests instead of running them (useful to catch errors in the | " compile the tests instead of running them (useful to catch errors in the | ||||||
| " test files). Any other argument is appendend to the final `go test` command | " test files). Any other argument is appendend to the final `go test` command | ||||||
| function! go#cmd#Test(bang, compile, ...) | function! go#cmd#Test(bang, compile, ...) | ||||||
|     let command = "go test " |     let args = ["test"] | ||||||
|  |  | ||||||
|     " don't run the test, only compile it. Useful to capture and fix errors or |     " don't run the test, only compile it. Useful to capture and fix errors or | ||||||
|     " to create a test binary. |     " to create a test binary. | ||||||
|     if a:compile |     if a:compile | ||||||
|         let command .= "-c " |         call add(args, "-c") | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     if a:0 |     if a:0 | ||||||
|         let command .= go#util#Shelljoin(map(copy(a:000), "expand(v:val)")) |         " expand all wildcards(i.e: '%' to the current file name) | ||||||
|  |         let goargs = map(copy(a:000), "expand(v:val)") | ||||||
|  |  | ||||||
|  |         " escape all shell arguments before we pass it to test | ||||||
|  |         call extend(args, go#util#Shelllist(goargs, 1)) | ||||||
|     else |     else | ||||||
|         " only add this if no custom flags are passed |         " only add this if no custom flags are passed | ||||||
|         let timeout  = get(g:, 'go_test_timeout', '10s') |         let timeout  = get(g:, 'go_test_timeout', '10s') | ||||||
|         let command .= "-timeout=" . timeout . " " |         call add(args, printf("-timeout=%s", timeout)) | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     if has('nvim') | ||||||
|  |         if get(g:, 'go_term_enabled', 0) | ||||||
|  |             call go#term#new(["go"] + args) | ||||||
|  |         else | ||||||
|  |             call go#jobcontrol#Spawn("test", args) | ||||||
|  |         endif | ||||||
|  |         return | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|     call go#cmd#autowrite() |  | ||||||
|     if a:compile |     if a:compile | ||||||
|         echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None |         echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None | ||||||
|     else |     else | ||||||
|         echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None |         echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
|  |     call go#cmd#autowrite() | ||||||
|     redraw |     redraw | ||||||
|  |  | ||||||
|  |     let command = "go " . join(args, ' ') | ||||||
|  |  | ||||||
|     let out = go#tool#ExecuteInDir(command) |     let out = go#tool#ExecuteInDir(command) | ||||||
|     if v:shell_error |     if v:shell_error | ||||||
|         let errors = go#tool#ParseErrors(split(out, '\n')) |         let errors = go#tool#ParseErrors(split(out, '\n')) | ||||||
|  |         let errors = go#tool#FilterValids(errors) | ||||||
|  |  | ||||||
|         call go#list#Populate(errors) |         call go#list#Populate(errors) | ||||||
|         call go#list#Window(len(errors)) |         call go#list#Window(len(errors)) | ||||||
|         if !empty(errors) && !a:bang |         if !empty(errors) && !a:bang | ||||||
|  | |||||||
| @ -43,6 +43,8 @@ if !exists("g:go_fmt_experimental") | |||||||
|     let g:go_fmt_experimental = 0 |     let g:go_fmt_experimental = 0 | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  | let s:got_fmt_error = 0 | ||||||
|  |  | ||||||
| "  we have those problems :  | "  we have those problems :  | ||||||
| "  http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree | "  http://stackoverflow.com/questions/12741977/prevent-vim-from-updating-its-undo-tree | ||||||
| "  http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1 | "  http://stackoverflow.com/questions/18532692/golang-formatter-and-vim-how-to-destroy-history-record?rq=1 | ||||||
| @ -117,9 +119,12 @@ function! go#fmt#Format(withGoimport) | |||||||
|         let &fileformat = old_fileformat |         let &fileformat = old_fileformat | ||||||
|         let &syntax = &syntax |         let &syntax = &syntax | ||||||
|  |  | ||||||
|         " clean up previous location list |         " clean up previous location list, but only if it's due fmt | ||||||
|  |         if s:got_fmt_error  | ||||||
|  |             let s:got_fmt_error = 0 | ||||||
|             call go#list#Clean() |             call go#list#Clean() | ||||||
|             call go#list#Window() |             call go#list#Window() | ||||||
|  |         endif | ||||||
|     elseif g:go_fmt_fail_silently == 0  |     elseif g:go_fmt_fail_silently == 0  | ||||||
|         let splitted = split(out, '\n') |         let splitted = split(out, '\n') | ||||||
|         "otherwise get the errors and put them to location list |         "otherwise get the errors and put them to location list | ||||||
| @ -141,6 +146,7 @@ function! go#fmt#Format(withGoimport) | |||||||
|             echohl Error | echomsg "Gofmt returned error" | echohl None |             echohl Error | echomsg "Gofmt returned error" | echohl None | ||||||
|         endif |         endif | ||||||
|  |  | ||||||
|  |         let s:got_fmt_error = 1 | ||||||
|         call go#list#Window(len(errors)) |         call go#list#Window(len(errors)) | ||||||
|  |  | ||||||
|         " We didn't use the temp file, so clean up |         " We didn't use the temp file, so clean up | ||||||
|  | |||||||
							
								
								
									
										168
									
								
								sources_non_forked/vim-go/autoload/go/jobcontrol.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								sources_non_forked/vim-go/autoload/go/jobcontrol.vim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,168 @@ | |||||||
|  | " s:jobs is a global reference to all jobs started with Spawn() or with the | ||||||
|  | " internal function s:spawn | ||||||
|  | let s:jobs = {} | ||||||
|  |  | ||||||
|  | " Spawn is a wrapper around s:spawn. It can be executed by other files and | ||||||
|  | " scripts if needed. Desc defines the description for printing the status | ||||||
|  | " during the job execution (useful for statusline integration). | ||||||
|  | function! go#jobcontrol#Spawn(desc, args) | ||||||
|  |   " autowrite is not enabled for jobs | ||||||
|  |   call go#cmd#autowrite() | ||||||
|  |  | ||||||
|  |   let job = s:spawn(a:desc, a:args) | ||||||
|  |   return job.id | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " Statusline returns the current status of the job | ||||||
|  | function! go#jobcontrol#Statusline() abort | ||||||
|  |   if empty(s:jobs) | ||||||
|  |     return '' | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   let import_path =  go#package#ImportPath(expand('%:p:h')) | ||||||
|  |  | ||||||
|  |   for job in values(s:jobs) | ||||||
|  |     if job.importpath != import_path | ||||||
|  |       continue | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     if job.state == "SUCCESS" | ||||||
|  |       return '' | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     return printf("%s ... [%s]", job.desc, job.state) | ||||||
|  |   endfor | ||||||
|  |  | ||||||
|  |   return '' | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " spawn spawns a go subcommand with the name and arguments with jobstart. Once | ||||||
|  | " a job is started a reference will be stored inside s:jobs. spawn changes the | ||||||
|  | " GOPATH when g:go_autodetect_gopath is enabled. The job is started inside the | ||||||
|  | " current files folder. | ||||||
|  | function! s:spawn(desc, args) | ||||||
|  |   let job = {  | ||||||
|  |         \ 'desc': a:desc,  | ||||||
|  |         \ 'winnr': winnr(), | ||||||
|  |         \ 'importpath': go#package#ImportPath(expand('%:p:h')), | ||||||
|  |         \ 'state': "RUNNING", | ||||||
|  |         \ 'stderr' : [], | ||||||
|  |         \ 'stdout' : [], | ||||||
|  |         \ 'on_stdout': function('s:on_stdout'), | ||||||
|  |         \ 'on_stderr': function('s:on_stderr'), | ||||||
|  |         \ 'on_exit' : function('s:on_exit'), | ||||||
|  |         \ } | ||||||
|  |  | ||||||
|  |   " modify GOPATH if needed | ||||||
|  |   let old_gopath = $GOPATH | ||||||
|  |   let $GOPATH = go#path#Detect() | ||||||
|  |  | ||||||
|  |   " execute go build in the files directory | ||||||
|  |   let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' | ||||||
|  |  | ||||||
|  |   " cleanup previous jobs for this file | ||||||
|  |   for jb in values(s:jobs) | ||||||
|  |     if jb.importpath == job.importpath | ||||||
|  |       unlet s:jobs[jb.id] | ||||||
|  |     endif | ||||||
|  |   endfor | ||||||
|  |  | ||||||
|  |   let dir = getcwd() | ||||||
|  |  | ||||||
|  |   execute cd . fnameescape(expand("%:p:h")) | ||||||
|  |  | ||||||
|  |   " append the subcommand, such as 'build' | ||||||
|  |   let argv = ['go'] + a:args | ||||||
|  |  | ||||||
|  |   " run, forrest, run! | ||||||
|  |   let id = jobstart(argv, job) | ||||||
|  |   let job.id = id | ||||||
|  |   let s:jobs[id] = job | ||||||
|  |  | ||||||
|  |   execute cd . fnameescape(dir) | ||||||
|  |  | ||||||
|  |   " restore back GOPATH | ||||||
|  |   let $GOPATH = old_gopath | ||||||
|  |  | ||||||
|  |   return job | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " on_exit is the exit handler for jobstart(). It handles cleaning up the job | ||||||
|  | " references and also displaying errors in the quickfix window collected by | ||||||
|  | " on_stderr handler. If there are no errors and a quickfix window is open, | ||||||
|  | " it'll be closed. | ||||||
|  | function! s:on_exit(job_id, data) | ||||||
|  |   let std_combined = self.stderr + self.stdout | ||||||
|  |   if empty(std_combined) | ||||||
|  |     call go#list#Clean() | ||||||
|  |     call go#list#Window() | ||||||
|  |  | ||||||
|  |     let self.state = "SUCCESS" | ||||||
|  |     return | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   let errors = go#tool#ParseErrors(std_combined) | ||||||
|  |   let errors = go#tool#FilterValids(errors) | ||||||
|  |  | ||||||
|  |   if !len(errors) | ||||||
|  |     " no errors could be past, just return | ||||||
|  |     call go#list#Clean() | ||||||
|  |     call go#list#Window() | ||||||
|  |  | ||||||
|  |     let self.state = "SUCCESS" | ||||||
|  |     return | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   let self.state = "FAILED" | ||||||
|  |  | ||||||
|  |   " if we are still in the same windows show the list | ||||||
|  |   if self.winnr == winnr() | ||||||
|  |     call go#list#Populate(errors) | ||||||
|  |     call go#list#Window(len(errors)) | ||||||
|  |     call go#list#JumpToFirst() | ||||||
|  |   endif | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " on_stdout is the stdout handler for jobstart(). It collects the output of | ||||||
|  | " stderr and stores them to the jobs internal stdout list.  | ||||||
|  | function! s:on_stdout(job_id, data) | ||||||
|  |   call extend(self.stdout, a:data) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " on_stderr is the stderr handler for jobstart(). It collects the output of | ||||||
|  | " stderr and stores them to the jobs internal stderr list. | ||||||
|  | function! s:on_stderr(job_id, data) | ||||||
|  |   call extend(self.stderr, a:data) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " abort_all aborts all current jobs created with s:spawn() | ||||||
|  | function! s:abort_all() | ||||||
|  |   if empty(s:jobs) | ||||||
|  |     return | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   for id in keys(s:jobs) | ||||||
|  |     if id > 0 | ||||||
|  |       silent! call jobstop(id) | ||||||
|  |     endif | ||||||
|  |   endfor | ||||||
|  |  | ||||||
|  |   let s:jobs = {} | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " abort aborts the job with the given name, where name is the first argument | ||||||
|  | " passed to s:spawn() | ||||||
|  | function! s:abort(path) | ||||||
|  |   if empty(s:jobs) | ||||||
|  |     return | ||||||
|  |   endif | ||||||
|  |  | ||||||
|  |   for job in values(s:jobs) | ||||||
|  |     if job.importpath == path && job.id > 0 | ||||||
|  |       silent! call jobstop(job.id) | ||||||
|  |       unlet s:jobs['job.id'] | ||||||
|  |     endif | ||||||
|  |   endfor | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " vim:ts=2:sw=2:et | ||||||
| @ -36,6 +36,10 @@ function! go#list#Populate(items) | |||||||
| 	call setloclist(0, a:items, 'r') | 	call setloclist(0, a:items, 'r') | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | function! go#list#PopulateWin(winnr, items) | ||||||
|  | 	call setloclist(a:winnr, a:items, 'r') | ||||||
|  | endfunction | ||||||
|  |  | ||||||
| " Parse parses the given items based on the specified errorformat nad | " Parse parses the given items based on the specified errorformat nad | ||||||
| " populates the location list. | " populates the location list. | ||||||
| function! go#list#ParseFormat(errformat, items) | function! go#list#ParseFormat(errformat, items) | ||||||
|  | |||||||
							
								
								
									
										124
									
								
								sources_non_forked/vim-go/autoload/go/term.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								sources_non_forked/vim-go/autoload/go/term.vim
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | |||||||
|  | if has('nvim') && !exists("g:go_term_mode") | ||||||
|  |     let g:go_term_mode = 'vsplit' | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | " s:jobs is a global reference to all jobs started with new() | ||||||
|  | let s:jobs = {} | ||||||
|  |  | ||||||
|  | " new creates a new terminal with the given command. Mode is set based on the | ||||||
|  | " global variable g:go_term_mode, which is by default set to :vsplit | ||||||
|  | function! go#term#new(cmd) | ||||||
|  |     call go#term#newmode(a:cmd, g:go_term_mode) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " new creates a new terminal with the given command and window mode. | ||||||
|  | function! go#term#newmode(cmd, mode) | ||||||
|  |     let mode = a:mode | ||||||
|  |     if empty(mode) | ||||||
|  |         let mode = g:go_term_mode | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     " modify GOPATH if needed | ||||||
|  |     let old_gopath = $GOPATH | ||||||
|  |     let $GOPATH = go#path#Detect() | ||||||
|  |  | ||||||
|  |     " execute go build in the files directory | ||||||
|  |     let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' | ||||||
|  |     let dir = getcwd() | ||||||
|  |  | ||||||
|  |     execute cd . fnameescape(expand("%:p:h")) | ||||||
|  |  | ||||||
|  |     execute mode.' __go_term__' | ||||||
|  |  | ||||||
|  |     setlocal filetype=goterm | ||||||
|  |     setlocal bufhidden=delete | ||||||
|  |     setlocal winfixheight | ||||||
|  |     setlocal noswapfile | ||||||
|  |     setlocal nobuflisted | ||||||
|  |  | ||||||
|  |     let job = {  | ||||||
|  |                 \ 'stderr' : [], | ||||||
|  |                 \ 'stdout' : [], | ||||||
|  |                 \ 'on_stdout': function('s:on_stdout'), | ||||||
|  |                 \ 'on_stderr': function('s:on_stderr'), | ||||||
|  |                 \ 'on_exit' : function('s:on_exit'), | ||||||
|  |                 \ } | ||||||
|  |  | ||||||
|  |     let id = termopen(a:cmd, job) | ||||||
|  |  | ||||||
|  |     execute cd . fnameescape(dir) | ||||||
|  |  | ||||||
|  |     " restore back GOPATH | ||||||
|  |     let $GOPATH = old_gopath | ||||||
|  |  | ||||||
|  |     let job.id = id | ||||||
|  |     startinsert | ||||||
|  |  | ||||||
|  |     " resize new term if needed. | ||||||
|  |     let height = get(g:, 'go_term_height', winheight(0)) | ||||||
|  |     let width = get(g:, 'go_term_width', winwidth(0)) | ||||||
|  |  | ||||||
|  |     " we are careful how to resize. for example it's vertical we don't change | ||||||
|  |     " the height. The below command resizes the buffer | ||||||
|  |     if a:mode == "split" | ||||||
|  |         exe 'resize ' . height | ||||||
|  |     elseif a:mode == "vertical" | ||||||
|  |         exe 'vertical resize ' . width | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     " we also need to resize the pty, so there you go... | ||||||
|  |     call jobresize(id, width, height) | ||||||
|  |  | ||||||
|  |     let s:jobs[id] = job | ||||||
|  |     return id | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! s:on_stdout(job_id, data) | ||||||
|  |     if !has_key(s:jobs, a:job_id) | ||||||
|  |         return | ||||||
|  |     endif | ||||||
|  |     let job = s:jobs[a:job_id] | ||||||
|  |  | ||||||
|  |     call extend(job.stdout, a:data) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! s:on_stderr(job_id, data) | ||||||
|  |     if !has_key(s:jobs, a:job_id) | ||||||
|  |         return | ||||||
|  |     endif | ||||||
|  |     let job = s:jobs[a:job_id] | ||||||
|  |  | ||||||
|  |     call extend(job.stderr, a:data) | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! s:on_exit(job_id, data) | ||||||
|  |     if !has_key(s:jobs, a:job_id) | ||||||
|  |         return | ||||||
|  |     endif | ||||||
|  |     let job = s:jobs[a:job_id] | ||||||
|  |  | ||||||
|  |     " usually there is always output so never branch into this clause | ||||||
|  |     if empty(job.stdout) | ||||||
|  |         call go#list#Clean() | ||||||
|  |         call go#list#Window() | ||||||
|  |     else | ||||||
|  |         let errors = go#tool#ParseErrors(job.stdout) | ||||||
|  |         let errors = go#tool#FilterValids(errors) | ||||||
|  |         if !empty(errors) | ||||||
|  |             " close terminal we don't need it | ||||||
|  |             close  | ||||||
|  |  | ||||||
|  |             call go#list#Populate(errors) | ||||||
|  |             call go#list#Window(len(errors)) | ||||||
|  |             call go#list#JumpToFirst() | ||||||
|  |         else | ||||||
|  |             call go#list#Clean() | ||||||
|  |             call go#list#Window() | ||||||
|  |         endif | ||||||
|  |  | ||||||
|  |     endif | ||||||
|  |  | ||||||
|  |     unlet s:jobs[a:job_id] | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " vim:ts=4:sw=4:et | ||||||
| @ -50,9 +50,14 @@ function! go#tool#ParseErrors(lines) | |||||||
|         if !empty(fatalerrors) |         if !empty(fatalerrors) | ||||||
|             call add(errors, {"text": fatalerrors[1]}) |             call add(errors, {"text": fatalerrors[1]}) | ||||||
|         elseif !empty(tokens) |         elseif !empty(tokens) | ||||||
|             call add(errors, {"filename" : fnamemodify(tokens[1], ':p'), |             " strip endlines of form ^M | ||||||
|  |             let out=substitute(tokens[3], '\r$', '', '') | ||||||
|  |  | ||||||
|  |             call add(errors, { | ||||||
|  |                         \ "filename" : fnamemodify(tokens[1], ':p'), | ||||||
|                         \ "lnum"     : tokens[2], |                         \ "lnum"     : tokens[2], | ||||||
|                         \"text":     tokens[3]}) |                         \ "text"     : out, | ||||||
|  |                         \ }) | ||||||
|         elseif !empty(errors) |         elseif !empty(errors) | ||||||
|             " Preserve indented lines. |             " Preserve indented lines. | ||||||
|             " This comes up especially with multi-line test output. |             " This comes up especially with multi-line test output. | ||||||
| @ -65,6 +70,42 @@ function! go#tool#ParseErrors(lines) | |||||||
|     return errors |     return errors | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | "FilterValids filters the given items with only items that have a valid | ||||||
|  | "filename. Any non valid filename is filtered out. | ||||||
|  | function! go#tool#FilterValids(items) | ||||||
|  |     " Remove any nonvalid filename from the location list to avoid opening an | ||||||
|  |     " empty buffer. See https://github.com/fatih/vim-go/issues/287 for | ||||||
|  |     " details. | ||||||
|  |     let filtered = [] | ||||||
|  |     let is_readable = {} | ||||||
|  |  | ||||||
|  |     for item in a:items | ||||||
|  |         if has_key(item, 'bufnr') | ||||||
|  |             let filename = bufname(item.bufnr) | ||||||
|  |         elseif has_key(item, 'filename') | ||||||
|  |             let filename = item.filename | ||||||
|  |         else | ||||||
|  |             " nothing to do, add item back to the list | ||||||
|  |             call add(filtered, item) | ||||||
|  |             continue | ||||||
|  |         endif | ||||||
|  |  | ||||||
|  |         if !has_key(is_readable, filename) | ||||||
|  |             let is_readable[filename] = filereadable(filename) | ||||||
|  |         endif | ||||||
|  |         if is_readable[filename] | ||||||
|  |             call add(filtered, item) | ||||||
|  |         endif | ||||||
|  |     endfor | ||||||
|  |  | ||||||
|  |     for k in keys(filter(is_readable, '!v:val')) | ||||||
|  |         echo "vim-go: " | echohl Identifier | echon "[run] Dropped " | echohl Constant | echon  '"' . k . '"' | ||||||
|  |         echohl Identifier | echon " from location list (nonvalid filename)" | echohl None | ||||||
|  |     endfor | ||||||
|  |  | ||||||
|  |     return filtered | ||||||
|  | endfunction | ||||||
|  |  | ||||||
| function! go#tool#ExecuteInDir(cmd) abort | function! go#tool#ExecuteInDir(cmd) abort | ||||||
|     let old_gopath = $GOPATH |     let old_gopath = $GOPATH | ||||||
|     let $GOPATH = go#path#Detect() |     let $GOPATH = go#path#Detect() | ||||||
|  | |||||||
| @ -53,7 +53,37 @@ endfunction | |||||||
| function! go#util#Shelljoin(arglist, ...) | function! go#util#Shelljoin(arglist, ...) | ||||||
| 	if a:0 | 	if a:0 | ||||||
| 		return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') | 		return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') | ||||||
| 	else |  | ||||||
| 		return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') |  | ||||||
| 	endif | 	endif | ||||||
|  |  | ||||||
|  | 	return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') | ||||||
| endfunction | endfunction | ||||||
|  |  | ||||||
|  | " Shelljoin returns a shell-safe representation of the items in the given | ||||||
|  | " arglist. The {special} argument of shellescape() may optionally be passed. | ||||||
|  | function! go#util#Shelllist(arglist, ...) | ||||||
|  | 	if a:0 | ||||||
|  | 		return map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')') | ||||||
|  |     endif | ||||||
|  | 	return map(copy(a:arglist), 'shellescape(v:val)') | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " TODO(arslan): I couldn't parameterize the highlight types. Check if we can | ||||||
|  | " simplify the following functions | ||||||
|  |  | ||||||
|  | function! go#util#EchoSuccess(msg) | ||||||
|  |     redraws! | echon "vim-go: " | echohl Function | echon a:msg | echohl None | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! go#util#EchoError(msg) | ||||||
|  |     redraws! | echon "vim-go: " | echohl ErrorMsg | echon a:msg | echohl None | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! go#util#EchoWarning(msg) | ||||||
|  |     redraws! | echon "vim-go: " | echohl WarningMsg | echon a:msg | echohl None | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | function! go#util#EchoProgress(msg) | ||||||
|  |     redraws! | echon "vim-go: " | echohl Identifier | echon a:msg | echohl None | ||||||
|  | endfunction | ||||||
|  |  | ||||||
|  | " vim:ts=4:sw=4:et | ||||||
|  | |||||||
| @ -11,6 +11,13 @@ endif | |||||||
|  |  | ||||||
| " Some handy plug mappings | " Some handy plug mappings | ||||||
| nnoremap <silent> <Plug>(go-run) :<C-u>call go#cmd#Run(!g:go_jump_to_error, '%')<CR> | nnoremap <silent> <Plug>(go-run) :<C-u>call go#cmd#Run(!g:go_jump_to_error, '%')<CR> | ||||||
|  |  | ||||||
|  | if has("nvim") | ||||||
|  | 	nnoremap <silent> <Plug>(go-run-vertical) :<C-u>call go#cmd#RunTerm('vsplit')<CR> | ||||||
|  | 	nnoremap <silent> <Plug>(go-run-split) :<C-u>call go#cmd#RunTerm('split')<CR> | ||||||
|  | 	nnoremap <silent> <Plug>(go-run-tab) :<C-u>call go#cmd#RunTerm('tab')<CR> | ||||||
|  | endif | ||||||
|  |  | ||||||
| nnoremap <silent> <Plug>(go-build) :<C-u>call go#cmd#Build(!g:go_jump_to_error)<CR> | nnoremap <silent> <Plug>(go-build) :<C-u>call go#cmd#Build(!g:go_jump_to_error)<CR> | ||||||
| nnoremap <silent> <Plug>(go-generate) :<C-u>call go#cmd#Generate(!g:go_jump_to_error)<CR> | nnoremap <silent> <Plug>(go-generate) :<C-u>call go#cmd#Generate(!g:go_jump_to_error)<CR> | ||||||
| nnoremap <silent> <Plug>(go-install) :<C-u>call go#cmd#Install(!g:go_jump_to_error)<CR> | nnoremap <silent> <Plug>(go-install) :<C-u>call go#cmd#Install(!g:go_jump_to_error)<CR> | ||||||
|  | |||||||
| @ -137,7 +137,6 @@ augroup vim-go | |||||||
|     if get(g:, "go_metalinter_autosave", 0) |     if get(g:, "go_metalinter_autosave", 0) | ||||||
|         autocmd BufWritePost *.go call go#lint#Gometa(1) |         autocmd BufWritePost *.go call go#lint#Gometa(1) | ||||||
|     endif |     endif | ||||||
|  |  | ||||||
| augroup END | augroup END | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -95,6 +95,8 @@ snippet mdoc | |||||||
| 	@moduledoc """ | 	@moduledoc """ | ||||||
| 	${0} | 	${0} | ||||||
| 	""" | 	""" | ||||||
|  | snippet mdocf | ||||||
|  | 	@moduledoc false | ||||||
| snippet rec | snippet rec | ||||||
| 	receive do | 	receive do | ||||||
| 		${1} -> | 		${1} -> | ||||||
|  | |||||||
| @ -16,6 +16,10 @@ snippet => | |||||||
| 	(${0}) => { | 	(${0}) => { | ||||||
| 		${1} | 		${1} | ||||||
| 	} | 	} | ||||||
|  | snippet af | ||||||
|  | 	(${0}) => { | ||||||
|  | 		${1} | ||||||
|  | 	} | ||||||
| snippet sym | snippet sym | ||||||
| 	const ${0} = Symbol('${1}'); | 	const ${0} = Symbol('${1}'); | ||||||
| snippet ed | snippet ed | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 amix
					amix