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


103

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

理想的解决方案是,在搜索〜/ .vimrc之前,Vim在当前目录中搜索并读取一个.vimrc,然后在其中为整个树应用设置。

我看过 插件,但这意味着应用的设置不透明,因为它们需要安装插件。相反,modeline是透明的,因为无论用户的vimrc或特定的vim调用如何,modeline设置都会应用于该文件。

我尝试过的事情是

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

我想两者都不出于安全原因而工作。我不需要vimrc的全部功能;绑定到Modeline可接受的设置就足够了。我的目标是使Vimmer更容易在项目中采用编码标准。


Answers:


42

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

  • 模式行特别受限制:我们无法设置变量(可以调整其他(ft)插件,例如“ for-snippet的大括号应该放在换行符上吗?”),也不能从中调用函数(我不限制自己根据编码标准,我还根据当前目录设置要使用的makefile)
  • DRY:使用模式行,需要在每个文件中重复设置,如果要设置的内容太多或要更改的调整,将很快变得难以维护,而且,将需要使用template-expander插件(如果您的项目中有多个vimmer,则应考虑使用该选项)。
  • 并非每个人都使用vim进行开发。我不想被其他人的编辑器设置困扰,为什么我应该寄生他们的设置?
  • 要求v​​immer安装相同的插件,而不是要求他们在.vimrc中复制粘贴和维护相同的行,会更容易
  • 设置可以与其他项目文件(cvs / svn / git /其他)一起保存
  • 每个项目都有一个配置文件真的很容易-使用插件,我有一个用于整个项目的编码标准的全局配置文件,以及每个子项目的特定配置文件(要使用的makefile和要调用的可执行文件) ,...)

顺便说一句,sth的解决方案可用于获取单个配置文件。这与插件方法非常相似,除了.vimrc必须使用非全局选项进行寄生,并且它不轻易支持多个/共享的配置文件。


我注意到您必须先在路径中保存一个新文件,然后它才能正确执行插件
cmcginty 2010年

确实。该系列插件仅定义了一个框架。您仍然必须在文件中编写项目特定的定义-框架将自动获取该文件。
卢克·赫米特

1
请注意,Luc链接了自己的插件。这似乎比问题中所链接的要好得多。谢谢。
数据2010年

好。我不知道 因为我已经使用我的多年了,所以我从未仔细研究过其他实现。我会不时收到错误报告,并最终考虑在内。顺便说一句,我的版本被实现为在mu-template之前触发,以便在扩展模板之前设置特定于项目的变量(这对于获取当前项目的根目录并从扩展的路径名中修剪它非常有用)
Luc Hermitte

1
@JasonMcCarrell我的local_vimrc和Markus“ embear” Braun的实现支持黑名单,白名单...如果只需要指定缩进方式,则最好使用EditorConfig-vim插件。
卢克·赫米特

91

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

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

1
这是递归的,但只能使用*。如果您尝试将其缩小为/ path / to / files /或/ path / to / files,则将无法使用。
SystemParadox 2012年

如果您的项目中有一棵用“ noexpandtab”编写的文件树,而另一棵有所有“ expandtab”文件的树(例如CodeIgniter),则非常好。您可以使用一个配置文件分别为每棵树中的文件设置适当的操作。
user9645 2014年

2
奇怪的是,当我的路径中包含符号链接时,此操作无效。在工作之前,我必须摆出没有符号链接的完整路径。
Dolan Antenucci 2014年

请参阅joseph07关于使用“受信任的vim”作为替代方法(该方法的反向版本(分布式.vimrc与集中式))的答案。
内森·舒尔特

50

我强烈建议不要使用 set exrc

即使使用set secure* nix下的,如果您拥有该文件,vim仍将运行自动命令,shell等。因此,如果您碰巧在该压缩包中编辑了文件,我给您发送了一个.vimrc包含:

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

您可能会比我少逗乐。


6
加载vim时自动执行的插件也是如此。
卢克·赫米特

31

这个问题很古老,但似乎是一个很自然而持久的问题。

我的解决方案很简单。我将.vimrc文件放在项目的根目录中。.vimrc文件的第一行通常是source ~/.vimrc,然后添加我想要的特定配置。我为别名tvim='vim -u .vimrc',并tvim在我的个人项目目录中使用。“ tvim”表示“受信任的vim”,这意味着,如果我在包含.vimrc文件的目录中执行它,但出了点问题,除了我自己,我没有人要怪,因为我明确表示我信任它。另外,我将其中的一组存储起来,这样有时我就可以将我想要的项目进行软链接。


1
这种方法很简单,完全符合我的需求。
金克斯

