我在Fedora和Win7上都安装了gvim。我发现Fedora上的vim和gvim都没有突出显示c代码中的函数名称,而win7上的gvim突出了它。

我发现在win7上,vim73/syntax/c.vim在末尾还有其他行:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF


如果我将这些行添加到Fedora的c.vim中,gvim也可以突出显示函数名称。

为了保持可移植性,我只想修改.vimrc以突出显示函数名称。但是,将这些行添加到.vimrc后,它不起作用。

那么,有人可以帮助我吗?我进行了搜索,找到了许多解决方案来突出显示vim中的函数名称。但是我只是好奇如何使这些行在.vimrc中起作用。非常感谢!

评论

尝试将其添加到〜/ .vim / after / syntax / c.vim中。

@muru是的,它有效。但是如何将其添加到.vimrc?

您可能必须使用autocmd BufEnter * .c hl ...之类的东西,但应将其保留在after / syntax / c.vim中。任何现代版本的Vim都可以理解.vim / after /目录。在Windows上,路径为vimfiles / after / ...,因此可移植性不是什么大问题(特别是如果您使用任何插件)。

#1 楼


但是,将这些行添加到.vimrc中后,它不起作用。


原因是Vim设置'syntax'选项时会清除现有的语法项。这样做是因为保留旧的语法项会导致一些奇怪的情况。如果您有一个带有syntax=foo并使用set syntax=bar的缓冲区,那么您将得到一个带有同时突出显示foobar语法的缓冲区。

当Vim启动时,它一次加载vimrc(在启动时) ,但是每次设置filetypesyntax选项时,它都会加载文件类型和语法文件,这将重置您在vimrc中设置的值。

即使不重置它,它也会仅将其添加到vimrc中不是一个好主意,因为它将应用于所有缓冲区,而不仅适用于syntax=c的缓冲区。


以下文本假定在Unix上使用Vim -y系统,但也适用于Neovim和Windows用户:



Neovim用户应将~/.vim/替换为~/.config/nvim/

Windows用户应该用~/.vim/替换%USERPROFILE%\vimfiles\

覆盖整个文件

更改某些内容的最简单方法是覆盖它。为此,请在~/.vim/<file>.vim中创建一个文件。

<file.vim>是相对于$VIMRUNTIME(包括子目录)的路径。在您的示例中,应为syntax/c.vim。它将被加载,而不是$VIMRUNTIME中的文件。

其结果是,它更易于更改-修改现有的语法文件有时会有些棘手。缺点是您将来不会对系统范围的文件进行任何更新。

我经常以此为起点来尝试语法文件,然后将本地更改提取到使用以下描述的方法之一进行本地加法。

本地加法

有两种方法可以将本地添加内容添加到语法文件中,它们在功能上是相同的,您可以使用自己喜欢的方法。


Syntax autocmd

使用Syntax autocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end


请注意,在这里将多个命令与|链接是有问题的,因为它们往往被解释为:syn命令的一部分,这就是为什么我重复autocmd Syntax c几次。一种替代方法是使用以下函数:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end


优点是所有更改都可以包含在单个文件中。缺点是它有点难看,尤其是如果您进行了很多更改。

目录后

使用后目录:~/.vim/after/<file>.vim

这将在<file>.vim具有之后加载,其中<file.vim>是相对于$VIMRUNTIME的路径(包括子目录)。在您的示例中,它应该是syntax/c.vim

另请参见:help after-directory

优点是它比autocmd更具可读性,尤其是在您进行许多更改的情况下。缺点是,如果要将Vim设置镜像到其他计算机,则需要复制其他文件(这是很多人将其Vim文件保存在GitHub存储库中的重要原因,因此可以轻松地在多个计算机之间镜像)。