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

时间:2009-01-19 07:29:59

标签: vim

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

理想的解决方案是,如果Vim在搜索〜/ .vimrc之前搜索并读取当前目录中的.vimrc,并在那里应用整个树的设置。

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

我尝试过的事情是

  • 将.vimrc放在工作目录中
  • 模式行中的
  • :so vimrc

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

11 个答案:

答案 0 :(得分:85)

你可以在$VIM/vimrc

中加入这样的内容
autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

答案 1 :(得分:49)

我强烈建议不要使用set exrc

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

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

你可能会比我更不习惯。

答案 2 :(得分:42)

我是plugin way的倡导者。 有几个原因:

  • Modelines受到特别限制:我们不能设置变量(调整其他(ft)插件,例如“for-snippet的大括号是否应该换行?”),或者调用它们的函数(我不是t限制自己编码标准,我还根据当前目录设置makefile使用)
  • DRY:对于modelines,需要在每个文件中重复设置,如果要设置太多东西或调整要更改,它将很快变得难以维护,而且,它将需要使用一个template-expander plugin(如果你的项目中有几个vimmers你应该考虑)。
  • 并非每个人都使用vim开发。我不想被其他人的编辑设置困扰,为什么我要寄生他们的?
  • 要求vimmers安装相同的插件更容易,而不是要求他们在.vimrc中复制粘贴和维护相同的行
  • 设置可以与其他项目文件一起保存(cvs / svn / git / whatever)
  • 每个项目都有一个配置文件非常容易 - 使用插件,我有一个全局配置文件,用于整个项目的编码标准,以及每个子项目的特定配置文件(使用makefile,可执行文件,...)

BTW,sth's solution可用于获取单个配置文件。这与插件方法非常相似,除了.vimrc必须使用非全局选项进行寄生,并且它不支持多个/共享配置文件。

答案 3 :(得分:26)

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

我的解决方案非常简单。我将.vimrc文件放在项目的根目录中。 .vimrc文件的第一行通常来源~/.vimrc,然后添加我想要的特定配置。我别名tvim='vim -u .vimrc',并在我的个人项目目录中使用tvim。 “tvim”代表“受信任的vim”,这意味着如果我在一个带有.vimrc文件的目录中执行它并出现问题,我就没有人应该责备自己,因为我明确表示我信任它。另外,我将一组这些存储起来,以便我有时可以将我想要的软链接到特定类型的项目。

答案 4 :(得分:20)

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

使用此功能时,还建议:set secure。这会锁定当前目录中:autocmd的{​​{1}},shell和write命令。

另一件可能值得关注的事情是设置一个会话(.vimrc),其中包含项目的标准视图和设置。

所有这一切,我可能会选择Luc Hermitte自己详细介绍的插件选项。

答案 5 :(得分:10)

为了尽量减少任何“自动运行”功能的安全风险,我可以建议您使用vim的现有功能而不是插件(便携行李)吗?

例如

我的本​​地文件夹的vimrc文件名为“_gvimrc”(故意)。这减少了像phen这样的人以牺牲自己为代价的希望。 : - )

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

if filereadable("_gvimrc")
    source _gvimrc
endif

最后。

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

当然,您可以提供自己独特的文件名,以进一步模糊潜在的麻烦制造者。例如“_mygvimrc”,“_ gobbledygook”等。您只需要在一个标准名称上找到它并在$ VIM / .vimrc中相应地获取它。依赖于vi / vim内部,可以解决可移植性问题。但是,如果你以后用vim编辑$ VIM / .vimrc文件,请不要将它命名为.vimrc(或_vimrc)来防止递归源。

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

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

尝试“localvimrc”:

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

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

答案 8 :(得分:2)

使用“ editorconfig”

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

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

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

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

答案 9 :(得分:1)

尝试使用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

答案 10 :(得分: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字典将在运行之间保留(注意^以预先添加选项,以便它不会#39;弄乱n选项。)