You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.5 KiB
133 lines
3.5 KiB
" Copyright (c) 2019 Liu-Cheng Xu |
|
" MIT License |
|
" vim: ts=2 sw=2 sts=2 et |
|
|
|
let s:last_lnum = -1 |
|
let s:popup_timer = -1 |
|
let s:popup_delay = get(g:, 'vista_floating_delay', 100) |
|
|
|
function! s:ClosePopup() abort |
|
if exists('s:popup_winid') |
|
call popup_close(s:popup_winid) |
|
unlet s:popup_winid |
|
autocmd! VistaPopup |
|
endif |
|
let g:vista.popup_visible = v:false |
|
endfunction |
|
|
|
call prop_type_delete('VistaMatch') |
|
call prop_type_add('VistaMatch', { 'highlight': 'Search' }) |
|
|
|
function! s:HiTag() abort |
|
call prop_add(s:popup_lnum, s:popup_start+1, { 'length': s:popup_end - s:popup_start, 'type': 'VistaMatch' }) |
|
endfunction |
|
|
|
function! s:HiTagLine() abort |
|
if exists('w:vista_hi_cur_tag_id') |
|
call matchdelete(w:vista_hi_cur_tag_id) |
|
endif |
|
let w:vista_hi_cur_tag_id = matchaddpos('Search', [s:popup_lnum]) |
|
endfunction |
|
|
|
function! s:OpenPopup(lines) abort |
|
if g:vista_sidebar_position =~# 'right' |
|
let max_length = max(map(copy(a:lines), 'strlen(v:val)')) + 2 |
|
let pos_opts = { |
|
\ 'pos': 'botleft', |
|
\ 'line': 'cursor-2', |
|
\ 'col': 'cursor-'.max_length, |
|
\ 'moved': 'WORD', |
|
\ } |
|
else |
|
let winwidth = winwidth(0) |
|
let cur_length = strlen(getline('.')) |
|
let offset = min([cur_length + 4, winwidth]) |
|
let col = 'cursor+'.offset |
|
let pos_opts = { |
|
\ 'pos': 'botleft', |
|
\ 'line': 'cursor-2', |
|
\ 'col': col, |
|
\ 'moved': 'WORD', |
|
\ } |
|
endif |
|
|
|
if !exists('s:popup_winid') |
|
let s:popup_winid = popup_create(a:lines, pos_opts) |
|
let s:popup_bufnr = winbufnr(s:popup_winid) |
|
|
|
let filetype = getbufvar(g:vista.source.bufnr, '&ft') |
|
call win_execute(s:popup_winid, 'setlocal filetype='.filetype.' nofoldenable') |
|
else |
|
silent call deletebufline(s:popup_bufnr, 1, '$') |
|
call setbufline(s:popup_bufnr, 1, a:lines) |
|
call popup_show(s:popup_winid) |
|
call popup_move(s:popup_winid, pos_opts) |
|
endif |
|
|
|
augroup VistaPopup |
|
autocmd! |
|
autocmd CursorMoved <buffer> call s:ClosePopup() |
|
autocmd BufEnter,WinEnter,WinLeave * call s:ClosePopup() |
|
augroup END |
|
|
|
let g:vista.popup_visible = v:true |
|
endfunction |
|
|
|
function! s:DisplayRawAt(lnum, lines, vista_winid) abort |
|
if win_getid() != a:vista_winid |
|
return |
|
endif |
|
|
|
call s:OpenPopup(a:lines) |
|
endfunction |
|
|
|
function! s:DisplayAt(lnum, tag, vista_winid) abort |
|
if win_getid() != a:vista_winid |
|
return |
|
endif |
|
|
|
let [lines, s:popup_lnum] = vista#preview#GetLines(a:lnum) |
|
|
|
call s:OpenPopup(lines) |
|
|
|
let target_line = lines[s:popup_lnum - 1] |
|
try |
|
let [_, s:popup_start, s:popup_end] = matchstrpos(target_line, '\C'.a:tag) |
|
|
|
" Highlight the tag in the popup window if found. |
|
if s:popup_start > -1 |
|
call win_execute(s:popup_winid, 'call s:HiTag()') |
|
endif |
|
catch /^Vim\%((\a\+)\)\=:E869/ |
|
call win_execute(s:popup_winid, 'call s:HiTagLine()') |
|
endtry |
|
endfunction |
|
|
|
function! vista#popup#Close() abort |
|
call s:ClosePopup() |
|
endfunction |
|
|
|
function! s:DispatchDisplayer(Displayer, lnum, tag_or_raw_lines) abort |
|
if a:lnum == s:last_lnum |
|
\ || get(g:vista, 'popup_visible', v:false) |
|
return |
|
endif |
|
|
|
silent! call timer_stop(s:popup_timer) |
|
|
|
let s:last_lnum = a:lnum |
|
|
|
let win_id = win_getid() |
|
let s:popup_timer = timer_start( |
|
\ s:popup_delay, |
|
\ { -> a:Displayer(a:lnum, a:tag_or_raw_lines, win_id) } |
|
\ ) |
|
endfunction |
|
|
|
function! vista#popup#DisplayAt(lnum, tag) abort |
|
call s:DispatchDisplayer(function('s:DisplayAt'), a:lnum, a:tag) |
|
endfunction |
|
|
|
function! vista#popup#DisplayRawAt(lnum, lines) abort |
|
call s:DispatchDisplayer(function('s:DisplayRawAt'), a:lnum, a:lines) |
|
endfunction
|
|
|