当我source $HOME/.vimrc从本地本地尝试此操作时.vimrc,Vim抱怨它找不到我在系统范围内安装的插件(在这种情况下,是病原体;execute pathogen#infect()我上面的命令$HOME/.vimrc失败Unknown function ...)。我怎样才能解决这个问题?
内森·舒尔特

20

实际上支持在工作目录中放置.vimrc,只有默认情况下禁用。有关详细信息,请参见:h 'exrc':h startup。通过设置,'exrc'可以读取.vimrc当前目录。

也建议:set secure在使用此功能时使用。这将在当前目录中锁定:autocmd,shell和write命令.vimrc

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

话虽如此,我可能会选择Luc Hermitte本人详细介绍的插件选项。


6
请查看phen的评论。这可能导致严重的安全隐患。
数据

11

为了最大限度地降低当今任何时候使用任何“自动运行”功能的安全风险,我是否建议您使用vim的现有功能来代替插件(便携包)?

例如。

我的本地文件夹的vimrc文件名为“ _gvimrc”(故意使用)。这就减少了像phen这样的人希望自己付出代价来消遣自己的希望。:-)

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

if filereadable("_gvimrc")
    source _gvimrc
endif

在末尾。

我在“ fileexists()”上使用“ fileizable()”,因为当同时打开多个(10+)文件时,后者在折磨时会有些古怪(不知道为什么)。

当然,您可以提供自己的唯一文件名来进一步消除潜在的麻烦制造者。例如“ _mygvimrc”,“ _ gobbledygook”等。您只需要确定一个标准化名称,然后在$ VIM / .vimrc中相应地获取它即可。依靠vi / vim内部可以解决可移植性问题。但是,请勿将其命名为.vimrc(或_vimrc),以防止递归源,以防您稍后使用vim编辑$ VIM / .vimrc文件。

从Windoze 98SE到Windork XP Pro,直到现在的Windorkier 7(已有5年以上),才开始使用它。我将在资源管理器中标记一个.txt文件列表,然后使用“使用多个Vim编辑”,导致同时打开多个Vim窗口。对于我的工作,我每天要做几次。所有文件都按照我在本地_gvimrc中设置的内容进行处理。


在这里,对插件可移植性的不信任是没有根据的,因为这些local_vimrc插件(至少是我的)是可移植的(它曾经在各种不同的OS甚至Windows 95上维护)。有关安全风险的问题也被夸大了:如果我们采用这种方式,我们将永远不会安装任何东西来简化我们的工作。
Luc Hermitte

但是,就我而言,第一个真正的问题是,使用您的方法,您必须在包含_gvimrc文件的确切目录下工作(这是一个不好的名字,因为它意味要包含gvim特定的内容)。如果您的项目是由几个目录(可能需要通用的配置)和特定的目录(如果有多个模块)组成的,那么它将很快显示其局限性。
Luc Hermitte

第二个问题是您一次只能处理一个项目-如果我要处理OTB,openjpeg和一个将两个库合并在一起的项目,则此解决方案不会让我对每个库都有特定的设置三个项目。
Luc Hermitte

这也适用于以菊花链方式从本地目录加载语法文件。
maharvey67 '18

2

假设人们不是每隔几天添加一次文件,则可以在每个文件的顶部添加一个模型。实际上,如果您的版本控制系统允许,则可以执行一条规则,规定每个文件在签入时必须有一个modeline。



2

使用“ editorconfig”

如果您要执行的编码标准的种类与缩进样式,选项卡大小,文件格式和字符集有关,那么您可能需要查看“ editorconfig”,这是一个跨编辑器标准,用于在其中指定此类设置特定项目,并让所有编辑者都遵循该配置。

“ editorconfig”规范允许项目根据文件扩展名或项目中的名称请求不同的设置。(因此,您可以使用TAB制作Makefile,使用4个空格的Python脚本,以及使用2个空格的Shell脚本进行缩进。)

您需要一个插件才能在Vim中使用“ editorconfig”。官方网站提供了一个,但是我个人建议使用纯Vimscript编写的sgur / vim- editorconfig,因此您不必太担心外部依赖项。

由于“ editorconfig”旨在实现跨编辑器兼容性,因此它的功能非常有限,因此,如果需要一致的空格,文件格式(DOS与Unix)和编码(Unicode utf-8等),则“ editorconfig “ 是给你的。



0

我查看了存在的插件并没有真正喜欢它们,所以我写了一个简单的函数,背负vim-fugitive。这样做的好处是,它知道项目的根始终是存储库的根,此外,我可以对文件进行哈希处理以保留信任表。只需将以下内容放入您的.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字典将在两次运行之间保留(请注意^在选项前加上,以免混淆该n选项)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.