Vim中突出显示的类和函数名称


73

在迷上了模式输入后,我最近从Textmate设置了Vim环境。

但是,语法高亮在Vim中似乎并不那么漂亮。我使用C ++编写代码,由于无法突出显示函数调用和类名,因此代码更难阅读。我玩了一下配色方案,但是找不到对应于“类名”或“功能名”的任何字段。

在下面的图片中,请注意MacVim右侧的突出显示方式DroughtLayer::*.size()未突出显示的方式。

Textmate(左)和Vim(右)之间的图片比较
(来源:ivzhao.com

任何想法如何解决这个问题?我真是个视觉敏感的家伙,这真的让我很烦。


您的TextMate是在“ new”之后突出显示任何名称还是仅以某种方式声明的名称?
Mykola Golubyev 09年

不幸的是,vim所说的语法突出显示器通常只是一个可以匹配括号并知道基本上下文的词法分析器。C和CPP语法文件都是这种情况。您需要一个“真正的”解析器来处理这些情况……这意味着一些c.vim黑客行为;)
viraptor

我在#defines上发布了类似的问题:stackoverflow.com/questions/1512602/…。感谢您的指导/建议。我希望有一种方法可以像爱德华多(Eduardo)建议的很酷的答案那样突出显示这一点。
user183442

Answers:


16

有趣的是,VIM中的语法突出显示不支持将语法应用于标识符或函数名-至少不支持C和C ++的语法突出显示。因此,即使您这样做:

:hi Function guifg=red

要么

:hi Identifier guifg=red

它不会给这些颜色。我似乎只是这些语言的关键字和常量而已。

在这里,有人开始扩展cpp语法文件以支持方​​法名称。我猜这是一个开始。 http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition


1
问题是关于突出显示代码中的函数名称。
Mykola Golubyev 09年

132

当我开始使用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目录(对于UNIX,为“ $ HOME / .vim / syntax / c.vim”),并通过添加以下行对其进行编辑:

" Highlight Class and Function names
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 link cCustomFunc  Function
hi def link cCustomClass Function

而已!现在,函数和类名将以“函数”突出显示(“:hi Function”)中定义的颜色突出显示。如果要自定义颜色,可以将上面的最后两行更改为如下所示:

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00

或者,您可以不使用C语法文件,而在vimrc文件中定义颜色(“:help vimrc”):

hi cCustomFunc  gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00

(请注意,如果没有“ def”关键字,请转到“:help highlight-default”)。有关“:hi”命令的可用参数,请参见“:help:highlight”。

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

http://pastebin.com/f33aeab77

和强制性的屏幕截图:

在此处输入图片说明


3
抱歉,您应该是这个赏金的赢家。但是StackOverflow却自动选择了最高点。我们可以改变任何知识,以便您可以赚取200点(如果需要)。无论如何还是要谢谢。
ivanTheTerrible

14
您不需要复制c.vim。只需vimfiles/syntax/c.vim使用8行创建一个新的。
idbrii

非常好的解决方案。我已经采纳了。有没有人可以优化模式,使其仅在声明函数名称时才突出显示函数名称,而不是在每次调用时突出显示?
xApple

1
有什么(Sorry for imageshack)用 为什么不只是嵌入图像?
阿德里安

2
屏幕截图似乎已消失。您可以嵌入图片吗?
Greenonline

35

这是我在这里的第一篇文章,我不知道该如何观察,Eduardo的回答使“(”和“ {”看起来不完整,并且错误地折叠了foldind,为此我做了一些修改。

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

2
是的,它确实打破了折叠。这是正确的答案。
AyberkÖzgür2014年

1
使用stackoverflow.com/a/1819151/2716069可以使其变得更好。然后,cCustomParen不再需要它们,并且cCustomFunc变为"\w\+\ze\s*("(我相信使用此代码折叠仍然可以工作。)
Ragnar 2015年

我当前未使用Vi,但发现了这一点:vim.wikia.com/wiki/Syntax-based_folding
Janosimas 2015年

11

一种解决方案是使用内置的ctags数据库。因此,使用ctags实用程序创建一个。然后设置“标签”变量,并将以下内容放入

~/.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上也有一种解决方案,但是我没有尝试过。请让我知道这对你有没有用。


7

编辑:color_coded可能对您来说太重了。尝试octol / vim-cpp-enhanced-highlight。它支持C ++ 11/14,并集成了@Eduardo的答案。

基于语义的荧光笔:
我会推荐jeaye / color_coded,这是一个基于libclang的高亮显示的vim插件
。如果您想尝试一下,请去看看它的效果。:)

优点:

  • 简易安装
  • 语义突出显示
  • 如上所述的Clighter,需要使用vim编译python2.7。但是,color_coded用C ++编写,并提供lua绑定-> C ++。

缺点:

  • 除非您进行一些vim事件以将其延迟,否则它会延迟。
  • 定制有点困难;您需要自己编辑语法/color_coded.vim。但是自定义已放在其路线图上。

尽管它仍在开发中,但越来越受到关注。

之前 后


您能否提供一些代码/文档来说明为什么这是正确的答案?链接会随着时间而变化,这将使此答案错误。
rfornal 2015年

4

谢尔盖,将第一行从

syn match    cCustomParen    "(" contains=cParen,cCppParen

syn match    cCustomParen    "(" contains=cParen contains=cCppParen

似乎为我解决了。



1

使用插件(如Taglist)或与vim进行设置ctagscscope集成(是vim / cscope的教程)。


我已经安装了Taglist插件,但是它不是用于显示功能/方法轮廓,而不是突出显示/为文本着色吗?
ivanTheTerrible

@ivanTheTerrible:请仔细阅读FAQ(< vim-taglist.sourceforge.net/faq.html>)以及如何记录文档。
2009年

@Mykola Golubyev:我相信常见问题解答提到了如何到达那里。
2009年

2
@Dirkgently:a)链接断开。b)标签列表未突出显示源代码。
Mykola Golubyev 09年

1

我真的向您推荐该taghighlight插件,请单击此处访问其网站。


1

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

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

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


0

仅匹配C函数定义,这对我有用:

syn match    cCustomFuncDef display /\(\w\+\(\s\|*\)\+\)\@<=\w\+\s*(\@=/ 
hi def cCustomFuncDef ctermfg=lightblue
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.