有没有一种简单/可靠的方法来让VIM 在项目/目录特定的基础上检测一个特殊的文件(即:用一些设置来定制.vimrc
),或者根据特殊的存在来改变运行时设置标记/string/哈希注释在c源( .c
)或标题( .h
)文件的开头? string/散列必须映射到.vimrc
文件中的函数/设置,并且不能包含实际的设置本身。
我有一个mutli开发人员项目,我们都为我们的各种编辑器(主要是emacs和vim )有一套共同的代码风格设置,并且我们都严格遵守这些设置,例如换行符风格( CR与CR +
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
,这些变量是属于一个项目的所有缓冲区之间共享的变量。