Dotfiles.
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.

99 lines
2.6 KiB

4 years ago
" 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