From 0df130ac6efc4807b57482e47041008662b3ec4c Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 17 Jan 2017 19:41:55 +0100 Subject: [PATCH] Make Vim + system() work --- autoload/sy.vim | 16 +++++----- autoload/sy/repo.vim | 69 +++++++++++++++++++++++++------------------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/autoload/sy.vim b/autoload/sy.vim index 3eb7d02..59a119c 100644 --- a/autoload/sy.vim +++ b/autoload/sy.vim @@ -8,13 +8,6 @@ let g:sy_cache = {} let s:has_doau_modeline = v:version > 703 || v:version == 703 && has('patch442') -" Function: #verbose {{{1 -function! sy#verbose(msg) abort - if &verbose - echomsg printf('[sy] %s', a:msg) - endif -endfunction - " Function: #start {{{1 function! sy#start() abort if g:signify_locked @@ -72,7 +65,7 @@ function! sy#start() abort call sy#repo#detect(0) else call sy#verbose('Updating signs.') - call sy#repo#get_diff_{b:sy.type}(0) + call sy#repo#get_diff_start(b:sy.type, 0) endif endfunction @@ -156,6 +149,13 @@ function! sy#buffer_is_active() return exists('b:sy') && b:sy.active endfunction +" Function: #verbose {{{1 +function! sy#verbose(msg) abort + if &verbose + echomsg printf('[sy] %s', a:msg) + endif +endfunction + " Function: s:skip {{{1 function! s:skip(path) if &diff || !filereadable(a:path) diff --git a/autoload/sy/repo.vim b/autoload/sy/repo.vim index 597a619..7f76eb7 100644 --- a/autoload/sy/repo.vim +++ b/autoload/sy/repo.vim @@ -16,15 +16,8 @@ function! sy#repo#detect(do_register) abort endif for type in vcs_list - call sy#repo#get_diff_{type}(a:do_register) + call sy#repo#get_diff_start(type, a:do_register) endfor - " let [istype, diff] = sy#repo#get_diff_{type}() - " if istype - " return [diff, type] - " endif - " endfor - - " return ['', 'unknown'] endfunction " Function: s:callback_stdout_nvim {{{1 @@ -40,36 +33,52 @@ endfunction " Function: s:callback_exit {{{1 function! s:callback_exit(_job_id, exitcode, _event) dict abort - call sy#verbose('Running callback_exit(). Exit code: '. a:exitcode) - let [found_diff, diff] = a:exitcode ? [0, ''] : [1, join(self.stdoutbuf, "\n")] - if found_diff + call sy#verbose('Running callback_exit().') + call s:get_diff_end(a:exitcode, join(self.stdoutbuf, "\n"), self.do_register) +endfunction + +" Function: sy#get_diff_start {{{1 +function! sy#repo#get_diff_start(vcs, do_register) abort + if has('nvim') + let id = get(b:, 'job_id_'. a:vcs) + if id + silent! call jobstop(id) + endif + let cmd = s:expand_cmd(g:signify_vcs_cmds[a:vcs], b:sy_info.file) + let cmd = (has('win32') && &shell =~ 'cmd') ? cmd : ['sh', '-c', cmd] + execute b:sy_info.chdir fnameescape(b:sy_info.dir) + try + let s:job_id_git = jobstart(cmd, { + \ 'stdoutbuf': [], + \ 'do_register': a:do_register, + \ 'on_stdout': function('s:callback_stdout_nvim'), + \ 'on_exit': function('s:callback_exit'), + \ }) + finally + execute b:sy_info.chdir b:sy_info.cwd + endtry + else + let diff = s:run(g:signify_vcs_cmds[a:vcs], b:sy_info.path) + call s:get_diff_end(v:shell_error, diff, a:do_register) + endif +endfunction + +" Function: s:get_diff_end {{{1 +function! s:get_diff_end(exitcode, diff, do_register) abort + if !a:exitcode let b:sy.type = 'git' endif - if !self.do_register + if !a:do_register let b:sy.id_top = g:id_top endif - call sy#set_signs(diff, self.do_register) + call sy#set_signs(a:diff, a:do_register) endfunction " Function: #get_diff_git {{{1 -function! sy#repo#get_diff_git(do_register) abort +function! sy#repo#get_diff_git(exitcode, diff, do_register) abort call sy#verbose('Running get_diff_git().') - let cmd = s:expand_cmd(g:signify_vcs_cmds.git, b:sy_info.file) - let cmd = (has('win32') && &shell =~ 'cmd') ? cmd : ['sh', '-c', cmd] - if exists('s:job_id_git') - silent! call jobstop(s:job_id_git) - endif - execute b:sy_info.chdir fnameescape(b:sy_info.dir) - try - let s:job_id_git = jobstart(cmd, { - \ 'stdoutbuf': [], - \ 'do_register': a:do_register, - \ 'on_stdout': function('s:callback_stdout_nvim'), - \ 'on_exit': function('s:callback_exit'), - \ }) - finally - execute b:sy_info.chdir b:sy_info.cwd - endtry + let [found_diff, diff] = a:exitcode ? [0, ''] : [1, join(self.stdoutbuf, "\n")] + call s:get_diff_end(found_diff, diff, self.do_register) endfunction " Function: #get_diff_hg {{{1