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

问题描述:

我通常会定制现有的colorscheme以满足我的需求。如何获取vim中光标下高亮显示的组名?

如果我能得到光标下的语法组名称,它会帮助我很多,就像Firebug,但在Vim中。我想知道如何去做。

有此功能是在网络上漂浮时,我在做同样的事情:

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

谢谢。帮助我很多。 – kev 2012-02-27 12:43:08

+0

如果你在这里,因为你想诊断大量的红色突出显示,这是[由于拼写检查](http://*.com/questions/28647994/annoying-red-highlighting-of-random-words-in- vim)和SynStack()似乎没有检测到,由于某种原因。 – Von 2016-05-05 03:38:07

试试这个:

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

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

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 
+0

我发现这比接受的答案要好得多,因为当我试图弄清楚我想要改变什么时,它通常可以帮助我通过一个或多个“链接”突出显示条目。 – 2017-12-28 11:48:49