【问题标题】:How to switch between multiple vim configurations with a command or local vimrc files?如何使用命令或本地 vimrc 文件在多个 vim 配置之间切换?
【发布时间】:2010-12-25 18:22:58
【问题描述】:

我在几个小组中工作,每个小组在 C 中都有自己的制表符/缩进/间距标准。

有没有办法为每个单独选择 VIM 配置,所以当我编辑文件时:

  • 我会执行set group=1 之类的操作来选择配置
  • 工作目录中的本地 .vimrc 用于自动设置配置

【问题讨论】:

标签: vim


【解决方案1】:

我有这个在$HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif

这允许我在每个目录中放置一个.vim.custom 文件,以加载特定于该目录的命令和选项。如果您正在处理具有深层目录结构的多个项目,您可能需要更复杂的东西(例如,沿着目录树向上走,直到找到 .vim.custom),但同样的基本想法也可以。

更新:

我现在这样做是为了从与我正在编辑的文件相同的目录中读取.vim 文件,无论当前目录是什么。

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

【讨论】:

  • 这太棒了,我从来没有见过这个!
  • 这对于存储在 repos 中的项目来说是一个很好的解决方案!
  • 'exrc' 选项已经允许执行与此非常相似的操作。它将在当前工作目录中加载.vimrc/.exrc/.gvimrc
  • 关于exrc 的评论应该是正确的答案。其他的一切看起来都很老套和复杂。
  • 这有多安全?例如,如果您下载一些恶意代码,它可能会将.vim 放在当前文件夹中,您的迷你插件会读取该文件夹。我想如果你下载恶意代码,所有的赌注都会被取消,但这似乎更容易。
【解决方案2】:

总结

有几种方法可以做到这一点,其中大多数已经被建议,但我想我应该用两个额外的方法来总结它们:

  • Per-directory vimrc - 缺点是 Vim 必须在正确的目录中启动:如果您的项目在 ~/project1 并且您有 ~/project1/.vim.custom 并执行 cd ~ ; vim project1/file.c,将找不到自定义设置。
  • 模型 - 非常有效,但缺点是需要将它们添加到所有文件中(并记得将它们添加到新文件中)
  • 特定于目录的自动命令 - 这非常有效
  • 扫描文件中的特定标题(见下文) - 这是我过去为不同公司或明确命名的项目工作时使用最多的标题
  • 打开文件时检查每个目录的 vimrc(见下文)。另一个相当容易实现的方法,尤其是当您的项目代码都在一个地方时。

扫描标题

在许多组织中,每个源文件的顶部都有一个标准标题(带有版权声明和项目名称等)。如果是这种情况,您可以让 Vim 自动扫描文件的前(例如)10 行以查找关键字。如果找到它,它可以更改您的设置。我对其进行了修改,使其比我使用的表单更简单(它可以做很多其他事情),但是创建一个~/.vim/after/filetype.vim(如果你还没有的话)并添加如下内容:

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

只要打开任何类型的文件并设置文件类型(au FileType * 行),就会调用 ConfigureFiletypes 函数。这将检查文件类型是否在与当前组 (GROUPNAME) 关联的文件类型列表中,在本例中为“c”、“cpp”、“vhdl”或“c​​.doxygen”。如果是,它调用 CheckForGROUPNAMECode(),它读取文件的前 10 行,如果它们包含 GROUPNAME,它会进行一些自定义。除了设置 expandtabs 或其他内容外,这还会更改状态栏以清楚地显示组名,以便您一眼就知道它的工作原理。

打开时检查配置

很像 JS Bangs 的建议,拥有一个自定义配置文件会很有用。但是,不要在 vimrc 中加载它,而是考虑这样的事情,它将检查何时为 .vim.custom 与 .c 文件在同一目录中打开 .c 文件。

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction

