From a2aa2b1100fdbbeb2d2bca20a5b490bb44ba4357 Mon Sep 17 00:00:00 2001 From: Andy Stewart Date: Thu, 19 Jun 2014 10:45:40 +0200 Subject: [PATCH] Avoid Windows command prompt popups when possible. Before this commit some Windows users saw the command prompt pop up briefly, and/or the taskbar flicker, every time the plugin ran. Now the plugin will use xolox's vim-shell and vim-misc, if they are available and we are on Windows, to execute external commands. Xolox's clever plugins avoid the command prompt popup and taskbar flicker. Windows users with those plugins installed can opt out by setting a variable in their vimrc. Many thanks to @suxpert for the initial code. --- README.mkd | 2 ++ autoload/diff.vim | 6 +++--- autoload/gitgutter.vim | 4 ++-- autoload/utility.vim | 41 +++++++++++++++++++++++++++++++++++++++-- plugin/gitgutter.vim | 1 + 5 files changed, 47 insertions(+), 7 deletions(-) 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()