" 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