如何在vim中获取光标下突出显示的组名?

时间:2012-02-27 12:14:25

标签: vim

我通常会定制现有的colorscheme以满足我的需求。

如果我可以在光标下获取语法组名称,它会对我有所帮助,就像Firebug但在Vim中一样。我想知道怎么做。

4 个答案:

答案 0 :(得分:19)

当我做同样的事情时,这个功能在网络上浮动:

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

答案 1 :(得分:10)

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

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

答案 2 :(得分: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
"}}}

答案 3 :(得分:0)

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