mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-23 22:30:04 +08:00
87 lines
2.7 KiB
VimL
87 lines
2.7 KiB
VimL
|
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
|
||
|
|
||
|
" }}}
|