【讨论】:

    【解决方案3】:

    您还可以将 autocommands 放入您的 .vimrc 中,这将根据每个路径设置特定选项。

    au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
    au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet
    

    【讨论】:

    • 当您无法控制存储库以致无法将“.vim.custom”文件放入其中时,这非常有用。我喜欢它保持存储库清洁。谢谢。免责声明:如果路径以非模式友好的方式不断变化,那么假设可以修改存储库,“.vim.custom”版本可能会更好。
    【解决方案4】:

    插件做正确的事: http://www.vim.org/scripts/script.php?script_id=441

    “此插件在当前打开的文件的文件系统树中搜索本地 vimrc 文件。默认情况下,它会搜索从文件目录到根目录的所有“.lvimrc”文件,并以相反的顺序加载它们。文件名和加载文件数量可通过全局变量自定义。”

    【讨论】:

    • 而且github版本也支持加载病原体:-)
    • 另一个类似的插件是localrc.vim;它还允许特定于文件类型的每个目录设置;我觉得不可或缺。 vim.org/scripts/script.php?script_id=3393
    【解决方案5】:

    假设您的开发人员不会抱怨,您可以随时将 vim 设置添加到 cmets 中的每个文件。

    /*
     * vim:ts=4:sw=4:expandtab:...
     */
    
    int main(int argc, char **argv)
    {
        ...
    

    【讨论】:

    • 我是我大部分团队中唯一ahem开明的开发人员,所以没有人应该介意。这是一个非常简洁的每个文件解决方案。
    • 我更喜欢将它们添加到底部以便它们不显眼,但我想这是风格问题。
    【解决方案6】:

    我为此目的创建了一个开源工具。忘记标题、扫描、配置和本地 vimrc 文件。

    尝试游泳。


    游泳

    swim 是一个快速切换 vimrc 文件和创建方便别名的工具。这是一个简短的使用列表。请参阅Github repo 获取演练 gif 和下载说明:


    用法

    swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
    swim ls                                 #Show available swim aliases
    swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
    swim with favorite         #Set alias favorite as primary .vimrc
    swim with main             #Set alias main as primary .vimrc
    

    了解详情

    https://github.com/dawsonbotsford/swim

    【讨论】:

      【解决方案7】:

      在尝试了上一张海报建议的 localvimrc 插件之后,我非常喜欢对 vim 设置进行非模糊的每个项目控制。

      默认情况下,它会在加载 .lvimrc 文件之前要求确认,但有一个设置可以自动加载 .lvimrc 文件。有些人可能会认为这是一个安全漏洞,但它的工作原理与宣传的一样。

      我选择 .gitignore .lvimrc 文件。或者,您可以将它们作为共享设置(制表符/空格扩展、制表位、其他项目特定设置)的形式签入。

      【讨论】:

      • 这个脚本太棒了:github.com/MarcWeber/vim-addon-local-vimrc。 1) 它现在只询问一次并将文件哈希标记为 OK。 2)它将目录树从根目录横穿到当前目录,最后采购更接近的更高优先级的文件。
      • 为什么要将.lvimrc 文件添加到.gitignore?关键是每个使用 vim 并安装了插件的人都会得到相同的设置。
      • @nyuszika7h 某些设置必须强制执行,而另一些则纯粹是个人设置。对于必须对所有人强制执行的设置,EditorConfig 更好,因为它与编辑器无关:github.com/editorconfig/editorconfig-vim
      【解决方案8】:

      正如sledge 所述,使用该插件是我见过和使用的最佳选择。 jerseyboy 评论说,该实用程序建议在加载之前要求确认(即在打开每个文件之后)。为了避免这种情况,只需在您的主要.vimrc 本地.lvimrc 文件列表中设置:

      let g:localvimrc_whitelist='/development/kernel/.lvimrc'

      【讨论】:

        【解决方案9】:

        这是 Jamessan 的变体

        function! ConditionalLoad()
            let cwd = getcwd()
            if getcwd() =~ $HOME . "/src/mobile"
                so $HOME/.vim.mobile
            endif
        endfunction
        autocmd VimEnter * call ConditionalLoad()
        

        我会经常在没有要跳转到的特定文件的情况下启动 vi,因此这可以根据当前工作目录有条件地加载配置。缺点是配置不是基于文件应用,而是基于工作目录。

        【讨论】:

        • 正是我想要的。作为使用示例:我将此代码放在~/.vimrc 中,将/src/mobile 更改为我的Symfony 项目目录(在我的情况下是/www/symfony)并将.vim.mobile 修改为.vim.symfony 然后将新的.vimrc 配置放入其中~/.vim.symfony文件
        【解决方案10】:

        我在几个小组中工作,每个小组在 C 中都有自己的制表符/缩进/间距标准。

        我同时使用各种开源软件。创建单独的.vimrc 文件并重新配置格式标准是不切实际的。十多年前,我终于厌倦了处理编辑器配置,写了一个名为autotab的程序来处理它。

        autotab 设置为建议使用 Vim 时,每次将文件加载到 Vim 时,都会在其上调用 autotab,并将 Vim 设置输出 autotab 传递给 :set 命令。

        autotab 从文件中读取数千行,对其进行分析并确定expandtabtabstopshiftwidth 参数的设置。

        它确定文件是使用硬制表符还是仅使用空格进行缩进,并计算出缩进大小。如果文件使用制表符缩进,它会根据使用各种制表符大小呈现文件样本并根据内部元素的逐行对齐等启发式方法来判断它,从而计算出正确的制表符大小。

        它运行良好,以至于我几年前就停止了调整算法。如果它感到困惑,几乎总是因为文件存在格式问题,例如同时使用多个约定。

        它也与文件类型“无关”,并且适用于各种不同的语言。我不仅在 C 语言上使用它,而且在 shell 脚本、Lisp、Makefiles、HTML 以及你拥有的东西上使用它。

        请注意,它不处理可能特定于项目的其他格式参数,例如,在 C 文件中,switch 语句中的case 标签是否缩进,或者是否包装函数参数列表只是缩进,或与参数列表的左括号对齐。 Vim 确实有这类东西的设置,因此可以合理地扩展程序以分析样式并输出这些参数。

        【讨论】:

          【解决方案11】:

          寻找几乎相同的问题我还发现了 Sauce 插件:http://www.vim.org/scripts/script.php?script_id=3992

          它声称:

          Sauce 是多个 vimrc 文件的轻量级管理器,可用于为不同的环境加载不同的设置。简而言之,您可以维护许多不同的 vim 设置文件,并且只在需要时加载您需要的文件。

          我觉得特别有趣的是,它将配置全部保存在其数据目录中,而不是期望用户在文件系统中散布点文件。虽然这通常是个人品味的标准。

          不过我还没有测试它。

          【讨论】:

            【解决方案12】:

            您可以使用stow 切换配置(任何点文件,不仅是.vimrc

            安装stow:

            $ apt install stow
            

            为每个配置创建多个目录:

            ~$ ls -d ~/dotfiles/vim*
            vim-all vim-webdev vim-go
            

            在其中放入不同的.vimrc

            $ find ~/dotfiles -name .vimrc
            /home/username/vim-golang/.vimrc
            /home/username/vim-webdev/.vimrc
            /home/username/vim-all/.vimrc
            

            现在您可以使用此命令实例化 vim-golang 配置(应该在 dotfiles 目录中运行):

            ~$ cd ~/dotfiles
            
            dotfiles$ stow -v vim-golang
            LINK: .vimrc => dotfiles/vim-golang/.vimrc
            

            现在已链接:

            $ cd ~ && ls -l .vimrc 
            .vimrc -> dotfiles/vim-golang/.vimrc
            

            如果你需要切换配置,只需重新stow即可:

            ~$ cd dotfiles
            
            dotfiles$ stow -v -D vim-golang
            UNLINK: .vimrc
            
            dotfiles$ stow -v vim-webdev
            LINK: .vimrc => dotfiles/vim-webdev/.vimrc
            
            $ cd ~ && ls -l .vimrc 
            .vimrc -> dotfiles/vim-webdev/.vimrc
            

            在此处阅读更多内容:Managing dotfiles with GNU stow

            优点:很简单,没有vim插件依赖,可以用来管理所有的dotfiles,不仅仅是.vimrc

            缺点:配置相互独立,您需要分别管理/更新它们(如果您不经常切换/更新配置 - 这不是问题)。

            【讨论】:

              猜你喜欢
              • 2011-02-15
              • 2022-12-25
              • 2011-01-03
              • 2020-09-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-11
              • 2010-09-18
              • 1970-01-01
              相关资源
              最近更新 更多