我发现在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
中起作用。非常感谢!#1 楼
但是,将这些行添加到.vimrc中后,它不起作用。
原因是Vim设置
'syntax'
选项时会清除现有的语法项。这样做是因为保留旧的语法项会导致一些奇怪的情况。如果您有一个带有syntax=foo
并使用set syntax=bar
的缓冲区,那么您将得到一个带有同时突出显示foo
和bar
语法的缓冲区。当Vim启动时,它一次加载
vimrc
(在启动时) ,但是每次设置filetype
或syntax
选项时,它都会加载文件类型和语法文件,这将重置您在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存储库中的重要原因,因此可以轻松地在多个计算机之间镜像)。
评论
尝试将其添加到〜/ .vim / after / syntax / c.vim中。@muru是的,它有效。但是如何将其添加到.vimrc?
您可能必须使用autocmd BufEnter * .c hl ...之类的东西,但应将其保留在after / syntax / c.vim中。任何现代版本的Vim都可以理解.vim / after /目录。在Windows上,路径为vimfiles / after / ...,因此可移植性不是什么大问题(特别是如果您使用任何插件)。