class & function names highlighting in Vim

独自空忆成欢 提交于 2019-11-27 02:34:56

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

Eduardo

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 dunno 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:

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 

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.

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.

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.

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.)

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

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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!