vim-signify/autoload/sy/sign.vim
Marco Hinz 9e83f243e7 Fix unicode + subscripting bug
This bug happened when a unicode character was used for the delete sign.
Prior to this patch we used string subscripting which worked fine for
ASCII characters, but see yourself:

    :echo '«5'[-2:]
2013-12-29 19:18:54 +01:00

76 lines
2.0 KiB
VimL

" vim: et sw=2 sts=2
scriptencoding utf-8
" Init: values {{{1
let s:sign_delete = get(g:, 'signify_sign_delete', '_')
let s:delete_highlight = ['', 'SignifyLineDelete']
" Function: #get_others {{{1
function! sy#sign#get_others() abort
let s:other_signs_line_numbers = {}
let lang = v:lang
silent! execute 'language C'
redir => signlist
silent! execute 'sign place buffer='. b:sy.buffer
redir END
let lines = filter(split(signlist, '\n'), 'v:val =~ "^\\s\\+line"')
if lines[0] =~ 99999
call remove(lines, 0)
endif
for line in lines
let lnum = matchlist(line, '\v^\s+line\=(\d+)')[1]
let s:other_signs_line_numbers[lnum] = 1
endfor
silent! execute 'language' lang
endfunction
" Function: #set {{{1
function! sy#sign#set(signs)
let hunk = { 'ids': [], 'start': a:signs[0].lnum, 'end': a:signs[-1].lnum }
for sign in a:signs
" Preserve non-signify signs
if !g:signify_sign_overwrite && has_key(s:other_signs_line_numbers, sign.lnum)
continue
endif
call add(hunk.ids, g:id_top)
if sign.type == 'SignifyDelete'
let sygn = (sign.count > 9) ? string(sign.count)[-2:] : (s:sign_delete . sign.count)
execute 'sign define SignifyDelete'. sign.count .' text='. sygn .' texthl=SignifySignDelete linehl='. s:delete_highlight[g:signify_line_highlight]
execute 'sign place' g:id_top 'line='. sign.lnum 'name='. sign.type . sign.count 'buffer='. b:sy.buffer
else
execute 'sign place' g:id_top 'line='. sign.lnum 'name='. sign.type 'buffer='. b:sy.buffer
endif
let g:id_top += 1
endfor
call add(b:sy.hunks, hunk)
endfunction
" Function: #remove_all {{{1
function! sy#sign#remove_all(bnum) abort
let sy = getbufvar(a:bnum, 'sy')
if g:signify_sign_overwrite
execute 'sign unplace * buffer='. sy.buffer
else
for hunk in sy.hunks
for id in hunk.ids
execute 'sign unplace' id
endfor
endfor
endif
let sy.hunks = []
let sy.stats = [0, 0, 0]
endfunction