Files
vim-gitgutter/autoload/gitgutter.vim
Andy Stewart a2aa2b1100 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.
2014-06-19 10:45:40 +02:00

222 lines
5.0 KiB
VimL

" Primary functions {{{
function! gitgutter#all()
for buffer_id in tabpagebuflist()
let file = expand('#' . buffer_id . ':p')
if !empty(file)
call gitgutter#process_buffer(file, 0)
endif
endfor
endfunction
" file: (string) the file to process.
" realtime: (boolean) when truthy, do a realtime diff; otherwise do a disk-based diff.
function! gitgutter#process_buffer(file, realtime)
call utility#set_file(a:file)
if utility#is_active()
if g:gitgutter_sign_column_always
call sign#add_dummy_sign()
endif
try
if !a:realtime || utility#has_fresh_changes(a:file)
let diff = diff#run_diff(a:realtime || utility#has_unsaved_changes(a:file), 1)
call hunk#set_hunks(diff#parse_diff(diff))
let modified_lines = diff#process_hunks(hunk#hunks())
if g:gitgutter_signs || g:gitgutter_highlight_lines
call sign#update_signs(a:file, modified_lines)
endif
call utility#save_last_seen_change(a:file)
endif
catch /diff failed/
call hunk#reset()
endtry
else
call hunk#reset()
endif
endfunction
function! gitgutter#disable()
" get list of all buffers (across all tabs)
let buflist = []
for i in range(tabpagenr('$'))
call extend(buflist, tabpagebuflist(i + 1))
endfor
for buffer_id in buflist
let file = expand('#' . buffer_id . ':p')
if !empty(file)
call utility#set_file(file)
call sign#clear_signs(utility#file())
call sign#remove_dummy_sign(1)
call hunk#reset()
endif
endfor
let g:gitgutter_enabled = 0
endfunction
function! gitgutter#enable()
let g:gitgutter_enabled = 1
call gitgutter#all()
endfunction
function! gitgutter#toggle()
if g:gitgutter_enabled
call gitgutter#disable()
else
call gitgutter#enable()
endif
endfunction
" }}}
" Line highlights {{{
function! gitgutter#line_highlights_disable()
let g:gitgutter_highlight_lines = 0
call highlight#define_sign_line_highlights()
if !g:gitgutter_signs
call sign#clear_signs(utility#file())
call sign#remove_dummy_sign(0)
endif
redraw!
endfunction
function! gitgutter#line_highlights_enable()
let old_highlight_lines = g:gitgutter_highlight_lines
let g:gitgutter_highlight_lines = 1
call highlight#define_sign_line_highlights()
if !old_highlight_lines && !g:gitgutter_signs
call gitgutter#all()
endif
redraw!
endfunction
function! gitgutter#line_highlights_toggle()
if g:gitgutter_highlight_lines
call gitgutter#line_highlights_disable()
else
call gitgutter#line_highlights_enable()
endif
endfunction
" }}}
" Signs {{{
function! gitgutter#signs_enable()
let old_signs = g:gitgutter_signs
let g:gitgutter_signs = 1
call highlight#define_sign_text_highlights()
if !old_signs && !g:gitgutter_highlight_lines
call gitgutter#all()
endif
endfunction
function! gitgutter#signs_disable()
let g:gitgutter_signs = 0
call highlight#define_sign_text_highlights()
if !g:gitgutter_highlight_lines
call sign#clear_signs(utility#file())
call sign#remove_dummy_sign(0)
endif
endfunction
function! gitgutter#signs_toggle()
if g:gitgutter_signs
call gitgutter#signs_disable()
else
call gitgutter#signs_enable()
endif
endfunction
" }}}
" Hunks {{{
function! gitgutter#stage_hunk()
if utility#is_active()
" Ensure the working copy of the file is up to date.
" It doesn't make sense to stage a hunk otherwise.
silent write
" find current hunk
let current_hunk = hunk#current_hunk()
if empty(current_hunk)
return
endif
" construct a diff
let diff_for_hunk = diff#generate_diff_for_hunk(current_hunk, 1)
" apply the diff
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"
endif
endfunction
function! gitgutter#revert_hunk()
if utility#is_active()
" Ensure the working copy of the file is up to date.
" It doesn't make sense to stage a hunk otherwise.
silent write
" find current hunk
let current_hunk = hunk#current_hunk()
if empty(current_hunk)
return
endif
" construct a diff
let diff_for_hunk = diff#generate_diff_for_hunk(current_hunk, 1)
" apply the diff
call utility#system(utility#command_in_directory_of_file('git apply --reverse --unidiff-zero - '), diff_for_hunk)
" reload file
silent edit
endif
endfunction
function! gitgutter#preview_hunk()
if utility#is_active()
silent write
" find current hunk
let current_hunk = hunk#current_hunk()
if empty(current_hunk)
return
endif
" construct a diff
let diff_for_hunk = diff#generate_diff_for_hunk(current_hunk, 0)
" preview the diff
silent! wincmd P
if !&previewwindow
execute 'bo ' . &previewheight . ' new'
set previewwindow
setlocal filetype=diff buftype=nowrite
endif
execute "%delete_"
call append(0, split(diff_for_hunk, "\n"))
wincmd p
endif
endfunction
" }}}