突出显示VIM中的#defined值

时间:2009-10-03 02:16:59

标签: vim macros syntax-highlighting c-preprocessor

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

我附上两个屏幕截图(请参阅代码中的TH_SYN)以澄清我的问题 -

link text

欢迎提出任何指示。

4 个答案:

答案 0 :(得分:4)

没有内置的方法可以在不使用标签荧光笔的情况下突出显示定义。如果您只想突出显示定义的名称(而不是使用完整标签突出显示器的相对较慢的响应),您可以修改标签突出显示器以仅突出显示已定义的名称。

如果您使用我的tag highlighter,您可以修改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

您需要确保在colourscheme中突出显示DefinedName,例如

hi DefinedName guifg=#ee82ee

(假设您正在使用GUI)。

答案 1 :(得分:3)

我已经为Java常量(静态终结)做了一个非常粗略的方法,基于所有常量都是带有下划线的事实。几乎没有其他标识符符合该标准。

因此,将所有大写字母与您定义的语法组匹配,非常简单,非常快,但不是100%准确。

编辑。添加样本

在您的语言语法文件中添加如下内容:

syn match defined "[A-Z][A-Z0-9_]*" 
HiLink defined Type

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

答案 2 :(得分:0)

我认为这是以第一个为亮点,因为它以“#define”开头。第二个没有任何标记,vim可以用它来决定是否需要突出显示。 Vim没有像Eclipse那样做深度语法分析,它只是简单的lexing。

答案 3 :(得分:0)

听起来你想要根据特定的常量名称等进行自定义突出显示。你可以使用ctags或类似的方法根据你的常量生成标签,然后让vim突出显示结果。

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

Vim and Ctags tips and tricks Vim auto-generate ctags

还有很多其他人。