func! vundle#config#bundle(spec, ...) let bundle = vundle#config#init_bundle(a:spec, a:000) " All bundles are removed from rtp and re-added in inverse order so that " they appear in rtp in the same order as they appear in vimrc call g:bundles.rm_from_rtp() call g:bundles.add(bundle) call g:bundles.add_to_rtp() endf " Clear all bundles from rtp, create the bundles holder " func! vundle#config#init() if exists('g:bundles') call g:bundles.rm_from_rtp() endif let g:bundles = s:bundles.new() endf " Add each bundle to rtp and run their plugins, similarly to what vim does at " startup. " func! vundle#config#require(bundles) abort for bundle in a:bundles call s:rtp_add(bundle.rtpath()) call s:rtp_add(g:bundle_dir) " TODO: it has to be relative rtpath, not bundle.name exec 'runtime! ' . bundle.name . '/plugin/*.vim' exec 'runtime! ' . bundle.name . '/after/*.vim' call s:rtp_rm(g:bundle_dir) endfor endf " Create a bundle object based on a given spec and options func! vundle#config#init_bundle(spec, opts) let spec = substitute(a:spec,"['".'"]\+','','g') " Combine info derived from the spec with the options from the Bundle " command. let opts = extend(s:parse_options(a:opts), s:parse_spec(spec), 'keep') " Include generic bundle methods return extend(opts, copy(s:bundle)) endf func! s:parse_options(opts) " TODO: improve this if len(a:opts) != 1 | return {} | endif if type(a:opts[0]) == type({}) return a:opts[0] else return {'rev': a:opts[0]} endif endf func! s:parse_spec(spec) let spec = a:spec if spec =~? '^\s*\(gh\|github\):\S\+' \ || spec =~? '^[a-z0-9][a-z0-9-]*/[^/]\+$' let uri = 'https://github.com/'.split(spec, ':')[-1] if uri !~? '\.git$' let uri .= '.git' endif let name = substitute(split(uri,'\/')[-1], '\.git\s*$','','i') elseif spec =~? '^\s*\(git@\|git://\)\S\+' \ || spec =~? '\(file\|https\?\)://' \ || spec =~? '\.git\s*$' let uri = spec let name = split( substitute(uri,'/\?\.git\s*$','','i') ,'\/')[-1] else let name = spec let uri = 'https://github.com/vim-scripts/'.name.'.git' endif return {'name': name, 'uri': uri, 'spec': spec } endf func! s:rtp_rm(dir) abort exec 'set rtp-='.fnameescape(expand(a:dir)) exec 'set rtp-='.fnameescape(expand(a:dir.'/after')) endf func! s:rtp_add(dir) abort exec 'set rtp^='.fnameescape(expand(a:dir)) exec 'set rtp+='.fnameescape(expand(a:dir.'/after')) endf func! s:expand_path(path) abort return simplify(expand(a:path)) endf " Bundle object " --------------------------------------------------------------------------- let s:bundle = {} func! s:bundle.path() return s:expand_path(g:bundle_dir.'/'.self.name) endf func! s:bundle.rtpath() return has_key(self, 'rtp') ? s:expand_path(self.path().'/'.self.rtp) : self.path() endf func! s:bundle.command() return printf("Bundle '%s'", self.spec) endf " --------------------------------------------------------------------------- " Bundle collection object " --------------------------------------------------------------------------- " let s:bundles = { 'list' : [], 'dict' : {} } function! s:bundles.add(bundle) call add(self.list, a:bundle.spec ) let self.dict[ a:bundle.spec ] = a:bundle endf func! s:bundles.new() return deepcopy(self) endf func! s:bundles.keys() return copy(self.list) endf func! s:bundles.has_bundle(spec) return has_key(self.dict, a:spec) endf func! s:bundles.get(bundle_spec) return get(self.dict, a:bundle_spec) endf func! s:bundles.rm_from_rtp() call map(copy(self.list), 's:rtp_rm(self.dict[v:val].rtpath())') endf func! s:bundles.add_to_rtp() call map(reverse(copy(self.list)), 's:rtp_add(self.dict[v:val].rtpath())') endf func! s:bundles.get_sorted_list() return map(copy(self.list), 'self.dict[v:val]') endf func! s:bundles.size() return len(self.list) endf " ---------------------------------------------------------------------------