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

bra*_*ves 82 vim

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

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

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

JSB*_*ոգչ 63

我有这个$HOME/.vimrc:

if filereadable(".vim.custom")
    so .vim.custom
endif
Run Code Online (Sandbox Code Playgroud)

这允许我.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
Run Code Online (Sandbox Code Playgroud)

  • ''exrc'`选项已经允许做一些非常类似的事情.它将在当前工作目录中加载`.vimrc` /`.exrc` /`.gvimrc`. (2认同)

DrA*_*rAl 40

综上所述

有几种方法可以做到这一点,其中大多数已被提出,但我想我会用两个额外的方法总结它们:

  • 每个目录的vimrc - 缺点是必须在正确的目录中启动Vim:如果您的项目已经存在~/project1并且您已经拥有~/project1/.vim.custom和执行cd ~ ; vim project1/file.c,则无法找到自定义设置.
  • Modelines - 非常有效,但缺点是需要将它们添加到所有文件中(并记住将它们添加到新文件中)
  • 目录特定的自动命令 - 这非常有效
  • 扫描文件中的特定标题(见下文) - 这是我过去用于不同公司或明确命名项目的最常用标题
  • 在打开文件时检查的每个目录的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
Run Code Online (Sandbox Code Playgroud)

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

打开时检查配置

与JS Bangs的建议非常相似,拥有自定义配置文件非常有用.但是,不要将其加载到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
Run Code Online (Sandbox Code Playgroud)


jam*_*san 33

您还可以在每个路径的基础上将自动命令放入.vimrc哪些特定选项集中.

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet
Run Code Online (Sandbox Code Playgroud)


小智 17

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

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

  • 并且github版本也支持加载病原体:-) (3认同)

Jim*_*ner 12

假设您的开发人员不会抱怨它,您可以随时在评论中为每个文件添加vim设置.

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

int main(int argc, char **argv)
{
    ...
Run Code Online (Sandbox Code Playgroud)

  • 对于我的大多数球队来说,我是唯一一个*开明的开发者,所以没有人应该介意.这是一个非常简洁的每个文件解决方案. (2认同)

Daw*_*n B 5

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

试试游泳.


游泳

swim是一个快速工具,用于切换vimrc文件和创建方便的别名.这是一个简短的用法列表.有关演练gif和下载说明,请参阅Github仓库:


用法

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
Run Code Online (Sandbox Code Playgroud)


阅读更多

https://github.com/dawsonbotsford/swim