突出显示VIM中的定义值

突出显示VIM中的定义值,vim,macros,syntax-highlighting,c-preprocessor,Vim,Macros,Syntax Highlighting,C Preprocessor,我在定义XYZ的头文件中突出显示了XYZ。但是,在使用XYZ时,XYZ不会高亮显示。我该如何解决这个问题 我附上了两个屏幕截图,请参见代码中的THU SYN,以澄清我的问题- 欢迎任何指针。我认为它是基于第一个指针的突出显示,因为它以define开头。第二个屏幕上没有任何类型的标记,vim可以使用它来决定是否需要高亮显示。Vim不像Eclipse那样进行深入的语法分析,它只是简单的词法分析。听起来您希望根据特定的常量名称等定制高亮显示。您可以使用CTAG或类似工具根据常量生成标记,然后让Vim高

我在定义XYZ的头文件中突出显示了XYZ。但是,在使用XYZ时,XYZ不会高亮显示。我该如何解决这个问题

我附上了两个屏幕截图,请参见代码中的THU SYN,以澄清我的问题-


欢迎任何指针。

我认为它是基于第一个指针的突出显示,因为它以define开头。第二个屏幕上没有任何类型的标记,vim可以使用它来决定是否需要高亮显示。Vim不像Eclipse那样进行深入的语法分析,它只是简单的词法分析。

听起来您希望根据特定的常量名称等定制高亮显示。您可以使用CTAG或类似工具根据常量生成标记,然后让Vim高亮显示结果

关于更多信息,ctags+vim上有很多帖子。例如,见


还有很多其他功能。

如果不使用标记荧光灯,没有内置的方式来突出显示定义。如果只想突出显示已定义的名称,而不是让完整标记高亮显示器的响应相对较慢,则可以修改标记高亮显示器以仅突出显示已定义的名称

如果您使用my,您可以修改mktypes.py,除非您使用的是Windows可执行版本,在这种情况下,请通过网站上的地址向我发送电子邮件,我将通过更改以下内容为您编译:

UsedTypes = [
            'ctags_c', 'ctags_d', 'ctags_e', 'ctags_f',
            'ctags_g', 'ctags_k', 'ctags_m', 'ctags_p',
            'ctags_s', 'ctags_t', 'ctags_u', 'ctags_v'
            ]
为此:

UsedTypes = ['ctags_d']
这将生成一个只包含已定义名称的类型突出显示文件,因此它应该运行得更快。如果您的项目中定义的名称太多,那么它仍然会使Vim慢一点

要仅突出显示当前文件中定义的已定义名称,请添加在读取文件后调用Vim函数的autocmd。函数应该类似于:

function! HighlightDefinedNames()
    " Clear any existing defined names
    syn clear DefinedName
    " Run through the whole file
    for l in getline('1','$')
        " Look for #define
        if l =~ '^\s*#\s*define\s\+'
            " Find the name part of the #define
            let name = substitute(l, '^\s*#\s*define\s\+\(\k\+\).*$', '\1', '')
            " Highlight it as DefinedName
            exe 'syn keyword DefinedName ' . name
        endif
    endfor
endfunction
syn match defined "[A-Z][A-Z0-9_]*" 
HiLink defined Type
您需要确保在配色方案中突出显示DefinedName,例如

hi DefinedName guifg=#ee82ee

假设您使用的是GUI。

我已经为Java常量静态决赛做了一个非常粗糙的方法,基于所有常量都是带下划线的大写。几乎没有其他标识符符合该标准

因此,一个非常简单、非常快速但并非100%准确的方法是将所有大写字母匹配到与您的定义相同的语法组

编辑。添加样本

在语言语法文件中,只需添加如下内容:

function! HighlightDefinedNames()
    " Clear any existing defined names
    syn clear DefinedName
    " Run through the whole file
    for l in getline('1','$')
        " Look for #define
        if l =~ '^\s*#\s*define\s\+'
            " Find the name part of the #define
            let name = substitute(l, '^\s*#\s*define\s\+\(\k\+\).*$', '\1', '')
            " Highlight it as DefinedName
            exe 'syn keyword DefinedName ' . name
        endif
    endfor
endfunction
syn match defined "[A-Z][A-Z0-9_]*" 
HiLink defined Type

您可以执行HiLink to Constant或任何您喜欢的已定义的突出显示组。

谢谢您的提示。我曾经尝试过基于ctags的Highlighter,但它们往往会使VIM变慢,因为我的标签文件很大。我正在寻找一些类似于这里提到的函数名的脚本-很好..你能告诉我我必须在我的.vimrc中输入哪些行来完成同样的任务吗?谢谢。一个更健壮的匹配是\v\W@,它只匹配不同的大写单词,而不是在一个小写字符串的中间。