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

iva*_*ble 68 c++ vim textmate syntax-highlighting vim-syntax-highlighting

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

但是,在Vim中,语法高亮似乎并不那么美观.我用C++编写代码,因为函数调用和类名不能突出显示,所以代码更难以阅读.我玩了一些配色方案,但找不到任何对应"类名"或"功能名称"的字段.

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

Textmate(左)和Vim(右)之间的图片比较http://ivzhao.com/temp/vimHL.png

任何想法如何解决这个问题?它真的让我烦恼,因为我是一个视觉敏感的家伙.

小智 122

当我开始使用vim时,我遇到了同样的问题.解决方案很简单,你只需要编辑vim使用的c语法文件,这里是如何做到的:

当您开始编辑C或C++文件时,vim会读取位于的默认c语法文件

$VIMRUNTIME/syntax/c.vim
Run Code Online (Sandbox Code Playgroud)

(其中$ VIMRUNTIME是你安装vim的地方.你可以通过打开vim并使用命令":echo $ VIMRUNTIME"找到它的默认值.)

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

$HOME/.vim/syntax/c.vim      (for UNIX)
$HOME/vimfiles/syntax/c.vim  (for PC or OS/2)
Run Code Online (Sandbox Code Playgroud)

(我从未使用过Mac,所以我不知道哪一个适合你.你可以在vim帮助中找到更多信息,":帮助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
Run Code Online (Sandbox Code Playgroud)

而已!现在,将使用"功能"高亮显示的颜色(":hi功能")突出显示功能和类名称.如果要自定义颜色,可以将上面的最后两行更改为以下内容:

hi def cCustomFunc  gui=bold guifg=yellowgreen
hi def cCustomClass gui=reverse guifg=#00FF00
Run Code Online (Sandbox Code Playgroud)

或者您可以单独保留C语法文件并在vimrc文件中定义颜色(":help vimrc"):

hi cCustomFunc  gui=bold guifg=yellowgreen
hi cCustomClass gui=reverse guifg=#00FF00
Run Code Online (Sandbox Code Playgroud)

(注意缺少"def"关键字,请转到":help highlight-default"了解详细信息).有关":hi"命令的可用参数,请参阅":help:highlight".

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

http://pastebin.com/f33aeab77

强制截图:

http://img16.imageshack.us/img16/2073/vimy.png(对不起imageshack)

  • 您不需要复制c.vim.只需使用8行创建一个新的`vimfiles/syntax/c.vim`. (14认同)
  • 对不起,你应该是这个赏金的赢家.但StackOverflow有些如何自动选择最高点一个.我们可以改变任何知识,这样你就可以获得200分(如果你想要的话).无论如何,非常感谢. (2认同)
  • 屏幕截图似乎已消失。您可以嵌入图片吗? (2认同)

Jan*_*mas 33

这是我在这里的第一篇文章,我不知道如何进行观察,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
Run Code Online (Sandbox Code Playgroud)

  • 是的,它确实打破了折叠。这是正确答案。 (2认同)

tho*_*ter 17

有趣的是,VIM中的语法高亮显示器不支持将语法应用于标识符或函数名称 - 至少不支持C和C++的语法高亮显示.所以,即使你这样做:

:hi Function guifg=red
Run Code Online (Sandbox Code Playgroud)

要么

:hi Identifier guifg=red
Run Code Online (Sandbox Code Playgroud)

它没有给这些颜色.我似乎只是这些语言的关键字和常量.

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


Myk*_*yev 10

一种解决方案是使用内置的ctags数据库.所以用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()
Run Code Online (Sandbox Code Playgroud)

我必须警告你,这对于非常大的ctags数据库来说非常慢.

vim.org上也有一个解决方案,但我没试过这个.请让我知道这对你有没有用.


Cha*_*les 7

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

基于语义的荧光笔:
我会推荐jeaye/color_coded,一个用于基于libclang的突出显示的vim插件
很抱歉,我是stackoverflow的新手,这意味着我没有足够的声誉来发布图像.如果你想试一试,去看它的效果.:)

优点:

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

缺点:

  • 除非你做一些vim事件来解决它,否则它会延迟.
  • 定制有点难; 你需要自己编辑syntax/color_coded.vim.但是定制已经放在其路线图上.

虽然它仍在开发中,但它越来越受到关注.

之前 后