在vim中找出特定关键字/符号属于哪个高亮组

20

我从TextMate转换到Vim,想要自定义我的vim配色方案。如果能知道特定单词或符号属于哪个高亮显示组,那将非常有帮助。在TextMate中,我会把光标放在所需的单词/符号上,然后按下ctrl-shift-p,就会看到一个工具提示,显示类似于以下内容:

text.html.basic
meta.tag.structure.any.html
string.quoted.double.html

通过这些信息,很容易编辑TextMate颜色主题以应用(或删除)相应文本的格式。

在Vim中,如果我想为某个单词或符号更改格式,我不确定从何处开始。是否有类似于TextMate的ctrl-shift-p的功能呢?

3个回答

23
我不确定我是否理解正确,但你是否在寻找这个?
" adds to statusline
set laststatus=2
set statusline+=%{synIDattr(synID(line('.'),col('.'),1),'name')}

" a little more informative version of the above
nmap <Leader>sI :call <SID>SynStack()<CR>

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

我只做了一个改变:为了保持一致性,将命令映射到ctrl-shift-p。 nmap <C-S-P> :call <SID>SynStack()<CR> - nelstrom

20

获取有关代码高亮的大量信息的另一种方法:

map <F3> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" . " FG:" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"fg#")<CR>

如果我在C文件中移动到一条注释并按下F3,则会得到:

hi<cCommentStart> trans<cCommentStart> lo<Comment> FG:#00ff00

这表明它属于高亮显示组cCommentStart,该组与Comment相关联并以绿色(#00ff00)着色。 这是从这里修改而来,请参见该页面获取更多信息。


这太棒了。我觉得这比简单的“hi”标识符更有帮助。 - mybuddymichael

4

更新: 从:help synID()(见示例):

synID({line}, {col}, {trans})                           *synID()*
                返回一个数字,它是当前窗口中{line}和{col}位置的语法ID。
                可以使用|synIDattr()| 和 |synIDtrans()|获取文本的语法信息。
                对于最左侧的列,{col}为1,对于第一行,{line}为1。
                当{trans}非零时,透明项将被减少到它们揭示的项。这在想要知道有效颜色时很有用。
                当{trans}为零时,返回透明项。这在想要了解哪个语法项有效(例如在括号内部)时很有用。
                警告:此函数可能非常缓慢。通过正向遍历文件可以获得最佳速度。
示例(回显光标下的语法项名称): :echo synIDattr(synID(line("."), col("."), 1), "name")

据我所知,你能做的最好的就是使用:syntax命令,它会给出当前文件加载的所有语法列表。我不知道是否有任何方法提供当前缓冲区的语法分析。

请注意,:syntax仅定义语法项,:highlight命令的使用才会给语法项着色。

一旦决定要进行的更改,请将它们放在~/.vim/after/syntax/<filetype>.vim中。这将在加载默认语法文件之后应用更改。


Vim的帮助文档非常出色,但是没有你的帮助,我无法找到关于synID的信息。谢谢。此外,关于通过将语法文件放入“after”目录来覆盖语法文件的提示非常感谢。 - nelstrom
通过 "help vimfiles",您可以查看哪些目录具有优先权(\after 部分)。@nelstrom - Rook
@nelstrom - 查看相关帮助主题的快速方法是使用CTRL-D键,以查看在输入“:help syn”时可能的自动补全选项——这将显示与字符串“syn”匹配的所有帮助主题,这也是我如何找到“synID()”。 - rampion
如何还原“一旦您决定要进行哪些更改,请将它们放在〜/ .vim / after / syntax / <filetype> .vim中。”?如果我注释掉这些更改,那么突出显示会被“清除”,而不是仅还原为保留原始插件配色方案 - Xopi García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接