vi / vim – 自定义格式取决于特殊文件或代码内的标记的存在

有没有一种简单/可靠的方法来让VIM 在项目/目录特定的基础上检测一个特殊的文件(即:用一些设置来定制.vimrc ),或者根据特殊的存在来改变运行时设置标记/string/哈希注释在c源( .c )或标题( .h )文件的开头? string/散列必须映射到.vimrc文件中的函数/设置,并且不能包含实际的设置本身。


背景

我有一个mutli开发人员项目,我们都为我们的各种编辑器(主要是emacs和vim )有一套共同的代码风格设置,并且我们都严格遵守这些设置,例如换行符风格( CRCR + LF ) ,缩进(长度,硬标签与扩展为空格)等等。


问题

我正在创build一些新的项目,由于我们无法控制的原因(即:我们必须使用静态代码分析工具),将需要与我们不同的样式设置。 在静态代码分析工具中可以绕过这个方法,但是有一个非技术/法律要求,我们避免禁用这个工具的“function”。

对于这些新项目中的每一个,我想以某种方式使vi / vim知道一些特殊的标志,无论是通过项目目录结构根目录中的特殊文件,还是通过特殊的关键字/ tag / hash /等我可以把一个/* C-style block comment */ 。 当vi / vim知道这个“触发器”的存在时,我希望它调用一个函数来覆盖换行符,缩进等的样式设置。如果这是可能的,是否也可能有几个互斥这样的“触发器”,使每个人都有一个共同的.vimrc和该项目决定使用哪种风格?


问题 – 还原

有没有一个简单的方法来完成这个?

…在ac源文件(.c)或头文件(.h)文件开始的注释中,根据特殊标记/字符串/散列值的存在来更改运行时设置?

是的,他们叫做模式线。 http://vim.wikia.com/wiki/Modeline_magic

他们可以出现在文件的开始或结束。

来自C的一些C源的例子:

 /* vim:ft=c:expandtab:sw=4:ts=4:sts=4: */ 

请参阅:help modeline vim中的:help modeline以获取更多信息。

一种解决方案: Vim的modelines( :help modeline )和Emacs的文件变量 。

这些是你在你的编辑器中解释的文件中的特殊注释。 您可以使用它们设置缩进样式,文件编码等

在我看来,模式是丑陋的噪音。

Vim的一个解决方案: .exrc:help 'exrc' )。

您可以将项目特定的设置放在项目根目录的.exrc文件中。 该手册声称这种解决方案是不安全的,但我不明白如何正常运作的成年人可以被打败。 因人而异。

Vim的一个解决方案:特定目录的自动命令。

这是最后提到的更安全的替代方案:help 'exrc'但它需要每个贡献者添加东西到他自己的vimrc所以…没有那么有用,我猜。

最终的解决方案: editorconfig 。

您将您的设置.editorconfig在项目根目录的.editorconfig中,并让每个撰稿人的IDE /编辑器处理它。

中央配置

如果可以集中配置特定的命令/本地异常,可以将这样的autocmds放到~/.vimrc

 :autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4 

重要的是使用:setlocal而不是:set ,同样的:map <buffer> ...:command! -buffer ... :command! -buffer ...

另一方面,如果您希望将特定的配置存储在项目中(并且不希望通过模式行将其嵌入到所有文件中),则有以下两种选择:

具有内置功能的本地配置

如果你总是从项目根目录启动Vim,那么内置的

 :set exrc 

启用从当前目录读取.vimrc文件。 您可以将:set ts=4 sw=4命令放在那里。

本地配置通过插件

否则,你需要一个插件的帮助; 有几个在vim.org; 我可以推荐localrc插件 (尤其是我自己的增强功能 ),它甚至允许本地文件类型特定的配置。

请注意,从文件系统读取配置具有安全隐患; 你可能想要:set secure

我已经涵盖了这个答案的主要选择: https : //stackoverflow.com/a/456889/15934 (是的,你的问题几乎是重复的:不同的表述,但相同的解决方案)。

  • Modelines是非常有限的:你必须使用一个插件来设置不是vim选项的东西。

  • .exrc不会看到当前目录

  • editorconfig 仅限于非常具体的选择 :不要期望像编译目录那样转发插件规范(这是我如何使用CMake支持多种编译模式 – 其他人更喜欢使用ccache和调整CMakeCache,但这不起作用那么当一个接一个地使用g ++和clang ++时),应该怎样调用linter,你的命名约定…

  • 自动命令不能缩放,不能轻松地从一个目录移植到另一个目录。

  • 最后,最好的解决方案是基于插件的海事组织:有很多插件解决方案看到我的local_vimrc插件的自述文件末尾的非穷举列表

  • 还要注意,自从我以前的回答以来,我开始了另一个简化项目管理的实验 。 例如,我介绍p:variables ,这些变量是属于一个项目的所有缓冲区之间共享的变量。