我可以让vim对没有扩展名的C++头文件进行语法高亮吗?

19
我有一个项目,其中包含一堆遵循标准 C++ 头文件命名约定的头文件,也就是说,称为 Foo 的类将在名为 Foo 而不是 Foo.hFoo.hh 的文件中声明。是否有一种好的方法来配置 vim 仅对这些文件进行语法高亮?稍微不那么理想的备选方案是启用所有没有扩展名的文件的 C++ 样式高亮。我不确定是否有更复杂的方法来检测文件类型,而不仅仅依赖于其扩展名。

相关的SO帖子:https://dev59.com/GXRB5IYBdhLWcg3wCjrO - dirkgently
1
输入命令 :set syntax=cpp 可以使当前文件强制使用 C++ 语法高亮。大部分人来到这里都是为了寻求这个解决方案,而不是每个项目都要单独设置。 - Sdra
3个回答

18

你可以使用 modeline 功能来实现这个目的。Modelines 允许你在文件的开头/结尾的注释中设置某些选项。

这使得它成为设置编码规范、折叠参数的绝佳位置。出于安全原因,有些选项无法设置。更多信息请参见文档

将以下内容放置在文件顶部或底部:

/* vim: set ft=cpp: */

编辑: 在评论的促使下,提供更多细节 :) :

只有在启用modeline时它才有效。在正常情况下,默认情况下应该启用它。为确保它已启用,或更改检测区域的大小,请在您的.vimrc中设置modeline选项:

set modelines=5

这将确保类似上面引用的行在每个文件的前五行或后五行中被检测到。

在模型行内,setlocal 表示为加载文件的缓冲区设置选项。 ft 选项,也称为 filetype,是确定语法突出显示语言的选项。 值 cpp 是 C++ 文件使用的选项。

编辑2:如果您可以识别一个魔术模式,则可以在没有模型线的情况下进行更多的工作:

au BufRead * if search('MagicPattern', 'nw') | setlocal ft=cpp | endif

意思:每次打开一个文件,检查是否包含 "MagicPattern" 。如果包含,则将其视为 C++ 代码。模式参数使用 vim 正则表达式方言,请参考 help pattern 获取详细信息。


作为@Amadan解决方案的替代,您可以更改VIM自动检测代码以匹配您的编码风格(默认情况下,第一或第二行应以注释开头)。 - Adriano Repetti
不要忘记启用 modeline 支持,才能使其正常工作。 - sehe
@sehe:确切地说,对于普通用户的vim,默认情况下是开启的;对于vi或管理员则关闭。你不应该以root身份编码;而且问题是关于vim的;所以除非OP明确将其关闭,否则他应该没事。 :P - Amadan
@JasonR 我同意sehe的观点,约定俗成可以帮助很多事情(filetype.vim C/C++自动检测默认情况下远非完美)。 - Adriano Repetti
我发现这篇文章中的解决方案非常有用:在你的.vimrc文件中添加au BufNewFile,BufRead * if &syntax == '' | set syntax=cpp | endif,它能将未设置语法的文件设置为C++。 - user2023370
显示剩余6条评论

15

使用默认的vim设置,在文件顶部添加以下内容,使vim能够识别文件类型:

/* vim: set filetype=cpp: */

如果您使用的是其他语言,请相应地进行调整,例如:

# vim: set filetype=python:

modeline 与 modelines 的澄清

在这个回答中,https://dev59.com/32kv5IYBdhLWcg3wdQhT#10584645

set modeline=5

应该是:

set modelines=5

请参阅文档:https://dev59.com/32kv5IYBdhLWcg3wdQhT#10584645。具体来说,modeline是一个布尔类型的启用标志,默认情况下为开启状态http://vimdoc.sourceforge.net/htmldoc/options.html#%27modeline%27,而modelines接受一个整数参数(在任何情况下默认为5),用于设置当modeline启用时要查看的行数 http://vimdoc.sourceforge.net/htmldoc/options.html#%27modelines%27

虽然这些内容对问题提出者并不感兴趣,但我在这里添加这些信息,以便于那些通过搜索到达此处的人可以自我提醒如何在文件顶部告诉vim文件类型。


0
寻找解决方案时,我也发现了这个答案,如果您想将特定的文件扩展名设置为标准扩展名的同义词,那么这个答案非常完美。

https://vi.stackexchange.com/a/5203/31568

例如,在我的情况下,我使用扩展名.icc来存储C++方法的内联定义。根据上面链接的答案,我可以在自定义的filetype.vim文件中将icc扩展名分配给cpp语言。
" My own filetype file
" where I define custom filetypes/extensions
"
if exists("did_load_filetypes")
    finish
endif
augroup filetypedetect
    au! BufRead,BufNewFile *.icc       setfiletype cpp
augroup END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接