Don't place/unplace dummy sign unnecessarily.

This commit is contained in:
Andy Stewart
2014-01-27 14:15:19 +01:00
parent afecd8711d
commit 072846e945
3 changed files with 43 additions and 23 deletions

View File

@@ -8,7 +8,7 @@ let s:next_sign_id = s:first_sign_id
let s:dummy_sign_id = s:first_sign_id - 1
" Removes gitgutter's signs from the given file.
" Removes gitgutter's signs (excluding dummy sign) from the given file.
function! sign#clear_signs(file_name)
call sign#find_current_signs(a:file_name)
for sign in values(getbufvar(a:file_name, 'gitgutter_gitgutter_signs'))
@@ -26,19 +26,33 @@ function! sign#update_signs(file_name, modified_lines)
call sign#find_current_signs(a:file_name)
let new_gitgutter_signs_line_numbers = map(copy(a:modified_lines), 'v:val[0]')
call sign#remove_obsolete_gitgutter_signs(a:file_name, new_gitgutter_signs_line_numbers)
let obsolete_signs = sign#obsolete_gitgutter_signs_to_remove(a:file_name, new_gitgutter_signs_line_numbers)
let flicker_possible = s:remove_all_old_signs && !empty(a:modified_lines)
if flicker_possible
call sign#add_dummy_sign()
endif
call sign#remove_signs(obsolete_signs)
call sign#upsert_new_gitgutter_signs(a:file_name, a:modified_lines)
if flicker_possible
call sign#remove_dummy_sign(0)
endif
endfunction
function! sign#add_dummy_sign()
execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy file=" . utility#file()
if !getbufvar(utility#file(), 'gitgutter_dummy_sign')
execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy file=" . utility#file()
call setbufvar(utility#file(), 'gitgutter_dummy_sign', 1)
endif
endfunction
function! sign#remove_dummy_sign()
if exists('s:dummy_sign_id')
function! sign#remove_dummy_sign(force)
if getbufvar(utility#file(), 'gitgutter_dummy_sign') && (a:force || !g:gitgutter_sign_column_always)
execute "sign unplace" s:dummy_sign_id "file=" . utility#file()
call setbufvar(utility#file(), 'gitgutter_dummy_sign', 0)
endif
endfunction
@@ -51,6 +65,7 @@ endfunction
function! sign#find_current_signs(file_name)
let gitgutter_signs = {} " <line_number>: {'id': <id>, 'name': <name>}
let other_signs = []
let dummy_sign_placed = 0
redir => signs
silent execute "sign place file=" . a:file_name
@@ -61,7 +76,9 @@ function! sign#find_current_signs(file_name)
" We assume splitting is faster than a regexp.
let components = split(sign_line)
let name = split(components[2], '=')[1]
if name !~# 'GitGutterDummy'
if name =~# 'GitGutterDummy'
let dummy_sign_placed = 1
else
let line_number = str2nr(split(components[0], '=')[1])
if name =~# 'GitGutter'
let id = str2nr(split(components[1], '=')[1])
@@ -72,18 +89,31 @@ function! sign#find_current_signs(file_name)
end
endfor
call setbufvar(a:file_name, 'gitgutter_dummy_sign', dummy_sign_placed)
call setbufvar(a:file_name, 'gitgutter_gitgutter_signs', gitgutter_signs)
call setbufvar(a:file_name, 'gitgutter_other_signs', other_signs)
endfunction
function! sign#remove_obsolete_gitgutter_signs(file_name, new_gitgutter_signs_line_numbers)
function! sign#obsolete_gitgutter_signs_to_remove(file_name, new_gitgutter_signs_line_numbers)
let signs_to_remove = []
let remove_all_signs = 1
let old_gitgutter_signs = getbufvar(a:file_name, 'gitgutter_gitgutter_signs')
for line_number in keys(old_gitgutter_signs)
if index(a:new_gitgutter_signs_line_numbers, str2nr(line_number)) == -1
execute "sign unplace" old_gitgutter_signs[line_number].id
call add(signs_to_remove, old_gitgutter_signs[line_number].id)
else
let remove_all_signs = 0
endif
endfor
let s:remove_all_old_signs = remove_all_signs
return signs_to_remove
endfunction
function! sign#remove_signs(sign_ids)
for id in a:sign_ids
execute "sign unplace" id
endfor
endfunction