如何获取vim中光标下高亮的组名?

问题描述 投票:0回答:5

我通常会定制现有的

colorscheme
来满足我的需求。

如果我能得到光标下的语法组名称,这会对我有很大帮助,就像 Vim 中的 Firebug 一样。我想知道怎么做。

vim
5个回答
50
投票

当我做同样的事情时,网上流传着这个功能:

function! SynStack()
  if !exists("*synstack")
    return
  endif
  echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc

36
投票

以下函数将输出语法组的名称以及光标所在字符的翻译语法组:

function! SynGroup()
    let l:s = synID(line('.'), col('.'), 1)
    echo synIDattr(l:s, 'name') . ' -> ' . synIDattr(synIDtrans(l:s), 'name')
endfun

为了使其更方便,可以将其包装在自定义命令或键绑定中。

这是如何运作的:

  • line('.')
    col('.')
    返回当前位置
  • synID(...)
    返回数字语法ID
  • synIDtrans(l:s)
    通过以下突出显示链接来翻译数字语法 id
    l:s
  • synIDattr(l:s, 'name')
    返回与数字语法ID对应的名称

这将回显如下内容:

vimMapModKey -> Special

9
投票

这是一个映射,它将显示 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>

0
投票

试试这个:

" 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
"}}}

0
投票

如果您需要一个 1 行命令,请按

:
然后粘贴

let s = synID(line('.'), col('.'), 1) | echo synIDattr(s, 'name') . ' -> ' . synIDattr(synIDtrans(s), 'name')

(来源:https://stackoverflow.com/a/36993989/2574612

© www.soinside.com 2019 - 2024. All rights reserved.