mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-08 11:33:48 -05:00
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.
222 lines
5.0 KiB
VimL
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
|
|
|
|
" }}}
|