|
|
|
|
" Copyright (c) 2019 Liu-Cheng Xu
|
|
|
|
|
" MIT License
|
|
|
|
|
" vim: ts=2 sw=2 sts=2 et
|
|
|
|
|
|
|
|
|
|
scriptencoding utf8
|
|
|
|
|
|
|
|
|
|
function! s:EchoScope(scope) abort
|
|
|
|
|
if g:vista#renderer#enable_icon
|
|
|
|
|
echohl Function | echo ' '.a:scope.': ' | echohl NONE
|
|
|
|
|
else
|
|
|
|
|
echohl Function | echo '['.a:scope.'] ' | echohl NONE
|
|
|
|
|
endif
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
function! s:TryParseAndEchoScope() abort
|
|
|
|
|
let linenr = vista#util#LowerIndentLineNr()
|
|
|
|
|
|
|
|
|
|
" Echo the scope of current tag if found
|
|
|
|
|
if linenr != 0
|
|
|
|
|
let scope = matchstr(getline(linenr), '\a\+$')
|
|
|
|
|
if !empty(scope)
|
|
|
|
|
call s:EchoScope(scope)
|
|
|
|
|
else
|
|
|
|
|
" For the kind renderer
|
|
|
|
|
let pieces = split(getline(linenr), ' ')
|
|
|
|
|
if !empty(pieces)
|
|
|
|
|
let scope = pieces[1]
|
|
|
|
|
call s:EchoScope(scope)
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
function! vista#echo#EchoScopeInCmdlineIsOk() abort
|
|
|
|
|
let cur_line = getline('.')
|
|
|
|
|
if cur_line[-1:] ==# ']'
|
|
|
|
|
let splitted = split(cur_line)
|
|
|
|
|
" Join the scope parts in case of they contains spaces, e.g., structure names
|
|
|
|
|
let scope = join(splitted[1:-2], ' ')
|
|
|
|
|
let cnt = matchstr(splitted[-1], '\d\+')
|
|
|
|
|
call s:EchoScope(scope)
|
|
|
|
|
echohl Keyword | echon cnt | echohl NONE
|
|
|
|
|
return v:true
|
|
|
|
|
endif
|
|
|
|
|
return v:false
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
function! s:EchoScopeFromCacheIsOk() abort
|
|
|
|
|
if has_key(g:vista, 'vlnum_cache')
|
|
|
|
|
" should exclude the first two lines and keep in mind that the 1-based and
|
|
|
|
|
" 0-based.
|
|
|
|
|
" This is really error prone.
|
|
|
|
|
let tagline = get(g:vista.vlnum_cache, line('.') - 3, '')
|
|
|
|
|
if !empty(tagline)
|
|
|
|
|
if has_key(tagline, 'scope')
|
|
|
|
|
call s:EchoScope(tagline.scope)
|
|
|
|
|
else
|
|
|
|
|
call s:EchoScope(tagline.kind)
|
|
|
|
|
endif
|
|
|
|
|
return v:true
|
|
|
|
|
endif
|
|
|
|
|
endif
|
|
|
|
|
return v:false
|
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
" Echo the tag with detailed info in the cmdline
|
|
|
|
|
" Try to echo the scope and then the tag.
|
|
|
|
|
function! vista#echo#EchoInCmdline(msg, tag) abort
|
|
|
|
|
let [msg, tag] = [a:msg, a:tag]
|
|
|
|
|
|
|
|
|
|
" Case II:\@ $R^2 \geq Q^3$ : paragraph:175
|
|
|
|
|
try
|
|
|
|
|
let start = stridx(msg, tag)
|
|
|
|
|
|
|
|
|
|
" If couldn't find the tag in the msg
|
|
|
|
|
if start == -1
|
|
|
|
|
echohl Function | echo msg | echohl NONE
|
|
|
|
|
return
|
|
|
|
|
endif
|
|
|
|
|
catch /^Vim\%((\a\+)\)\=:E869/
|
|
|
|
|
echohl Function | echo msg | echohl NONE
|
|
|
|
|
return
|
|
|
|
|
endtry
|
|
|
|
|
|
|
|
|
|
" Try highlighting the scope of current tag
|
|
|
|
|
if !s:EchoScopeFromCacheIsOk()
|
|
|
|
|
call s:TryParseAndEchoScope()
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
" if start is 0, msg[0:-1] will display the redundant whole msg.
|
|
|
|
|
if start != 0
|
|
|
|
|
echohl Statement | echon msg[0 : start-1] | echohl NONE
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
let end = start + strlen(tag)
|
|
|
|
|
echohl Search | echon msg[start : end-1] | echohl NONE
|
|
|
|
|
echohl Statement | echon msg[end : ] | echohl NONE
|
|
|
|
|
endfunction
|