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

我在几个小组中工作,每个小组在C中都有自己的tab / indentation / spacing标准。

有没有办法为每个单独的可选VIMconfiguration,当我编辑一个文件,或者:

  • 我做了一些像set group=1来select一个configuration
  • 位于工作目录中的本地.vimrc用于自动设置configuration

综上所述

有几种方法可以做到这一点,其中大部分已经提出,但我想我会用另外两个方法来总结它们:

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

扫描标题

在许多组织中,每个源文件的顶部都有一个标准的标题(包括版权声明和项目名称等)。 如果是这样的话,你可以让Vim自动扫描文件的第一行(例如10行)寻找一个关键字。 如果发现它,它可以改变你的设置。 我已经修改了这个,使它比我使用的forms(它做很多其他的事情)更简单,但创build一个~/.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 

每当打开任何types的文件并设置文件types( au FileType *行)时,将调用ConfigureFiletypes函数。 这将检查文件types是否在与当前组(GROUPNAME)相关联的文件types列表中,在本例中为“c”,“cpp”,“vhdl”或“c​​.doxygen”。 如果是,则调用CheckForGROUPNAMECode(),它读取文件的前10行,如果它们包含GROUPNAME,则会执行一些自定义操作。 除了设置expandtabs之外,还可以改变状态栏来清楚地显示组名,所以你知道它的工作一目了然。

打开时检查configuration

就像JS Bangs的build议一样,有一个自定义的configuration文件可能是有用的。 但是,不要将其加载到vimrc中,而应考虑类似这样的内容,它将检查.c文件是否在与.c文件相同的目录中打开.vim.custom。

 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 

我在$HOME/.vimrc有这个:

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

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

更新:

我现在做这样的事情,以便从我正在编辑的文件的相同目录中读取.vim文件,而不pipe当前目录是什么。

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

你也可以在自己的.vimrc中设置自动命令 ,在每个path上设置特定的选项。

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

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

“这个插件在当前打开的文件的文件系统树中search本地的vimrc文件。 默认情况下,它将从文件目录中search所有“.lvimrc”文件直到根目录,并以相反的顺序加载它们。 加载的文件的文件名和数量可以通过全局variables进行定制。“

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

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

我为此创build了一个开源工具。 忘记标题,扫描,configuration和本地vimrc文件。

尝试游泳。

游泳

swim是切换vimrc文件和创build方便的别名的快速工具。 这是一个简短的使用清单。 请参阅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

在尝试使用前一张海报build议的localvimrc插件之后,我非常喜欢通过vim设置来控制每个项目的非每个项目。

它在默认加载.lvimrc文件之前确实要求确认,但有一个设置可以自动加载.lvimrc文件。 有些人可能会把这看作一个安全漏洞,但是它可以像广告一样工作。

我select.gitignore .lvimrc文件。 或者,您可以将它们作为共享设置(选项卡/空间扩展,制表符,其他项目特定设置)的forms进行检查。

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

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

这是詹姆斯的一个变种

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

我会经常启动vi,而没有一个特定的文件,我跳转到所以这使得有条件地加载configuration基于当前的工作目录。 缺点是configuration不是基于文件而是应用于工作目录。

寻找大部分相同的问题,我也发现酱插件: http : //www.vim.org/scripts/script.php? script_id=3992

它声称:

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

我觉得特别有趣的是,它将configuration全部保留在其数据目录中,而不是期望用户在文件系统中散布点文件。 这虽然往往是一个个人品味metter。

我还没有testing它。