mirror of
https://github.com/airblade/vim-gitgutter.git
synced 2025-11-11 13:03:45 -05:00
Autoload.
This commit is contained in:
84
autoload/sign.vim
Normal file
84
autoload/sign.vim
Normal file
@@ -0,0 +1,84 @@
|
||||
" Vim doesn't namespace sign ids so every plugin shares the same
|
||||
" namespace. Sign ids are simply integers so to avoid clashes with other
|
||||
" signs we guess at a clear run.
|
||||
"
|
||||
" Note also we currently never reset s:next_sign_id.
|
||||
let s:first_sign_id = 3000
|
||||
let s:next_sign_id = s:first_sign_id
|
||||
let s:sign_ids = {} " key: filename, value: list of sign ids
|
||||
let s:other_signs = []
|
||||
let s:dummy_sign_id = 153
|
||||
|
||||
|
||||
function! sign#clear_signs(file_name)
|
||||
if exists('s:sign_ids') && has_key(s:sign_ids, a:file_name)
|
||||
for id in s:sign_ids[a:file_name]
|
||||
exe ":sign unplace" id "file=" . a:file_name
|
||||
endfor
|
||||
let s:sign_ids[a:file_name] = []
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" This assumes there are no GitGutter signs in the file.
|
||||
" If this is untenable we could change the regexp to exclude GitGutter's
|
||||
" signs.
|
||||
function! sign#find_other_signs(file_name)
|
||||
redir => signs
|
||||
silent exe ":sign place file=" . a:file_name
|
||||
redir END
|
||||
let s:other_signs = []
|
||||
for sign_line in split(signs, '\n')
|
||||
if sign_line =~ '^\s\+\w\+='
|
||||
let matches = matchlist(sign_line, '^\s\+\w\+=\(\d\+\)')
|
||||
let line_number = str2nr(matches[1])
|
||||
call add(s:other_signs, line_number)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! sign#show_signs(file_name, modified_lines)
|
||||
for line in a:modified_lines
|
||||
let line_number = line[0]
|
||||
let type = 'GitGutterLine' . utility#snake_case_to_camel_case(line[1])
|
||||
call sign#add_sign(line_number, type, a:file_name)
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
function! sign#add_sign(line_number, name, file_name)
|
||||
let id = sign#next_sign_id()
|
||||
if !sign#is_other_sign(a:line_number) " Don't clobber other people's signs.
|
||||
exe ":sign place" id "line=" . a:line_number "name=" . a:name "file=" . a:file_name
|
||||
call sign#remember_sign(id, a:file_name)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! sign#next_sign_id()
|
||||
let next_id = s:next_sign_id
|
||||
let s:next_sign_id += 1
|
||||
return next_id
|
||||
endfunction
|
||||
|
||||
function! sign#remember_sign(id, file_name)
|
||||
if has_key(s:sign_ids, a:file_name)
|
||||
let sign_ids_for_file = s:sign_ids[a:file_name]
|
||||
call add(sign_ids_for_file, a:id)
|
||||
else
|
||||
let sign_ids_for_file = [a:id]
|
||||
endif
|
||||
let s:sign_ids[a:file_name] = sign_ids_for_file
|
||||
endfunction
|
||||
|
||||
function! sign#is_other_sign(line_number)
|
||||
return index(s:other_signs, a:line_number) == -1 ? 0 : 1
|
||||
endfunction
|
||||
|
||||
function! sign#add_dummy_sign()
|
||||
let last_line = line('$')
|
||||
exe ":sign place" s:dummy_sign_id "line=" . (last_line + 1) "name=GitGutterDummy file=" . utility#file()
|
||||
endfunction
|
||||
|
||||
function! sign#remove_dummy_sign()
|
||||
if exists('s:dummy_sign_id')
|
||||
exe ":sign unplace" s:dummy_sign_id "file=" . utility#file()
|
||||
endif
|
||||
endfunction
|
||||
Reference in New Issue
Block a user