找出vim中特定关键字/符号所属的突出显示组

时间:2009-09-23 17:17:50

标签: vim themes textmate

我是从TextMate来到Vim,我想自定义我的vim colorscheme。如果我能找出任何特定的单词或符号属于哪个突出显示组,那将是非常有用的。在TextMate中,我会将插入符号放在有问题的单词/符号上,然后点击ctrl-shift-p,工具提示会出现如下内容:

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

根据这些信息,编辑TextMate颜色主题以将格式应用(或删除)到相关文本非常简单。

在Vim中,如果我想更改某个单词或符号的格式,我不知道从哪里开始。有没有相当于TextMate的ctrl-shift-p?

3 个答案:

答案 0 :(得分:22)

我不确定我理解得对,但你在找这个吗?

" 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

答案 1 :(得分:13)

获取有关突出显示的大量信息的另一种方法:

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)着色。这是(修改)here,请参阅该页面以获取更多信息。

答案 2 :(得分:3)

更新:来自:help synID()(参见示例):

synID({line}, {col}, {trans})                           *synID()*
                The result is a Number, which is the syntax ID at the position
                {line} and {col} in the current window.
                The syntax ID can be used with |synIDattr()| and
                |synIDtrans()| to obtain syntax information about text.
                {col} is 1 for the leftmost column, {line} is 1 for the first
                line.
                When {trans} is non-zero, transparent items are reduced to the
                item that they reveal.  This is useful when wanting to know
                the effective color.  When {trans} is zero, the transparent
                item is returned.  This is useful when wanting to know which
                syntax item is effective (e.g. inside parens).
                Warning: This function can be very slow.  Best speed is
                obtained by going through the file in forward direction.

                Example (echoes the name of the syntax item under the cursor):  
                        :echo synIDattr(synID(line("."), col("."), 1), "name")

据我所知,您可以做的最好的事情是:syntax,它会为您提供当前文件加载的所有语法的列表。我不知道任何可以对当前缓冲区进行语法分析的内容。

请注意,:syntax只定义语法项,它使用:highlight命令为语法项提供着色。

确定要进行的更改后,请将其放入~/.vim/after/syntax/<filetype>.vim。这些将在加载默认语法文件后应用您的更改。