mirror of
				https://github.com/amix/vimrc
				synced 2025-10-31 14:43:35 +08:00 
			
		
		
		
	Updated plugins
This commit is contained in:
		| @ -19,7 +19,7 @@ if has('reltime') | ||||
|     lockvar! g:_SYNTASTIC_START | ||||
| endif | ||||
|  | ||||
| let g:_SYNTASTIC_VERSION = '3.7.0-55' | ||||
| let g:_SYNTASTIC_VERSION = '3.7.0-62' | ||||
| lockvar g:_SYNTASTIC_VERSION | ||||
|  | ||||
| " 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 | ||||
|     let setwd = syntastic#util#isRunningWindows() ? 'setwd("' . escape(getcwd(), '"\') . '"); ' : '' | ||||
|     let setwd = 'setwd("' . escape(getcwd(), '"\') . '"); ' | ||||
|     let makeprg = self.getExecEscaped() . ' --slave --restore --no-save' . | ||||
|         \ ' -e ' . syntastic#util#shescape(setwd . 'library(lint); ' . | ||||
|         \       'try(lint(commandArgs(TRUE), ' . g:syntastic_r_lint_styles . '))') . | ||||
|  | ||||
| @ -50,7 +50,7 @@ function! SyntaxCheckers_r_lintr_IsAvailable() dict | ||||
| endfunction | ||||
|  | ||||
| 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' . | ||||
|         \ ' -e ' . syntastic#util#shescape(setwd . 'suppressPackageStartupMessages(library(lintr)); ' . | ||||
|         \       '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 | ||||
|   elseif a:spec =~# '^:' | ||||
|     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)) | ||||
|     return self.dir(a:spec) | ||||
|   elseif filereadable(self.dir('refs/'.a:spec)) | ||||
| @ -1258,7 +1260,7 @@ function! s:Grep(cmd,bang,arg) abort | ||||
|   try | ||||
|     execute cd.'`=s:repo().tree()`' | ||||
|     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.{-}%($|[''" ]\@=\|)@='),'|') | ||||
|     let list = a:cmd =~# '^l' ? getloclist(0) : getqflist() | ||||
|     for entry in list | ||||
| @ -1406,6 +1408,7 @@ function! s:Edit(cmd,bang,...) abort | ||||
|   catch /^fugitive:/ | ||||
|     return 'echoerr v:errmsg' | ||||
|   endtry | ||||
|   let file = s:sub(file, '/$', '') | ||||
|   if a:cmd ==# 'read' | ||||
|     return 'silent %delete_|read '.s:fnameescape(file).'|silent 1delete_|diffupdate|'.line('.') | ||||
|   else | ||||
| @ -2175,7 +2178,7 @@ call s:command("-bar -bang -range -nargs=* -complete=customlist,s:EditComplete G | ||||
|  | ||||
| function! s:Browse(bang,line1,count,...) abort | ||||
|   try | ||||
|     let rev = a:0 ? substitute(join(a:000, ' '),'@[[:alnum:]_-]*\%(://.\{-\}\)\=$','','') : '' | ||||
|     let rev = a:0 ? substitute(join(a:000, ' '),'@[[:alnum:]_-]\w\+\%(://.\{-\}\)\=$','','') : '' | ||||
|     if rev ==# '' | ||||
|       let expanded = s:buffer().rev() | ||||
|     elseif rev ==# ':' | ||||
| @ -2218,7 +2221,7 @@ function! s:Browse(bang,line1,count,...) abort | ||||
|       endif | ||||
|     endif | ||||
|  | ||||
|     if a:0 && join(a:000, ' ') =~# '@[[:alnum:]_-]*\%(://.\{-\}\)\=$' | ||||
|     if a:0 && join(a:000, ' ') =~# '@[[:alnum:]_-]\+\%(://.\{-\}\)\=$' | ||||
|       let remote = matchstr(join(a:000, ' '),'@\zs[[:alnum:]_-]\+\%(://.\{-\}\)\=$') | ||||
|     elseif path =~# '^\.git/refs/remotes/.' | ||||
|       let remote = matchstr(path,'^\.git/refs/remotes/\zs[^/]\+') | ||||
| @ -2319,27 +2322,21 @@ function! s:github_url(opts, ...) abort | ||||
|       return root . '/commits/' . branch | ||||
|     endif | ||||
|   elseif path =~# '^\.git/refs/tags/' | ||||
|     return root . '/releases/tag/' . matchstr(path,'[^/]\+$') | ||||
|   elseif path =~# '^\.git/refs/.' | ||||
|     return root . '/commits/' . matchstr(path,'[^/]\+$') | ||||
|     return root . '/releases/tag/' . path[15:-1] | ||||
|   elseif path =~# '^\.git/refs/remotes/[^/]\+/.' | ||||
|     return root . '/commits/' . matchstr(path,'remotes/[^/]\+/\zs.*') | ||||
|   elseif path =~# '.git/\%(config$\|hooks\>\)' | ||||
|     return root . '/admin' | ||||
|   elseif path =~# '^\.git\>' | ||||
|     return root | ||||
|   endif | ||||
|   if a:opts.revision =~# '^[[:alnum:]._-]\+:' | ||||
|     let commit = matchstr(a:opts.revision,'^[^:]*') | ||||
|   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 | ||||
|   if a:opts.commit =~# '^\d\=$' | ||||
|     let commit = a:opts.repo.rev_parse('HEAD') | ||||
|   else | ||||
|     let commit = a:opts.commit | ||||
|   endif | ||||
|   if a:opts.type == 'tree' | ||||
|     let url = s:sub(root . '/tree/' . commit . '/' . path,'/$','') | ||||
|   if get(a:opts, 'type', '') ==# 'tree' || a:opts.path =~# '/$' | ||||
|     let url = substitute(root . '/tree/' . commit . '/' . path, '/$', '', 'g') | ||||
|   elseif a:opts.type == 'blob' | ||||
|     let url = root . '/blob/' . commit . '/' . path | ||||
|     if get(a:opts, 'line2') && a:opts.line1 == a:opts.line2 | ||||
| @ -2372,10 +2369,8 @@ function! s:instaweb_url(opts) abort | ||||
|     endif | ||||
|     let url .= ';h=' . a:opts.repo.rev_parse(a:opts.commit . (a:opts.path == '' ? '' : ':' . a:opts.path)) | ||||
|   else | ||||
|     if a:opts.type ==# 'blob' | ||||
|       let tmp = tempname() | ||||
|       silent execute 'write !'.a:opts.repo.git_command('hash-object','-w','--stdin').' > '.tmp | ||||
|       let url .= ';h=' . readfile(tmp)[0] | ||||
|     if a:opts.type ==# 'blob' && empty(a:opts.commit) | ||||
|       let url .= ';h='.a:opts.repo.git_chomp('hash-object', '-w', a:opts.path) | ||||
|     else | ||||
|       try | ||||
|         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') | ||||
|         let type = getline('.')[0] | ||||
|         let lnum = line('.') - 1 | ||||
|         let offset = -1 | ||||
|         let offset = 0 | ||||
|         while getline(lnum) !~# '^@@ -\d\+,\d\+ +\d\+,' | ||||
|           if getline(lnum) =~# '^[ '.type.']' | ||||
|             let offset += 1 | ||||
|  | ||||
| @ -46,10 +46,11 @@ disabled/enabled easily. | ||||
|  | ||||
| ## Install | ||||
|  | ||||
| Vim-go follows the standard runtime path structure, so I highly recommend to use | ||||
| a common and well known plugin manager to install vim-go. Do not use vim-go with | ||||
| other Go oriented vim plugins. For Pathogen just clone the repo. For other plugin managers | ||||
| add the appropriate lines and execute the plugin's install command. | ||||
| Vim-go follows the standard runtime path structure, so I highly recommend to | ||||
| use a common and well known plugin manager to install vim-go. Do not use vim-go | ||||
| with other Go oriented vim plugins. For Pathogen just clone the repo. For other | ||||
| plugin managers add the appropriate lines and execute the plugin's install | ||||
| command. | ||||
|  | ||||
| *  [Pathogen](https://github.com/tpope/vim-pathogen) | ||||
|   * `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 | ||||
| `:GoInstallBinaries` command. If invoked, all necessary binaries will be | ||||
| 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 | ||||
| packages. Additionally, use `:GoUpdateBinaries` to update the installed binaries. | ||||
| it will use `$GOPATH/bin`). Note that this command requires `git` for fetching | ||||
| the individual Go packages. Additionally, use `:GoUpdateBinaries` to update the | ||||
| installed binaries. | ||||
|  | ||||
| ### 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 | ||||
| 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 | ||||
| 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 | ||||
| ``` | ||||
|  | ||||
| ## 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 | ||||
| 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 | ||||
| " dependent files for the current folder and passes it to go build. | ||||
| 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 $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 | ||||
|         call go#util#EchoProgress("building dispatched ...") | ||||
|         silent! exe 'Make' | ||||
|     else | ||||
|         silent! exe 'lmake!' | ||||
| @ -47,20 +53,30 @@ function! go#cmd#Build(bang, ...) | ||||
|             call go#list#JumpToFirst() | ||||
|         endif | ||||
|     else | ||||
|         redraws! | echon "vim-go: " | echohl Function | echon "[build] SUCCESS"| echohl None | ||||
|         call go#util#EchoSuccess("[build] SUCCESS") | ||||
|     endif | ||||
|  | ||||
|  | ||||
|     call delete(l:tmpname) | ||||
|     let &makeprg = default_makeprg | ||||
|     let $GOPATH = old_gopath | ||||
| 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. | ||||
| " 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 | ||||
| " calling long running apps will block the whole UI. | ||||
| function! go#cmd#Run(bang, ...) | ||||
|     if has('nvim') | ||||
|         call go#cmd#RunTerm('') | ||||
|         return | ||||
|     endif | ||||
|  | ||||
|     let old_gopath = $GOPATH | ||||
|     let $GOPATH = go#path#Detect() | ||||
|  | ||||
| @ -90,27 +106,8 @@ function! go#cmd#Run(bang, ...) | ||||
|         exe 'lmake!' | ||||
|     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 errors = [] | ||||
|     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 | ||||
|     let errors = go#tool#FilterValids(items) | ||||
|  | ||||
|     call go#list#Populate(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 | ||||
| " test files). Any other argument is appendend to the final `go test` command | ||||
| 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 | ||||
|     " to create a test binary. | ||||
|     if a:compile | ||||
|         let command .= "-c " | ||||
|         call add(args, "-c") | ||||
|     endif | ||||
|  | ||||
|     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 | ||||
|         " only add this if no custom flags are passed | ||||
|         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 | ||||
|  | ||||
|     call go#cmd#autowrite() | ||||
|     if a:compile | ||||
|         echon "vim-go: " | echohl Identifier | echon "compiling tests ..." | echohl None | ||||
|     else | ||||
|         echon "vim-go: " | echohl Identifier | echon "testing ..." | echohl None | ||||
|     endif | ||||
|  | ||||
|     call go#cmd#autowrite() | ||||
|     redraw | ||||
|  | ||||
|     let command = "go " . join(args, ' ') | ||||
|  | ||||
|     let out = go#tool#ExecuteInDir(command) | ||||
|     if v:shell_error | ||||
|         let errors = go#tool#ParseErrors(split(out, '\n')) | ||||
|         let errors = go#tool#FilterValids(errors) | ||||
|  | ||||
|         call go#list#Populate(errors) | ||||
|         call go#list#Window(len(errors)) | ||||
|         if !empty(errors) && !a:bang | ||||
|  | ||||
| @ -43,6 +43,8 @@ if !exists("g:go_fmt_experimental") | ||||
|     let g:go_fmt_experimental = 0 | ||||
| endif | ||||
|  | ||||
| let s:got_fmt_error = 0 | ||||
|  | ||||
| "  we have those problems :  | ||||
| "  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 | ||||
| @ -117,9 +119,12 @@ function! go#fmt#Format(withGoimport) | ||||
|         let &fileformat = old_fileformat | ||||
|         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#Window() | ||||
|         endif | ||||
|     elseif g:go_fmt_fail_silently == 0  | ||||
|         let splitted = split(out, '\n') | ||||
|         "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 | ||||
|         endif | ||||
|  | ||||
|         let s:got_fmt_error = 1 | ||||
|         call go#list#Window(len(errors)) | ||||
|  | ||||
|         " 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') | ||||
| 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 | ||||
| " populates the location list. | ||||
| 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) | ||||
|             call add(errors, {"text": fatalerrors[1]}) | ||||
|         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], | ||||
|                         \"text":     tokens[3]}) | ||||
|                         \ "text"     : out, | ||||
|                         \ }) | ||||
|         elseif !empty(errors) | ||||
|             " Preserve indented lines. | ||||
|             " This comes up especially with multi-line test output. | ||||
| @ -65,6 +70,42 @@ function! go#tool#ParseErrors(lines) | ||||
|     return errors | ||||
| 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 | ||||
|     let old_gopath = $GOPATH | ||||
|     let $GOPATH = go#path#Detect() | ||||
|  | ||||
| @ -53,7 +53,37 @@ endfunction | ||||
| function! go#util#Shelljoin(arglist, ...) | ||||
| 	if a:0 | ||||
| 		return join(map(copy(a:arglist), 'shellescape(v:val, ' . a:1 . ')'), ' ') | ||||
| 	else | ||||
| 		return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') | ||||
| 	endif | ||||
|  | ||||
| 	return join(map(copy(a:arglist), 'shellescape(v:val)'), ' ') | ||||
| 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 | ||||
| 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-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> | ||||
|  | ||||
| @ -137,7 +137,6 @@ augroup vim-go | ||||
|     if get(g:, "go_metalinter_autosave", 0) | ||||
|         autocmd BufWritePost *.go call go#lint#Gometa(1) | ||||
|     endif | ||||
|  | ||||
| augroup END | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -95,6 +95,8 @@ snippet mdoc | ||||
| 	@moduledoc """ | ||||
| 	${0} | ||||
| 	""" | ||||
| snippet mdocf | ||||
| 	@moduledoc false | ||||
| snippet rec | ||||
| 	receive do | ||||
| 		${1} -> | ||||
|  | ||||
| @ -16,6 +16,10 @@ snippet => | ||||
| 	(${0}) => { | ||||
| 		${1} | ||||
| 	} | ||||
| snippet af | ||||
| 	(${0}) => { | ||||
| 		${1} | ||||
| 	} | ||||
| snippet sym | ||||
| 	const ${0} = Symbol('${1}'); | ||||
| snippet ed | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 amix
					amix