如何为当前目录下的所有文件指定Vim设置?
理想的解决方案是,如果Vim在搜索〜/ .vimrc之前搜索并读取当前目录中的.vimrc,并在那里应用整个树的设置。
我见过plugin,但这意味着应用的设置不透明,因为它们需要安装插件。相反,模式行是透明的,因为无论用户的vimrc还是特定的vim调用,都将对该文件应用模式行设置。
我尝试过的事情是
:so vimrc
。我认为两者都不是出于安全原因而工作。我不需要vimrc的全部功能;绑定到模式行可接受的设置就足够了。我的目标是让vimmers更容易在项目中采用编码标准。
答案 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的倡导者。 有几个原因:
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”:
答案 8 :(得分:2)
如果您要执行的编码标准的种类与缩进样式,制表符大小,文件格式和字符集有关,那么您可能需要研究"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
选项。)