C++ 类别及;在Vim中突出显示函数名

C++ 类别及;在Vim中突出显示函数名,c++,vim,syntax-highlighting,textmate,vim-syntax-highlighting,C++,Vim,Syntax Highlighting,Textmate,Vim Syntax Highlighting,我最近刚从Textmate设置了我的Vim环境,在沉迷于它的模式输入之后 然而,在Vim中,语法高亮显示似乎不那么漂亮。我在C++中编码,因为函数调用和类名不能突出显示,所以代码更难阅读。我玩了一会儿配色方案,但找不到任何与“类名”或“函数名”对应的字段 在下图中,请注意在MacVim中,DroughtLayer::和*.size()在右侧没有突出显示 (来源:) 有什么办法解决这个问题吗?这真的让我很恼火,因为我是一个视觉敏感的家伙。使用类似vim的插件,或者设置ctags或cscope与v

我最近刚从Textmate设置了我的Vim环境,在沉迷于它的模式输入之后

然而,在Vim中,语法高亮显示似乎不那么漂亮。我在C++中编码,因为函数调用和类名不能突出显示,所以代码更难阅读。我玩了一会儿配色方案,但找不到任何与“类名”或“函数名”对应的字段

在下图中,请注意在MacVim中,
DroughtLayer::
*.size()
在右侧没有突出显示


(来源:)


有什么办法解决这个问题吗?这真的让我很恼火,因为我是一个视觉敏感的家伙。

使用类似vim的插件,或者设置
ctags
cscope
与vim的集成(vim/cscope的教程)。

有趣的是,VIM中的语法高亮者不支持将语法应用到标识符或函数名——至少不是C和C++的语法高亮者。因此,即使你这样做:

:hi Function guifg=red

它没有给这些颜色。对于这些语言,我似乎只不过是关键字和常量

这里,有人已经开始扩展cpp语法文件以支持方法名。我想这是个开始。
一个解决方案是使用内置的ctags数据库。所以用这个工具创建一个。然后设置“tags”变量并将以下内容放入

~/.vim/after/syntax/c.vim

function! s:highlight()
    let list = taglist('.*')

    for item in list
        let kind = item.kind

        if kind == 'f' || kind == 'c'
            let name = item.name
            exec 'syntax keyword Identifier '.name
        endif
    endfor
endfunction

call s:highlight()
我必须警告您,在非常大的ctags数据库上,这可能会非常慢


vim.org上也有,但我没有试过这个。让我知道它是否适合您。

当我开始使用vim时,我也遇到了同样的问题。解决方案很简单,您只需编辑vim使用的c语法文件,下面介绍如何操作:

<>当您开始编辑C或C++文件时,VIM读取位于

中的默认C语法文件
$VIMRUNTIME/syntax/c.vim
(其中$VIMRUNTIME是安装vim的地方。您可以通过打开vim并使用命令“:echo$VIMRUNTIME”找到它的默认值)

您可以简单地覆盖该文件,也可以在以下位置创建自定义C语法文件(将由vim加载,而不是默认文件):

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)
(我从未使用过Mac,所以我不知道哪一款适合您。您可以在vim帮助中找到更多信息,“:help vimfiles”)

现在是有趣的部分。将默认的“$VIMRUNTIME/syntax/c.vim”文件复制到您的vimfiles目录($HOME/.vim/syntax/c.vim),并通过添加以下行对其进行编辑:

就这样!现在,函数和类名将以“Function”高亮显示(“:hi Function”)中定义的颜色高亮显示。如果要自定义颜色,可以将上面最后两行更改为以下内容:

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00
或者,您可以不使用C语法文件,在vimrc文件中定义颜色(“:help vimrc”):

(注意没有“def”关键字,请转到:help highlight default以了解详细信息)。有关“:hi”命令的可用参数,请参阅“:help:highlight”

您可以在此链接上找到vim 7.2的完整c.vim文件(注意:只有在您有未修改的vim 7.2版本时才使用此文件):

还有强制性的屏幕截图:


谢尔盖,把第一行从

syn match    cCustomParen    "(" contains=cParen,cCppParen

似乎为我解决了它。

尝试使用此插件
这是我在这里的第一篇文章,我不知道如何进行观察,Eduardo的回答使“(“{”看起来不匹配,错误语法折叠,我对它做了一点修改来解决这个问题

syn match    cCustomParen    "?=(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(\@=" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope
hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def link cCustomClass Function

我真的向你推荐了
标记highlight
插件,点击它的网站。

该插件也可以考虑,这是一个

plugin for c-family semantic source code highlighting, based on Clang

但是,需要相当新的版本和软件:
vim 7.4.330+python2
libclang

编辑:颜色编码对您来说可能太重了。试试看。它支持C++11/14并集成了@Eduardo的答案。

基于语义的荧光灯:
我建议,, 用于基于libclang的高亮显示的vim插件
很抱歉,我是stackoverflow新手,这意味着我没有足够的声誉来发布图片。如果你想试一试的话,去看看它的效果。:)

优点:

  • 易于安装
  • 语义突出显示
  • 如上所述,Clighter需要使用
    python2.7
    编译vim。 但是,CuleXOLL代码是用C++编写的,提供了Lua绑定-> C++,
缺点:

  • 它会延迟,除非你做一些vim事件来激活它
  • 定制有点困难;您需要编辑syntax/color_coded.vim 但是定制已经被放在了它的路线图上
虽然它仍在开发中,但越来越受到关注


为了只匹配C函数定义,这对我来说很有用:

syn match    cCustomFuncDef display /\(\w\+\(\s\|*\)\+\)\@<=\w\+\s*(\@=/ 
hi def cCustomFuncDef ctermfg=lightblue

syn match cCustomFuncDef display/\(\w\+\(\s\\\*\)\+\@我已经安装了标记列表插件,但它不是用来显示函数/方法大纲而不是突出显示/着色文本的吗?@ivantherible:请浏览常见问题解答(@Mykola Golubyev:FAQ提到了我相信如何到达那里。@Dirkgently:a)链接已断开。b)标记列表不突出显示源代码。您的TextMate是否突出显示“new”之后的任何名称,或仅突出显示以某种方式声明的名称?不幸的是,vim所称的语法高亮显示器通常只是一个可以匹配括号并了解基本上下文的lexer。这是C和CPP语法文件的情况。您需要一个“real”解析器来处理这些情况…这意味着一些c.vim黑客;)我在这里的#defines上发布了一个类似的问题:。非常感谢您的指点/建议。我希望有一种方法可以像Eduardo建议的酷答案那样突出显示这一点。使STL语法更漂亮。这个问题是关于在代码中突出显示函数名。很抱歉,您这样做了本应是这次赏金的赢家。但是斯塔克·沃夫告诉我,为什么自动选择了最高点。有什么知识吗
syn match    cCustomParen    "(" contains=cParen contains=cCppParen
syn match    cCustomParen    "?=(" contains=cParen,cCppParen
syn match    cCustomFunc     "\w\+\s*(\@=" contains=cCustomParen
syn match    cCustomScope    "::"
syn match    cCustomClass    "\w\+\s*::" contains=cCustomScope
hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def link cCustomClass Function
plugin for c-family semantic source code highlighting, based on Clang
syn match    cCustomFuncDef display /\(\w\+\(\s\|*\)\+\)\@<=\w\+\s*(\@=/ 
hi def cCustomFuncDef ctermfg=lightblue