Simple plugin manager in vimrc (see first few lines of the snippet for description; sorry, at time of writing I can't do any formatting in this description)
" I call this snippet: Poor man's plugin downloader
"
" This snippet allows you to define your plugins in vimrc, like so (one plugin per line or many plugins per line):
" Pl 'tpope/vim-repeat'
" Pl 'tpope/vim-sensible' 'tpope/vim-commentary' 'tpope/vim-eunuch'
"
" Next time you start vim, these plugins will be fetched from github and enabled.
"
" Existing plugins can be updated with:
" :UpdatePlugins
"
" Or, if you have vim-dispatch, plugins can be updated in the background with:
" :UpdatePlugins!
"
" This snippet relies on battle-tested vim-pathogen to do the heavy lifting.
" --------------------------------------------------------------------------
"
" Modify the 'Plugins {{{' section below to specify your plugins
"
" Poor man's plugin downloader {{{
let g:plugin_dir = expand('~/.vim/bundle', ':p')
let g:plugin_hash = {}
let g:pathogen_blacklist = []
if !isdirectory(g:plugin_dir) | call mkdir(g:plugin_dir, "p") | endif
function! DownloadPluginIfMissing(plugin) abort
let output_dir = g:plugin_dir . '/' . fnamemodify(a:plugin, ":t")
if isdirectory(output_dir) || !executable('git')
return
endif
let command = printf("git clone -q %s %s", "https://github.com/" . a:plugin . '.git', output_dir)
echo "DownloadPluginIfMissing: " . command | echo system(command)
silent! execute 'helptags ' . output_dir . '/doc'
endfunction
function! UpdatePlugin(plugin) abort
let output_dir = g:plugin_dir . '/' . fnamemodify(a:plugin, ":t")
if !isdirectory(output_dir) || !executable('git')
return
endif
let command = printf("cd %s && git pull -q", output_dir)
echo "UpdatePlugin: " . command | echo system(command)
endfunction
function! Pl(...) abort
for plugin in map(copy(a:000), 'substitute(v:val, ''''''\|"'', "", "g")')
let g:plugin_hash[ fnamemodify(plugin, ':t') ] = 1
call DownloadPluginIfMissing(plugin)
endfor
endfunction
command! -nargs=+ Pl call Pl(<f-args>)
command! -bang -nargs=0 UpdatePlugins if len("<bang>") == 0 | call map( keys(g:plugin_hash), 'UpdatePlugin( v:val )' ) | Helptags | else | execute "Start! vim -c UpdatePlugins -c Helptags -c qa" | endif
" }}}
" Plugins {{{
Pl 'tpope/vim-sensible' 'tpope/vim-commentary' 'tpope/vim-eunuch'
Pl 'tpope/vim-obsession' 'tpope/vim-tbone' 'tpope/vim-unimpaired'
Pl 'tpope/vim-git' 'tpope/vim-markdown' 'tpope/vim-fugitive'
Pl 'tpope/vim-dispatch' 'tpope/vim-rsi' 'tpope/vim-repeat'
Pl 'tpope/vim-jdaddy' 'tpope/vim-surround' 'tpope/vim-projectionist'
" }}}
set nocompatible
syntax on
filetype plugin indent on
Pl 'tpope/vim-pathogen'
execute "source " . g:plugin_dir . '/vim-pathogen/autoload/pathogen.vim'
let g:pathogen_blacklist = filter(map(split(glob(g:plugin_dir . '/*', 1), "\n"),'fnamemodify(v:val,":t")'), '!has_key(g:plugin_hash, v:val)')
execute pathogen#infect(g:plugin_dir . '/{}')
" }}}
yang-ling 11 years ago
Try Vundle: https://github.com/gmarik/Vundle.vim
Or NeoBundle: https://github.com/Shougo/neobundle.vim
I use the latter.
valdoonicanlives 10 years ago
Thanks, tried it out and it works fine, using it now :)
Javier Blanco GutiƩrrez 11 years ago
Nice code!