代码之家  ›  专栏  ›  技术社区  ›  wilhelmtell

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

vim
  •  112
  • wilhelmtell  · 技术社区  · 16 年前

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

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

    我见过 plugin ,但这意味着应用的设置是不透明的,因为它们需要安装插件。相比之下,模型线是透明的,因为无论用户的vimrc或特定的vim调用如何,模型线设置都将应用于该文件。

    我尝试过的是

    • 将.vimrc放入工作目录
    • :so vimrc 在模型线中。

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

    11 回复  |  直到 16 年前
        1
  •  97
  •   sth    16 年前

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

    autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4
    
        2
  •  51
  •   Martijn Courteaux    9 年前

    我强烈建议不要使用 set exrc

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

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

    你可能会比我更不开心。

        3
  •  43
  •   Community CDub    8 年前

    我支持 plugin way . 有几个原因:

    • 模型线特别有限:我们不能设置变量(调整其他(ft)插件,比如“for代码段的大括号应该在换行符上吗?”),也不能从它们调用函数(我不局限于编码标准,我还根据当前目录设置要使用的makefile)
    • DRY :对于模型线,需要在每个文件中重复设置,如果有太多的东西需要设置或调整,很快就会变得难以维护,此外,还需要使用 template-expander plugin (如果你的项目中有几个vimmer,你应该考虑一下)。
    • 并非每个人都使用vim进行开发。我不想被其他人的编辑器设置打扰,为什么我要寄生他们的?
    • 让vimmers安装相同的插件更容易,而不是要求他们在.vimrc中复制粘贴和维护相同的行
    • 这些设置可以与其他项目文件(cvs/svn/git/wevery)一起保存
    • 每个项目都有一个配置文件真的很容易——使用插件,我有一个用于整个项目编码标准的全局配置文件,以及每个子项目的特定配置文件(要使用哪个makefile,要调用哪个可执行文件,…)

    顺便提一下 sth's solution 可用于获取单个配置文件。这与插件方法非常相似,除了.vimrc必须附带非全局选项,而且它不容易支持多个/共享配置文件。

        4
  •  33
  •   andr Gal Mathys    12 年前

    这个问题由来已久,但似乎是一个非常自然和持久的问题。

    我的解决方案相当简单。我把a .vimrc 我的项目根目录中的文件。第一行 .vimrc 文件通常来源 ~/.vimrc ,然后添加我想要的特定配置。我化名 tvim='vim -u .vimrc' ,并使用 tvim 在我的个人项目目录中。“tvim”代表“受信任的vim”,这意味着如果我在一个目录中执行它 .vimrc 如果文件出现问题,除了我自己,我不能责怪任何人,因为我明确表示我信任它。此外,我还保存了一组这些文件,这样我有时就可以软链接我想要的特定类型的项目。

        5
  •  21
  •   gravious    16 年前

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

    还建议 :set secure 当使用这个时。这锁上了 :autocmd 、shell和write命令 .vimrc 在当前目录中。

    另一件值得考虑的事情是设置会话( :h session )具有项目的标准视图和设置。

    尽管如此,我可能会选择Luc Hermite自己详细介绍的插件选项。

        6
  •  12
  •   XEQtor    12 年前

    为了尽量减少这些天任何事情的“自动运行”功能的安全风险,我可以建议你利用vim的现有功能而不是插件(可移植性包袱)吗?

    如。

    我的本地文件夹的vimrc文件名为“_gvimrc”(故意)。这降低了像芬这样的人以牺牲我们为代价自娱自乐的希望。 :-)

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

    if filereadable("_gvimrc")
        source _gvimrc
    endif
    

    最后。

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

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

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

        7
  •  4
  •   filbranden    6 年前

    使用“editorconfig”

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

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

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

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

        8
  •  3
  •   Nathan Fellman    16 年前

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

        9
  •  3
  •   asgeo1 kontr0l    11 年前

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

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

    试试“localvimrc”:

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

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

        10
  •  1
  •   Touv    8 年前

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

        11
  •  1
  •   Parakleta    8 年前

    我查看了现有的插件,并没有真正喜欢它们中的任何一个,所以我编写了一个简单的函数 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 选项)。