首页 > 解决方案 > 在 Vim 中以不同方式突出显示 C/C++ 函数声明和函数调用

问题描述

我习惯了 Sublime Text 突出显示函数声明与函数调用的方式,并试图用 Vim 模拟类似的东西。有一些帖子解决了这样的问题,但它们似乎以相同的方式突出声明和调用。

int function1() {
    function3();
}

int function2()
{
 ...
}

在这里,function1 和 function2 应该是一种颜色,而 function3 应该是另一种颜色。我正在尝试编写正则表达式来匹配每种情况,然后从那里开始。

到目前为止,我想出了

syn match cFunDecl "\zs\w\+\ze(.*){"
syn match cFunCall "\zs\w\+\ze(.*);"

这些似乎真的不起作用。按照这种方法,我还希望在头文件中遇到声明被突出显示为调用的问题,但可能会在稍后处理。

标签: vimsyntax-highlighting

解决方案


Neovimnvim-treesitter可以做到这一点。我会注意到,使用诸如vim-lsp-cxx-highlight 之类的 LSP 插件可能也有可能,但我发现使用这些插件是一场噩梦。

首先,您要创建一个 nvim-treesitter 的分支。原因是,目前,c模块中的函数调用和声明都以相同的方式突出显示。不过,这真的很容易改变。在你的叉子中,转到queries/c/highlights.scm. 在文件的下部,您应该会看到如下内容:

(function_declarator
  declarator: (identifier) @function)

@function位指定要使用的颜色。如果将其替换为其他内容,则可以获得不同的突出显示。您可以在CONTRIBUTING.md中找到可用捕获的列表。比如我刚用过@number,所以我把上面的代码改成这样:

(function_declarator
  declarator: (identifier) @number)

然后,您可以照常从您的 fork 安装 nvim-treesitter。对我来说,这意味着:

  • 将此添加到我的~/.vimrc
    Plug 'vladh/nvim-treesitter', {'do': ':TSUpdate'}
    
    lua <<EOF
      require'nvim-treesitter.configs'.setup {
        highlight = { enable = true },
      }
    EOF
    
  • :PlugInstall
  • :TSInstall c cpp

如果一切正常,您的函数声明现在应该以不同的方式突出显示!我也真的很想要这个功能,幸运的是 nvim-treesitter 现在似乎足够稳定,可以轻松做到这一点。


推荐阅读