diff --git a/README.mkd b/README.mkd index fbc59d7..4b37292 100644 --- a/README.mkd +++ b/README.mkd @@ -48,6 +48,8 @@ Add `Plugin 'airblade/vim-gitgutter'` to your `~/.vimrc` and then: * either within Vim: `:PluginInstall` * or in your shell: `vim +PluginInstall +qall` +If you are on Windows you may find the command prompt pops up briefly every time vim-gitgutter runs. You can avoid this by installing both [vim-misc](https://github.com/xolox/vim-misc) and [vim-shell](https://github.com/xolox/vim-shell). If you have those two plugins but don't want vim-gitgutter to use them, you can opt out with `let g:gitgutter_avoid_cmd_prompt_on_windows = 0` in your `~/.vimrc`. + ### Usage diff --git a/autoload/diff.vim b/autoload/diff.vim index b4af17c..7f3e350 100644 --- a/autoload/diff.vim +++ b/autoload/diff.vim @@ -31,12 +31,12 @@ function! diff#run_diff(realtime, use_external_grep) let cmd .= '))' if a:realtime - let diff = system(utility#command_in_directory_of_file(cmd), utility#buffer_contents()) + let diff = utility#system(utility#command_in_directory_of_file(cmd), utility#buffer_contents()) else - let diff = system(utility#command_in_directory_of_file(cmd)) + let diff = utility#system(utility#command_in_directory_of_file(cmd)) endif - if v:shell_error + if utility#shell_error() " A shell error indicates the file is not tracked by git (unless something " bizarre is going on). throw 'diff failed' diff --git a/autoload/gitgutter.vim b/autoload/gitgutter.vim index 5d393f9..df85166 100644 --- a/autoload/gitgutter.vim +++ b/autoload/gitgutter.vim @@ -160,7 +160,7 @@ function! gitgutter#stage_hunk() let diff_for_hunk = diff#generate_diff_for_hunk(current_hunk, 1) " apply the diff - call system(utility#command_in_directory_of_file('git apply --cached --unidiff-zero - '), diff_for_hunk) + call utility#system(utility#command_in_directory_of_file('git apply --cached --unidiff-zero - '), diff_for_hunk) " refresh gitgutter's view of buffer silent execute "GitGutter" @@ -183,7 +183,7 @@ function! gitgutter#revert_hunk() let diff_for_hunk = diff#generate_diff_for_hunk(current_hunk, 1) " apply the diff - call system(utility#command_in_directory_of_file('git apply --reverse --unidiff-zero - '), diff_for_hunk) + call utility#system(utility#command_in_directory_of_file('git apply --reverse --unidiff-zero - '), diff_for_hunk) " reload file silent edit diff --git a/autoload/utility.vim b/autoload/utility.vim index 59a7483..10bc385 100644 --- a/autoload/utility.vim +++ b/autoload/utility.vim @@ -1,4 +1,7 @@ let s:file = '' +let s:using_xolox_shell = -1 +let s:exit_code = 0 + function! utility#is_active() return g:gitgutter_enabled && utility#exists_file() @@ -14,7 +17,7 @@ endfunction function! utility#shellescape(arg) if a:arg =~ '^[A-Za-z0-9_/.-]\+$' return a:arg - elseif &shell =~# 'cmd' + elseif &shell =~# 'cmd' || utility#using_xolox_shell() return '"' . substitute(substitute(a:arg, '"', '""', 'g'), '%', '"%"', 'g') . '"' else return shellescape(a:arg) @@ -68,10 +71,44 @@ function! utility#buffer_contents() return join(getbufline(s:file, 1, '$'), eol) . eol endfunction +function! utility#shell_error() + return utility#using_xolox_shell() ? s:exit_code : v:shell_error +endfunction + +function! utility#using_xolox_shell() + if s:using_xolox_shell == -1 + if !g:gitgutter_avoid_cmd_prompt_on_windows + let s:using_xolox_shell = 0 + " Although xolox/vim-shell works on both windows and unix we only want to use + " it on windows. + elseif has('win32') || has('win64') || has('win32unix') + let s:using_xolox_shell = exists('g:xolox#misc#version') && exists('g:xolox#shell#version') + else + let s:using_xolox_shell = 0 + endif + endif + return s:using_xolox_shell +endfunction + +function! utility#system(cmd, ...) + if utility#using_xolox_shell() + let options = {'command': a:cmd, 'check': 0} + if a:0 > 0 + let options['stdin'] = a:1 + endif + let ret = xolox#misc#os#exec(options) + let output = join(ret.stdout, "\n") + let s:exit_code = ret.exit_code + else + let output = (a:0 == 0) ? system(a:cmd) : system(a:cmd, a:1) + endif + return output +endfunction + function! utility#file_relative_to_repo_root() let file_path_relative_to_repo_root = getbufvar(s:file, 'gitgutter_repo_relative_path') if empty(file_path_relative_to_repo_root) - let dir_path_relative_to_repo_root = system(utility#command_in_directory_of_file('git rev-parse --show-prefix')) + let dir_path_relative_to_repo_root = utility#system(utility#command_in_directory_of_file('git rev-parse --show-prefix')) let dir_path_relative_to_repo_root = utility#strip_trailing_new_line(dir_path_relative_to_repo_root) let file_path_relative_to_repo_root = dir_path_relative_to_repo_root . utility#filename() call setbufvar(s:file, 'gitgutter_repo_relative_path', file_path_relative_to_repo_root) diff --git a/plugin/gitgutter.vim b/plugin/gitgutter.vim index 423dfe0..b1baa38 100644 --- a/plugin/gitgutter.vim +++ b/plugin/gitgutter.vim @@ -41,6 +41,7 @@ call s:set('g:gitgutter_sign_modified_removed', '~_') call s:set('g:gitgutter_diff_args', '') call s:set('g:gitgutter_escape_grep', 0) call s:set('g:gitgutter_map_keys', 1) +call s:set('g:gitgutter_avoid_cmd_prompt_on_windows', 1) call highlight#define_sign_column_highlight() call highlight#define_highlights()