1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 22:30:04 +08:00
SpaceVim/bundle/vim-bookmarks/autoload/bm_sign.vim

87 lines
2.7 KiB
VimL
Raw Normal View History

2021-08-04 17:05:38 +08:00
if !exists("g:bm_sign_init")
let g:bm_sign_init = 0
endif
" Sign {{{
function! bm_sign#lazy_init()
if g:bm_sign_init ==# 0
call bm_sign#init()
let g:bm_sign_init = 1
endif
endfunction
function! bm_sign#init()
call bm_sign#define_highlights()
sign define Bookmark texthl=BookmarkSign
sign define BookmarkAnnotation texthl=BookmarkAnnotationSign
execute "sign define Bookmark text=". g:bookmark_sign
execute "sign define BookmarkAnnotation text=". g:bookmark_annotation_sign
if g:bookmark_highlight_lines
sign define Bookmark linehl=BookmarkLine
sign define BookmarkAnnotation linehl=BookmarkAnnotationLine
else
sign define Bookmark linehl=
sign define BookmarkAnnotation linehl=
endif
endfunction
function! bm_sign#define_highlights()
highlight BookmarkSignDefault ctermfg=33 ctermbg=NONE
highlight BookmarkAnnotationSignDefault ctermfg=28 ctermbg=NONE
highlight BookmarkLineDefault ctermfg=232 ctermbg=33
highlight BookmarkAnnotationLineDefault ctermfg=232 ctermbg=28
highlight default link BookmarkSign BookmarkSignDefault
highlight default link BookmarkAnnotationSign BookmarkAnnotationSignDefault
highlight default link BookmarkLine BookmarkLineDefault
highlight default link BookmarkAnnotationLine BookmarkAnnotationLineDefault
endfunction
function! bm_sign#add(file, line_nr, is_annotation)
call bm_sign#lazy_init()
let sign_idx = g:bm_sign_index
call bm_sign#add_at(a:file, sign_idx, a:line_nr, a:is_annotation)
return sign_idx
endfunction
" add sign with certain index
function! bm_sign#add_at(file, sign_idx, line_nr, is_annotation)
call bm_sign#lazy_init()
let name = a:is_annotation ==# 1 ? "BookmarkAnnotation" : "Bookmark"
execute "sign place ". a:sign_idx ." line=" . a:line_nr ." name=". name ." file=". a:file
if (a:sign_idx >=# g:bm_sign_index)
let g:bm_sign_index = a:sign_idx + 1
endif
endfunction
function! bm_sign#update_at(file, sign_idx, line_nr, is_annotation)
call bm_sign#del(a:file, a:sign_idx)
call bm_sign#add_at(a:file, a:sign_idx, a:line_nr, a:is_annotation)
endfunction
function! bm_sign#del(file, sign_idx)
call bm_sign#lazy_init()
try
execute "sign unplace ". a:sign_idx ." file=". a:file
catch
endtry
endfunction
" Returns dict with {'sign_idx': 'line_nr'}
function! bm_sign#lines_for_signs(file)
call bm_sign#lazy_init()
let bufnr = bufnr(a:file)
let signs_raw = util#redir_execute(":sign place file=". a:file)
let lines = split(signs_raw, "\n")
let result = {}
for line in lines
let results = matchlist(line, 'line=\(\d\+\)\W\+id=\(\d\+\)\W\+name=bookmark\c')
if len(results) ># 0
let result[results[2]] = results[1]
endif
endfor
return result
endfunction
" }}}