nvim/pack/acp/opt/coc.nvim/autoload/coc/vtext.vim

92 lines
3.1 KiB
VimL
Raw Normal View History

2023-03-10 16:38:45 +00:00
let s:is_vim = !has('nvim')
let s:virtual_text_support = has('nvim-0.5.0') || has('patch-9.0.0067')
let s:text_options = has('patch-9.0.0121') || has('nvim-0.6.0')
let s:vim_above = has('patch-9.0.0438')
" This function is called by buffer.setVirtualText
" opts.hl_mode default to 'combine'.
" opts.col vim only, no support on neovim, default to 0.
" opts.virt_text_win_col neovim only.
" opts.text_align could be 'after' 'right' 'below' 'above', converted on neovim.
" opts.text_wrap could be 'wrap' and 'truncate', vim9 only.
" opts.indent add indent when using 'above' and 'below' as text_align
function! coc#vtext#add(bufnr, src_id, line, blocks, opts) abort
if !s:virtual_text_support
return
endif
let align = get(a:opts, 'text_align', 'after')
let indent = ''
if get(a:opts, 'indent', 0)
let indent = matchstr(getline(a:line + 1), '^\s\+')
endif
if s:is_vim
let column = get(a:opts, 'col', 0)
if !has_key(a:opts, 'col') && align ==# 'after'
" add a whitespace, same as neovim.
let indent = ' '
endif
let blocks = a:blocks
if !empty(a:blocks) && (align ==# 'above' || align ==# 'below')
" only first highlight can be used
let hl = a:blocks[0][1]
let text = join(map(copy(a:blocks), "v:val[0]"), '')
let blocks = [[text, hl]]
let column = 0
endif
let first = 1
let base = s:get_option_vim(align, column, get(a:opts, 'text_wrap', 'truncate'))
for [text, hl] in blocks
let type = coc#api#create_type(a:src_id, hl, a:opts)
let opts = extend({ 'text': text, 'type': type }, base)
if first && !empty(indent)
let opts['text'] = indent . text
endif
call prop_add(a:line + 1, column, opts)
let first = 0
endfor
else
let opts = { 'hl_mode': get(a:opts, 'hl_mode', 'combine') }
if s:text_options
if align ==# 'above' || align ==# 'below'
let blocks = empty(indent) ? a:blocks : [[indent, 'Normal']] + a:blocks
let opts['virt_lines'] = [blocks]
if align ==# 'above'
let opts['virt_lines_above'] = v:true
endif
else
let opts['virt_text'] = a:blocks
if align ==# 'right'
let opts['virt_text_pos'] = 'right_align'
else
if type(get(a:opts, 'virt_text_win_col', v:null)) == 0
let opts['virt_text_win_col'] = a:opts['virt_text_win_col']
let opts['virt_text_pos'] = 'overlay'
else
" default to 'after'
let opts['virt_text_pos'] = 'eol'
endif
endif
endif
else
if has('nvim-0.5.1') && type(get(a:opts, 'virt_text_win_col', v:null)) == 0
let opts['virt_text_win_col'] = a:opts['virt_text_win_col']
let opts['virt_text_pos'] = 'overlay'
endif
endif
call nvim_buf_set_extmark(a:bufnr, a:src_id, a:line, 0, opts)
endif
endfunction
function! s:get_option_vim(align, column, wrap) abort
let opts = {}
if s:text_options && a:column == 0
if a:align ==# 'top' && !s:vim_above
let opts['text_align'] = 'right'
else
let opts['text_align'] = a:align
endif
let opts['text_wrap'] = a:wrap
endif
return opts
endfunction