繁体   English   中英

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

[英]How to get group name of highlighting under cursor in vim?

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

如果我能在 cursor 下获得语法组名称,它将对我有很大帮助,就像Firebug但在 Vim 中一样。 我想知道怎么做。

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

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(...)返回数字语法ID
  • synIDtrans(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
"}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM