如何在本地vimrc中添加其他语法突出显示规则?


11

我在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

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

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

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


5
尝试将其添加到~/.vim/after/syntax/c.vim
muru 2015年

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

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

Answers:


14

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

原因是Vim在设置'syntax'选项时清除了现有的语法项。这样做是因为保留旧的语法项会导致一些奇怪的情况。如果你有其中有一个缓冲syntax=foo和使用set syntax=bar,那么你就与有语法高亮一个缓冲最终 foobar

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

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


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

  • Neovim用户应替换~/.vim/~/.config/nvim/
  • 的Windows用户应该更换~/.vim/使用%USERPROFILE%\vimfiles\

覆盖整个文件

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

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

这样做的结果是进行更改更容易–修改退出的语法文件有时可能会有些棘手。缺点是您将来不会对系统范围的文件进行任何更新。

我经常以此为起点来尝试语法文件,然后使用下面介绍的一种方法将本地更改提取为本地添加内容。

本地添加

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

Syntax 自动命令

使用Syntaxautocmd:

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>.vimhas 之后加载,<file.vim>相对路径在哪里$VIMRUNTIME(包括子目录)。在您的示例中,应为syntax/c.vim

另请参阅:help after-directory

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

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.