如何使用命令或本地vimrc文件在多个vim配置之间切换?


85

我分为几个小组,每个小组都有自己的C语言制表符/缩进/间距标准。

在编辑文件时,有没有一种方法可以为每种方法分别提供单独的可选VIM配置:

  • 我喜欢set group=1选择配置
  • 工作目录中的本地.vimrc用于自动设置配置


另请参见在超级用户上在两个不同的vim配置之间切换的问题。
Hotschke

Answers:


40

综上所述

有几种方法可以做到这一点,其中大多数已被建议,但我想我将它们总结为另外两个方法:

  • 每个目录的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中,请考虑类似这样的事情,它将检查何时在与.c文件相同的目录中为.vim.custom打开.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

66

我有这样的$HOME/.vimrc

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

这使我可以.vim.custom在每个目录中放置一个文件,以加载特定于该目录的命令和选项。如果您正在处理具有深层目录结构的多个项目,则可能需要更复杂的内容(例如,走到目录树直到.vim.custom找到a),但是相同的基本思想将起作用。

更新:

我现在要执行类似的操作,以便.vim从与我正在编辑的文件相同的目录中读取文件,而不管当前目录是什么。

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

1
太棒了,我从未见过!
Jim Mitchener 09年

1
对于存在于仓库中的项目,这是一个很好的解决方案!
bradreaves

2
'exrc'选项已经允许执行与此类似的操作。它将在当前工作目录中加载一个.vimrc/ .exrc/ .gvimrc
jamessan

有关的评论exrc应该是正确的答案。其他所有内容似乎都很古怪而复杂。
silvenon 2014年

使用exrc非常好,但是即使我与正在编辑的文件不在同一个工作目录中,我也希望能获得正确的文件,我对此表示赞赏。
JSBձոգչ2014年

34

您还可以将自动命令放在.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”版本可能更好。
lpapp 2014年

17

插件执行正确的操作:http : //www.vim.org/scripts/script.php? script_id= 441

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


3
github版本也支持病原体加载:-)
Graza 2012年

另一个类似的插件是localrc.vim。它还允许特定于文件类型的每个目录设置;我觉得这是必不可少的。vim.org/scripts/script.php?script_id=3393
Ingo Karkat,2012年

12

假设您的开发人员不会对此有所抱怨,您可以随时在注释中的每个文件中添加vim设置。

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
我是唯一啊哈在我的大多数球队的启蒙开发,所以没有人会介意。这是一个非常整洁的每个文件解决方案。
bradreaves

1
我更喜欢在底部添加它们,以使它们不引人注目,但是我认为这是风格问题。
nyuszika7h 2014年

5

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

尝试游泳。


游泳

swim是用于切换vimrc文件和创建方便的别名的快速工具。这是一个简短的用法列表。请参阅Github存储库以获取演练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


4

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

默认情况下,它确实会在加载.lvimrc文件之前进行确认,但是有一个设置可以自动加载.lvimrc文件。某些人可能将其视为安全漏洞,但它的作用与广告宣传一致。

我选择.gitignore .lvimrc文件。或者,您可以以共享设置的形式(选项卡/空间扩展,制表符,其他项目特定的设置)来检查它们。


1
这个脚本很棒:github.com/MarcWeber/vim-addon-local-vimrc。1)现在只询问一次并将文件哈希标记为OK。2)它从根目录到当前目录横穿目录树,最后采购更靠近优先级的文件。
西罗Santilli郝海东冠状病六四事件法轮功

为什么要将.lvimrc文件添加到.gitignore?关键是每个使用vim并安装了插件的人都将获得相同的设置。
nyuszika7h 2014年

2
@ nyuszika7h必须强制执行某些设置,而其他设置则完全是个人设置。对于必须强制实施的设置,EditorConfig更好,因为它与编辑器无关:github.com/editorconfig/editorconfig-vim
Ciro Santilli郝海东冠状病六四事件法轮功2015年

1

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

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


1

这是詹姆士

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文件中
jmarceli 2014年

1

我分为几个小组,每个小组都有自己的C语言制表符/缩进/间距标准。

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

autotab设置了Vim的建议,每次加载一个文件到Vim中,autotab调用它,Vim的设置输出autotab传递给:set命令。

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

它确定文件是使用硬制表符还是仅使用空格进行缩进,并确定缩进大小。如果文件带有制表符缩进,则它会根据使用各种制表符尺寸呈现文件样本并根据启发式方法(例如内部元素的行间对齐)来判断出正确的制表符尺寸。

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

它也是文件类型的“不可知论”,并且可以与多种不同的语言一起很好地工作。我不仅在C上使用它,而且还在shell脚本,Lisp,Makefiles,HTML以及您拥有的东西上使用它。

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


0

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

它声称:

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

我发现特别有趣的是,它将所有配置都保留在其数据目录中,而不是期望用户在整个文件系统上散布点文件。尽管这常常是个人品味的体现。

我还没有测试。


0

你可以用垫木切换配置(任何点文件,不仅.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

在这里阅读更多内容:使用GNU存放管理点文件

优点:非常简单,没有vim插件依赖性,不仅可以用于管理所有点文件.vimrc

缺点:配置彼此独立,您需要分别管理/更新每个配置(如果您不频繁地切换/更新配置-这不会成为问题)。

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.