在 Vim 中突出显示类和函数名

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

然而,语法突显似乎不是那么美丽的 Vim。我用 C + + 编写代码,由于不能突出显示函数调用和类名,所以代码更难读。我尝试了一下配色方案,但是找不到任何与“类名”或“函数名”对应的字段。

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

Picture comparison between Textmate(left) and Vim(right)
(来源: Ivzao.com)

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

63438 次浏览

Use a plug-in for vim like Taglist or set up ctags or cscope integration with vim (here's a tutorial for the vim/cscope.)

Interestingly, the syntax highlighters in VIM don't support applying a syntax to identifiers or function names - at least not the syntax highlighters for C and C++. So, even if you do:

:hi Function guifg=red

or

:hi Identifier guifg=red

it doesn't give these a color. I just seems to be not much more than keywords and constants for these languages.

Here, someone has started extending the cpp syntax file to support method names. It's a start I guess. http://vim.wikia.com/wiki/Highlighting_of_method_names_in_the_definition

The one solution is to use built ctags database. So create one with the ctags utility. Then set the 'tags' variable and put the following to the

~/.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()

I must warn you that this can work very slow on the very big ctags database.

Also there is one solution on the vim.org but I didn't try this one. Let me know if it works for you.

I had this very same problem when I started using vim. The solution is simple, you just have to edit the c syntax file used by vim, here's how to do it:

When you start editing a C or C++ file, vim reads the default c syntax file located in

$VIMRUNTIME/syntax/c.vim

(Where $VIMRUNTIME is where you have vim installed. You can find out it's default value by opening vim and using the command ":echo $VIMRUNTIME").

You can simply overwrite that file, or you can create your custom C syntax file (which will be loaded by vim instead of the default one) in this location:

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)

(I have never used a Mac so I don't know which one will work for you. You can find out more in the vim help, ":help vimfiles")

Now the fun part. Copy the default "$VIMRUNTIME/syntax/c.vim" file to your vimfiles directory ("$HOME/.vim/syntax/c.vim" for UNIX), and edit it by adding these lines:

" 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

That's it! Now functions and class names will be highlighted with the color defined in the "Function" highlight (":hi Function"). If you want to customize colors, you can change the last two lines above to something like this:

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

or you can leave the C syntax file alone and define colors in your vimrc file (":help vimrc"):

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

(Note the absence of the "def" keyword, go to ":help highlight-default" for details). For the available parameters to the ":hi" command see ":help :highlight".

You can find the complete c.vim file for Vim 7.2 on this link (Note: only use this if you have a non-modified Vim, version 7.2):

http://pastebin.com/f33aeab77

And the obligatory screenshot:

enter image description here

Sergey, changing the first line from

syn match    cCustomParen    "(" contains=cParen,cCppParen

to

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

seems to fix it for me.

Try using this plugin http://www.vim.org/scripts/script.php?script_id=2646 Its does all ctags highlighting very efficiently for you

this is my first post here and i didn't know how to make an observation, the answer of Eduardo makes "(" and "{" look unmached and bugs syntax foldind, I changed it a little to fix this.

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

I really recommend you the taghighlight plugin, click here for it's website.

The Clighter plugin can also be considered, which is a

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

However, requires fairly recent versions and software: vim 7.4.330 +python2 and libclang.

EDIT: color_coded may be too heavy for you. try octol/vim-cpp-enhanced-highlight. It supports C++11/14 and integrates what @Eduardo answers.

Semantic based highlighter:
I would recommend jeaye/color_coded, A vim plugin for libclang-based highlighting
So sorry that i'm new to stackoverflow which means I've not enough reputation to post images. Go see its effects if you wanna give it a shot. :)

Pros:

  • Easy installation
  • Semantic highlighting
  • Clighter mentioned as above, need vim compiled with python2.7. However, color_coded is written in C++ and provides lua binding -> C++.

Cons:

  • It delays unless you make some vim events to acitve it.
  • Customization is bit harder; you need to edit syntax/color_coded.vim yourself. But customization has been placed on its roadmap.

Although it's still under development, it's increasingly gaining attention.

before after

To match C functions definitions only, this works for me:

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