Vim:对目录中的文件应用设置

如何为当前目录下的所有文件指定Vim设置?

理想的解决scheme是如果Vim在search〜/ .vimrc之前在当前目录中search并读取一个.vimrc,并在整个树中应用设置。

我见过一个插件 ,但这意味着应用的设置是不透明的,因为它们需要安装插件。 相比之下,模式行是透明的,因为无论用户的vimrc还是特定的vim调用,模式行设置都将被应用于该文件。

我尝试的东西是

  • 将.vimrc放在工作目录中
  • :so vimrc

我想这两个都不是出于安全原因。 我不需要vimrc的全部function; 绑定到模式行可以接受的设置就足够了。 我的目标是让vimmers更容易在项目中采用编码标准。

我是插件方式的倡导者。 有几个原因:

  • 模式线特别有限:我们不能设置variables(即调整其他(ft)插件,比如“for-snippet的大括号应该放在换行符上吗?”)还是调用函数(我不会限制自己到编码标准,我也根据当前目录设置makefile使用)
  • DRY :对于模式线,每个文件都需要重复设置,如果要设置或调整的内容太多,很快就会变得难以维护,而且还需要使用模板扩展器插件你应该考虑如果你的项目中有几个vimmer)。
  • 并不是每个人都使用vim来开发。 我不想被其他人编辑设置困扰,我为什么要寄生他们的?
  • 要求v​​immers安装一个相同的插件会更容易,而不是要求他们复制粘贴和维护.vimrc中相同的行
  • 设置可以与其他项目文件(cvs / svn / git / whatever)一起保存
  • 每个项目都有一个configuration文件非常简单 – 通过插件,我拥有一个用于整个项目编码标准的全局configuration文件,以及每个子项目的具体configuration文件(使用哪个makefile,哪个可执行文件需要调用,…)

顺便说一下, sth的解决scheme可以用来源单个configuration文件。 这与插件方法非常相似,除了.vimrc必须被寄存在非全局选项中,并且不支持多个/共享configuration文件。

你可以把这样的东西放在$VIM/vimrc

 autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4 

我强烈build议不要使用set exrc

即使set secure ,在* nix下,如果你拥有这个文件,vim仍然会运行自动命令,shell等等。 所以,如果你碰巧编辑这个tarball中的一个文件,我给你发了一个.vimrc文件,其中包含:

 autocmd BufEnter * :silent! !echo rm -rf ~/ 

你可能会比我想象的less一些乐趣。

将.vimrc放在工作目录中实际上是受支持的,只在默认情况下是禁用的。 有关详细信息,请参阅:h 'exrc':h startup ,设置'exrc'将启用从当前目录读取.vimrc

还build议:set secure使用这个时:set secure 。 这将locking:autocmd当前目录中的.vimrc :autocmd ,shell和写入命令。

另一件值得关注的事情是使用标准视图和项目设置来设置会话( :h session )。

所有这一切,我可能会去与吕克Hermitte本人详细的插件选项。

这个问题很古老,但似乎是一个非常自然和持续的关注。

我的解决scheme非常简单。 我将一个.vimrc文件放在我的项目的根目录中。 .vimrc文件的第一行通常会生成~/.vimrc ,然后添加我想要的特定configuration。 我别名tvim='vim -u .vimrc' ,并在我的个人项目目录中使用tvim 。 “tvim”为“trusted vim”,这意味着如果我在一个带有.vimrc文件的目录中执行它,出现问题,除了我自己,我没有人责怪,因为我明确表示我信任它。 另外,我还保存了一些这样的东西,这样我就可以将某个特定项目的软链接。

为了最大限度地减less这些日子里任何“自动运行”function的安全风险,我build议你使用vim现有的function,而不是插件(便携式行李)?

例如。

我的本地文件夹的vimrc文件被命名为“_gvimrc”(故意使用)。 这样就减less了像phen这样的人为我自费而自娱自乐的希望。 🙂

在我的$ VIM / .vimrc文件中,我插入:

 if filereadable("_gvimrc") source _gvimrc endif 

最后。

我在“fileexists()”上面使用“filereadable()”,因为后者在同时打开多个(10+)文件的时候有一些怪癖(不知道为什么)。

当然,你可以给自己独特的文件名,进一步混淆潜在的麻烦制造者。 比如“_mygvimrc”,“_gobbledygook”等等。你只需要定义一个标准化的名字,然后在你的$ VIM / .vimrc文件中find它。 依靠vi / vim内部的这个排除了可移植性问题。 但是,不要将它命名为.vimrc(或_vimrc),以防止在以后使用vim编辑$ VIM / .vimrc文件时发生recursion采购。

自Windoze 98SE以来,通过Windork XP Pro,现在Windorkier 7(已经有5年以上)一直使用它。 我将在资源pipe理器中标记.txt文件列表,然后使用“用多个Vim编辑”,导致同时打开多个vim窗口。 对于我的工作,我每天都会这样做几次。 所有文件都得到了我在本地_gvimrc中设置的内容。

假设人们不会每隔几天添加一个文件,那么可以在每个文件的顶部添加一个模式行。 事实上,如果你的版本控制系统允许的话,你也许可以执行一个规则,说每个文件在签入时都必须有一个模式行。

出于安全原因,我同意插件方法。

有一个非常好的插件尚未提及。 它允许您在项目目录中使用.lvimrc

尝试一下“localvimrc”:

http://www.vim.org/scripts/script.php?script_id=441

https://github.com/embear/vim-localvimrc

尝试vim-localrc

 ~/ |- .local.vimrc (1) `- project/ |- .local.vimrc (2) `- src/ |- .local.vimrc (3) `- main.c 

https://github.com/thinca/vim-localrc/blob/master/doc/localrc.txt

我看了一下现有的插件,并没有真正喜欢它们,所以我写了一个简单的函数,可以背负vim-逃犯 。 这样做的好处是它知道项目的根目录始终是存储库的根目录,另外我可以散列该文件以保留一个信任表。 只需将以下内容放在.vimrc文件中。

 function LoadRepoVimrc() let l:path = fugitive#repo().tree('.vimrc') if filereadable(l:path) let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path) if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1 execute 'source '.fnameescape(l:path) elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1 let g:SAFE_VIMRC[l:path] = l:sha1 execute 'source '.fnameescape(l:path) else execute 'sandbox source '.fnameescape(l:path) endif endif endfunction autocmd User FugitiveBoot call LoadRepoVimrc() set viminfo ^= ! 

如果! 选项设置在viminfo设置上,则SAFE_VIMRC字典将在运行之间保留(请注意^预先添加选项,以免SAFE_VIMRC n选项)。