当我做同样的事情时,网上流传着这个功能:
function! SynStack()
if !exists("*synstack")
return
endif
echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
以下函数将输出语法组的名称以及光标所在字符的翻译语法组:
function! SynGroup()
let l:s = synID(line('.'), col('.'), 1)
echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun
为了使其更方便,可以将其包装在自定义命令或键绑定中。
这是如何运作的:
line('.')
和 col('.')
返回当前位置synID(...)
返回数字语法IDsynIDtrans(l:s)
通过以下突出显示链接来翻译数字语法 id l:s
synIDattr(l:s, 'name')
返回与数字语法ID对应的名称这将回显如下内容:
vimMapModKey -> Special
这是一个映射,它将显示 synstack() 的层次结构并显示突出显示的链接。按gm即可使用。
function! SynStack ()
for i1 in synstack(line("."), col("."))
let i2 = synIDtrans(i1)
let n1 = synIDattr(i1, "name")
let n2 = synIDattr(i2, "name")
echo n1 "->" n2
endfor
endfunction
map gm :call SynStack()<CR>
试试这个:
" diagnostics {{{
if has('balloon_eval')
nnoremap <F12> : setl beval!<CR>
set bexpr=InspectSynHL()
endif
fun! InspectSynHL()
let l:synNames = []
let l:idx = 0
for id in synstack(v:beval_lnum, v:beval_col)
call add(l:synNames, printf('%s%s', repeat(' ', idx), synIDattr(id, 'name')))
let l:idx+=1
endfor
return join(l:synNames, "\n")
endfun
"}}}
如果您需要一个 1 行命令,请按
:
然后粘贴
let s = synID(line('.'), col('.'), 1) | echo synIDattr(s, 'name') . ' -> ' . synIDattr(synIDtrans(s), 'name')