mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-09 12:03:48 -05:00
Handle modifed-and-added/removed diffs.
This commit is contained in:
@@ -62,10 +62,6 @@ The syntax highlighting for your sign column is probably set strangely. Either
|
||||
highlight clear SignColumn
|
||||
```
|
||||
|
||||
> Lines removed below a modified line are not shown.
|
||||
|
||||
True. This plugin uses Vim's signs which require a sign to be on a line (not between two lines) and only permit one sign per line. Removed lines are signed with an underscore on the line above. If that line has also been modified, the plugin has to choose whether to show the removed-lines sign or the modified-line sign. It prefers the latter.
|
||||
|
||||
> What happens if I also use another plugin which uses signs (e.g. Syntastic)?
|
||||
|
||||
Vim only allows one sign per line. Before adding a sign to a line, vim-gitgutter checks whether a sign has already been added by somebody else. If so it doesn't do anything. In other words vim-gitgutter won't overwrite another plugin's signs. It also won't remove another plugin's signs.
|
||||
|
||||
@@ -37,13 +37,15 @@ endfunction
|
||||
|
||||
function! s:define_signs()
|
||||
if s:highlight_lines
|
||||
sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=DiffAdd
|
||||
sign define GitGutterLineModified text=~ texthl=lineModified linehl=DiffChange
|
||||
sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=DiffDelete
|
||||
sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=DiffAdd
|
||||
sign define GitGutterLineModified text=~ texthl=lineModified linehl=DiffChange
|
||||
sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=DiffDelete
|
||||
sign define GitGutterLineModifiedRemoved text=~_ texthl=lineModified linehl=DiffChange
|
||||
else
|
||||
sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=NONE
|
||||
sign define GitGutterLineModified text=~ texthl=lineModified linehl=NONE
|
||||
sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=NONE
|
||||
sign define GitGutterLineAdded text=+ texthl=lineAdded linehl=NONE
|
||||
sign define GitGutterLineModified text=~ texthl=lineModified linehl=NONE
|
||||
sign define GitGutterLineRemoved text=_ texthl=lineRemoved linehl=NONE
|
||||
sign define GitGutterLineModifiedRemoved text=~_ texthl=lineModified linehl=NONE
|
||||
endif
|
||||
endfunction
|
||||
|
||||
@@ -130,6 +132,7 @@ function! s:process_hunk(hunk)
|
||||
let from_count = a:hunk[1]
|
||||
let to_line = a:hunk[2]
|
||||
let to_count = a:hunk[3]
|
||||
|
||||
if s:is_added(from_count, to_count)
|
||||
let offset = 0
|
||||
while offset < to_count
|
||||
@@ -137,16 +140,40 @@ function! s:process_hunk(hunk)
|
||||
call add(modifications, [line_number, 'added'])
|
||||
let offset += 1
|
||||
endwhile
|
||||
|
||||
elseif s:is_removed(from_count, to_count)
|
||||
" removed lines came after `to_line`.
|
||||
call add(modifications, [to_line, 'removed'])
|
||||
else " modified
|
||||
|
||||
elseif s:is_modified(from_count, to_count)
|
||||
let offset = 0
|
||||
while offset < to_count
|
||||
let line_number = to_line + offset
|
||||
call add(modifications, [line_number, 'modified'])
|
||||
let offset += 1
|
||||
endwhile
|
||||
|
||||
elseif s:is_modified_and_added(from_count, to_count)
|
||||
let offset = 0
|
||||
while offset < from_count
|
||||
let line_number = to_line + offset
|
||||
call add(modifications, [line_number, 'modified'])
|
||||
let offset += 1
|
||||
endwhile
|
||||
while offset < to_count
|
||||
let line_number = to_line + offset
|
||||
call add(modifications, [line_number, 'added'])
|
||||
let offset += 1
|
||||
endwhile
|
||||
|
||||
elseif s:is_modified_and_removed(from_count, to_count)
|
||||
let offset = 0
|
||||
while offset < to_count
|
||||
let line_number = to_line + offset
|
||||
call add(modifications, [line_number, 'modified'])
|
||||
let offset += 1
|
||||
endwhile
|
||||
call add(modifications, [to_line + offset - 1, 'modified_removed'])
|
||||
|
||||
endif
|
||||
return modifications
|
||||
endfunction
|
||||
@@ -159,6 +186,18 @@ function! s:is_removed(from_count, to_count)
|
||||
return a:from_count > 0 && a:to_count == 0
|
||||
endfunction
|
||||
|
||||
function! s:is_modified(from_count, to_count)
|
||||
return a:from_count > 0 && a:to_count > 0 && a:from_count == a:to_count
|
||||
endfunction
|
||||
|
||||
function! s:is_modified_and_added(from_count, to_count)
|
||||
return a:from_count > 0 && a:to_count > 0 && a:from_count < a:to_count
|
||||
endfunction
|
||||
|
||||
function! s:is_modified_and_removed(from_count, to_count)
|
||||
return a:from_count > 0 && a:to_count > 0 && a:from_count > a:to_count
|
||||
endfunction
|
||||
|
||||
" }}}
|
||||
|
||||
" Sign processing {{{
|
||||
@@ -200,6 +239,8 @@ function! s:show_signs(file_name, modified_lines)
|
||||
let name = 'GitGutterLineRemoved'
|
||||
elseif type ==? 'modified'
|
||||
let name = 'GitGutterLineModified'
|
||||
elseif type ==? 'modified_removed'
|
||||
let name = 'GitGutterLineModifiedRemoved'
|
||||
endif
|
||||
call s:add_sign(line_number, name, a:file_name)
|
||||
endfor
|
||||
|
||||
Reference in New Issue
Block a user