mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-13 05:43:53 -05:00
Add hunk previewing.
This commit is contained in:
@@ -178,13 +178,18 @@ function! diff#process_modified_and_removed(modifications, from_count, to_count,
|
||||
let a:modifications[-1] = [a:to_line + offset - 1, 'modified_removed']
|
||||
endfunction
|
||||
|
||||
function! diff#generate_diff_for_hunk(hunk)
|
||||
return diff#discard_hunks(diff#run_diff(0, 0), a:hunk)
|
||||
function! diff#generate_diff_for_hunk(hunk, keep_header)
|
||||
let diff = diff#discard_hunks(diff#run_diff(0, 0), a:hunk, a:keep_header)
|
||||
if !a:keep_header
|
||||
" Discard summary line
|
||||
let diff = join(split(diff, '\n')[1:-1], "\n")
|
||||
endif
|
||||
return diff
|
||||
endfunction
|
||||
|
||||
function! diff#discard_hunks(diff, hunk_to_keep)
|
||||
function! diff#discard_hunks(diff, hunk_to_keep, keep_header)
|
||||
let modified_diff = []
|
||||
let keep_line = 1 " start by keeping header
|
||||
let keep_line = a:keep_header
|
||||
for line in split(a:diff, '\n')
|
||||
let hunk_info = diff#parse_hunk(line)
|
||||
if len(hunk_info) == 4 " start of new hunk
|
||||
|
||||
@@ -119,7 +119,7 @@ function! gitgutter#stage_hunk()
|
||||
endif
|
||||
|
||||
" construct a diff
|
||||
let diff_for_hunk = diff#generate_diff_for_hunk(current_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)
|
||||
@@ -142,7 +142,7 @@ function! gitgutter#revert_hunk()
|
||||
endif
|
||||
|
||||
" construct a diff
|
||||
let diff_for_hunk = diff#generate_diff_for_hunk(current_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)
|
||||
@@ -152,4 +152,32 @@ function! gitgutter#revert_hunk()
|
||||
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
|
||||
|
||||
" }}}
|
||||
|
||||
Reference in New Issue
Block a user