mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-10 20:43:47 -05:00
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.
This commit is contained in:
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user