From 6b48dc598fce3f7ce491a4a54d553b46e2b30aac Mon Sep 17 00:00:00 2001 From: amix Date: Wed, 16 Dec 2015 10:53:53 -0300 Subject: [PATCH] Updated plugins --- .../syntastic/plugin/syntastic.vim | 2 +- .../syntax_checkers/css/mixedindentlint.vim | 22 +++ .../javascript/mixedindentlint.vim | 40 +++++ .../syntastic/syntax_checkers/r/lint.vim | 1 - .../syntastic/syntax_checkers/r/lintr.vim | 2 +- .../syntax_checkers/scss/mixedindentlint.vim | 22 +++ .../vim-fugitive/plugin/fugitive.vim | 37 ++-- sources_non_forked/vim-go/README.md | 43 ++--- sources_non_forked/vim-go/autoload/go/cmd.vim | 99 ++++++----- sources_non_forked/vim-go/autoload/go/fmt.vim | 12 +- .../vim-go/autoload/go/jobcontrol.vim | 168 ++++++++++++++++++ .../vim-go/autoload/go/list.vim | 4 + .../vim-go/autoload/go/term.vim | 124 +++++++++++++ .../vim-go/autoload/go/tool.vim | 47 ++++- .../vim-go/autoload/go/util.vim | 34 +++- .../vim-go/ftplugin/go/mappings.vim | 7 + sources_non_forked/vim-go/plugin/go.vim | 1 - .../vim-snippets/snippets/elixir.snippets | 2 + .../javascript/javascript.es6.snippets | 4 + 19 files changed, 576 insertions(+), 95 deletions(-) create mode 100644 sources_non_forked/syntastic/syntax_checkers/css/mixedindentlint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/javascript/mixedindentlint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/scss/mixedindentlint.vim create mode 100644 sources_non_forked/vim-go/autoload/go/jobcontrol.vim create mode 100644 sources_non_forked/vim-go/autoload/go/term.vim diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 39d60729..e7d3466a 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -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 diff --git a/sources_non_forked/syntastic/syntax_checkers/css/mixedindentlint.vim b/sources_non_forked/syntastic/syntax_checkers/css/mixedindentlint.vim new file mode 100644 index 00000000..a0ce3baa --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/css/mixedindentlint.vim @@ -0,0 +1,22 @@ +"============================================================================ +"File: mixedindentlint.vim +"Description: Mixed indentation linter for vim +"Maintainer: Payton Swick +"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: diff --git a/sources_non_forked/syntastic/syntax_checkers/javascript/mixedindentlint.vim b/sources_non_forked/syntastic/syntax_checkers/javascript/mixedindentlint.vim new file mode 100644 index 00000000..29954094 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/javascript/mixedindentlint.vim @@ -0,0 +1,40 @@ +"============================================================================ +"File: mixedindentlint.vim +"Description: Mixed indentation linter for vim +"Maintainer: Payton Swick +"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: diff --git a/sources_non_forked/syntastic/syntax_checkers/r/lint.vim b/sources_non_forked/syntastic/syntax_checkers/r/lint.vim index ca086b13..854c1709 100644 --- a/sources_non_forked/syntastic/syntax_checkers/r/lint.vim +++ b/sources_non_forked/syntastic/syntax_checkers/r/lint.vim @@ -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 . '))') . diff --git a/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim b/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim index e40b1591..7c71ec07 100644 --- a/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim +++ b/sources_non_forked/syntastic/syntax_checkers/r/lintr.vim @@ -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 . ')') . diff --git a/sources_non_forked/syntastic/syntax_checkers/scss/mixedindentlint.vim b/sources_non_forked/syntastic/syntax_checkers/scss/mixedindentlint.vim new file mode 100644 index 00000000..04a1fec4 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/scss/mixedindentlint.vim @@ -0,0 +1,22 @@ +"============================================================================ +"File: mixedindentlint.vim +"Description: Mixed indentation linter for vim +"Maintainer: Payton Swick +"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: diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index d9d7b0e0..5785a545 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -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(),'\ '.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 diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 5179349d..e75c3271 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -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 `` 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 :lne -map :lp -``` - ## 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 :lne +map :lp +``` + + +### Using with Syntastic Sometimes when using both `vim-go` and `syntastic` Vim will start lagging while saving and opening files. The following fixes this: diff --git a/sources_non_forked/vim-go/autoload/go/cmd.vim b/sources_non_forked/vim-go/autoload/go/cmd.vim index d3ce7b04..87312806 100644 --- a/sources_non_forked/vim-go/autoload/go/cmd.vim +++ b/sources_non_forked/vim-go/autoload/go/cmd.vim @@ -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!' @@ -42,25 +48,35 @@ function! go#cmd#Build(bang, ...) let errors = go#list#Get() call go#list#Window(len(errors)) - if !empty(errors) + if !empty(errors) if !a: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 diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index ee9525a9..9ef9a2eb 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -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 - call go#list#Clean() - call go#list#Window() + " 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 diff --git a/sources_non_forked/vim-go/autoload/go/jobcontrol.vim b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim new file mode 100644 index 00000000..f8576a2c --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/jobcontrol.vim @@ -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 diff --git a/sources_non_forked/vim-go/autoload/go/list.vim b/sources_non_forked/vim-go/autoload/go/list.vim index 366c5589..9582d788 100644 --- a/sources_non_forked/vim-go/autoload/go/list.vim +++ b/sources_non_forked/vim-go/autoload/go/list.vim @@ -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) diff --git a/sources_non_forked/vim-go/autoload/go/term.vim b/sources_non_forked/vim-go/autoload/go/term.vim new file mode 100644 index 00000000..78ec4583 --- /dev/null +++ b/sources_non_forked/vim-go/autoload/go/term.vim @@ -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 diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim index ed339ab7..d378b5ab 100644 --- a/sources_non_forked/vim-go/autoload/go/tool.vim +++ b/sources_non_forked/vim-go/autoload/go/tool.vim @@ -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'), - \"lnum": tokens[2], - \"text": tokens[3]}) + " strip endlines of form ^M + let out=substitute(tokens[3], '\r$', '', '') + + call add(errors, { + \ "filename" : fnamemodify(tokens[1], ':p'), + \ "lnum" : tokens[2], + \ "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() diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index ce34d15e..85ab9331 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -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 diff --git a/sources_non_forked/vim-go/ftplugin/go/mappings.vim b/sources_non_forked/vim-go/ftplugin/go/mappings.vim index 2b11c4c8..9e243543 100644 --- a/sources_non_forked/vim-go/ftplugin/go/mappings.vim +++ b/sources_non_forked/vim-go/ftplugin/go/mappings.vim @@ -11,6 +11,13 @@ endif " Some handy plug mappings nnoremap (go-run) :call go#cmd#Run(!g:go_jump_to_error, '%') + +if has("nvim") + nnoremap (go-run-vertical) :call go#cmd#RunTerm('vsplit') + nnoremap (go-run-split) :call go#cmd#RunTerm('split') + nnoremap (go-run-tab) :call go#cmd#RunTerm('tab') +endif + nnoremap (go-build) :call go#cmd#Build(!g:go_jump_to_error) nnoremap (go-generate) :call go#cmd#Generate(!g:go_jump_to_error) nnoremap (go-install) :call go#cmd#Install(!g:go_jump_to_error) diff --git a/sources_non_forked/vim-go/plugin/go.vim b/sources_non_forked/vim-go/plugin/go.vim index 3337b59d..43295ad7 100644 --- a/sources_non_forked/vim-go/plugin/go.vim +++ b/sources_non_forked/vim-go/plugin/go.vim @@ -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 diff --git a/sources_non_forked/vim-snippets/snippets/elixir.snippets b/sources_non_forked/vim-snippets/snippets/elixir.snippets index d89ff033..bd621760 100644 --- a/sources_non_forked/vim-snippets/snippets/elixir.snippets +++ b/sources_non_forked/vim-snippets/snippets/elixir.snippets @@ -95,6 +95,8 @@ snippet mdoc @moduledoc """ ${0} """ +snippet mdocf + @moduledoc false snippet rec receive do ${1} -> diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets index 0d9e8c3c..e1873c5e 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript.es6.snippets @@ -16,6 +16,10 @@ snippet => (${0}) => { ${1} } +snippet af + (${0}) => { + ${1} + } snippet sym const ${0} = Symbol('${1}'); snippet ed