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

kev*_*kev 12 vim

我经常定制现有的colorscheme以满足我的需求.

如果我可以在光标下获得语法组名称,它会帮助我很多,就像Firebug但在Vim中.我想知道怎么做.

rom*_*inl 21

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

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

  • 如果您在这里是因为尝试诊断大量红色突出显示,那是[由于拼写检查](http://stackoverflow.com/questions/28647994/annoying-red-highlighting-of-random-words-in-vim )并且 SynStack() 由于某种原因似乎没有检测到这一点。 (2认同)

Lau*_*ves 11

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

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

为了使这更方便,它可以包装在自定义命令或键绑定中.

这是如何工作的:

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

这将回应如下:

vimMapModKey -> Special
Run Code Online (Sandbox Code Playgroud)

  • 我发现这比接受的答案要好得多,因为当我试图找出我想要更改的内容时,它通常可以节省我通过一个或多个“指向”突出显示条目的链接。 (2认同)

Jak*_*ake 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>
Run Code Online (Sandbox Code Playgroud)