但是,将这些行添加到.vimrc后,它不起作用。
原因是Vim在设置'syntax'
选项时清除了现有的语法项。这样做是因为保留旧的语法项会导致一些奇怪的情况。如果你有其中有一个缓冲syntax=foo
和使用set syntax=bar
,那么你就与有语法高亮一个缓冲最终都 foo
和bar
。
当Vim启动时,它vimrc
一次加载(启动时),但是每次设置filetype
或syntax
选项时,它都会加载文件类型和语法文件,这将重置您在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
自动命令
使用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
has 之后加载,<file.vim>
相对路径在哪里$VIMRUNTIME
(包括子目录)。在您的示例中,应为syntax/c.vim
。
另请参阅:help after-directory
。
优点是,它比autocmd更具可读性,尤其是在您进行许多更改的情况下。缺点是,如果要将Vim设置镜像到其他计算机,则需要复制其他文件(这是很多人将其Vim文件保存在GitHub存储库中的重要原因,因此可以轻松地在多个计算机之间镜像)。
~/.vim/after/syntax/c.vim
。