From 590a76f6a7484a74d1375c57ea613bf299a7c22f Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Tue, 8 Apr 2014 11:58:55 +0200 Subject: [PATCH] [vim] Add vundle minimum file --- .vim/bundle/vundle/autoload/vundle.vim | 66 ++++ .vim/bundle/vundle/autoload/vundle/config.vim | 109 +++++++ .../vundle/autoload/vundle/installer.vim | 285 ++++++++++++++++++ .../bundle/vundle/autoload/vundle/scripts.vim | 189 ++++++++++++ 4 files changed, 649 insertions(+) create mode 100644 .vim/bundle/vundle/autoload/vundle.vim create mode 100644 .vim/bundle/vundle/autoload/vundle/config.vim create mode 100644 .vim/bundle/vundle/autoload/vundle/installer.vim create mode 100644 .vim/bundle/vundle/autoload/vundle/scripts.vim diff --git a/.vim/bundle/vundle/autoload/vundle.vim b/.vim/bundle/vundle/autoload/vundle.vim new file mode 100644 index 0000000..16eebca --- /dev/null +++ b/.vim/bundle/vundle/autoload/vundle.vim @@ -0,0 +1,66 @@ +" Vundle is a shortcut for Vim Bundle and Is a simple plugin manager for Vim +" Author: gmarik +" HomePage: http://github.com/gmarik/vundle +" Readme: http://github.com/gmarik/vundle/blob/master/README.md +" Version: 0.9 + +" Plugin Commands +com! -nargs=+ -bar Plugin +\ call vundle#config#bundle() + +com! -nargs=? -bang -complete=custom,vundle#scripts#complete PluginInstall +\ call vundle#installer#new('!' == '', ) + +com! -nargs=? -bang -complete=custom,vundle#scripts#complete PluginSearch +\ call vundle#scripts#all('!' == '', ) + +com! -nargs=? -bang -complete=custom,vundle#scripts#complete Plugins +\ call vundle#scripts#all('!' == '', ) + +com! -nargs=0 -bang PluginList +\ call vundle#installer#list('!' == '') + +com! -nargs=? -bang PluginClean +\ call vundle#installer#clean('!' == '') + +com! -nargs=0 PluginDocs +\ call vundle#installer#helptags(g:bundles) + +" Aliases +com! PluginUpdate PluginInstall! + +" Vundle Aliases +com! -nargs=? -bang -complete=custom,vundle#scripts#complete VundleInstall PluginInstall +com! -nargs=? -bang -complete=custom,vundle#scripts#complete VundleSearch PluginSearch +com! -nargs=? -bang VundleClean PluginClean +com! -nargs=0 VundleDocs PluginDocs +com! VundleUpdate PluginInstall! + +" deprecated +com! -nargs=+ Bundle call vundle#config#bundle() +com! -nargs=? -bang -complete=custom,vundle#scripts#complete BundleInstall PluginInstall +com! -nargs=? -bang -complete=custom,vundle#scripts#complete BundleSearch PluginSearch +com! -nargs=? -bang -complete=custom,vundle#scripts#complete Bundles Plugins +com! -nargs=0 -bang BundleList PluginList +com! -nargs=? -bang BundleClean PluginClean +com! -nargs=0 BundleDocs PluginDocs +com! BundleUpdate PluginInstall! + +if (has('signs')) +sign define Vu_error text=! texthl=Error +sign define Vu_active text=> texthl=Comment +sign define Vu_todate text=. texthl=Comment +sign define Vu_new text=+ texthl=Comment +sign define Vu_updated text=* texthl=Comment +sign define Vu_deleted text=- texthl=Comment +sign define Vu_helptags text=* texthl=Comment +endif + + +func! vundle#rc(...) abort + let g:bundle_dir = len(a:000) > 0 ? expand(a:1, 1) : expand('$HOME/.vim/bundle', 1) + let g:updated_bundles = [] + let g:vundle_log = [] + let g:vundle_changelog = ['Updated Plugins:'] + call vundle#config#init() +endf diff --git a/.vim/bundle/vundle/autoload/vundle/config.vim b/.vim/bundle/vundle/autoload/vundle/config.vim new file mode 100644 index 0000000..7bcf647 --- /dev/null +++ b/.vim/bundle/vundle/autoload/vundle/config.vim @@ -0,0 +1,109 @@ +func! vundle#config#bundle(arg, ...) + let bundle = vundle#config#init_bundle(a:arg, a:000) + call s:rtp_rm_a() + call add(g:bundles, bundle) + call s:rtp_add_a() + return bundle +endf + +func! vundle#config#init() + if !exists('g:bundles') | let g:bundles = [] | endif + call s:rtp_rm_a() + let g:bundles = [] +endf + +func! vundle#config#require(bundles) abort + for b in a:bundles + call s:rtp_add(b.rtpath) + call s:rtp_add(g:bundle_dir) + " TODO: it has to be relative rtpath, not bundle.name + exec 'runtime! '.b.name.'/plugin/*.vim' + exec 'runtime! '.b.name.'/after/*.vim' + call s:rtp_rm(g:bundle_dir) + endfor +endf + +func! vundle#config#init_bundle(name, opts) + if a:name != substitute(a:name, '^\s*\(.\{-}\)\s*$', '\1', '') + echo "Spurious leading and/or trailing whitespace found in plugin spec '" . a:name . "'" + endif + let opts = extend(s:parse_options(a:opts), s:parse_name(substitute(a:name,"['".'"]\+','','g')), 'keep') + let b = extend(opts, copy(s:bundle)) + let b.rtpath = s:rtpath(opts) + return b +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_name(arg) + let arg = a:arg + let git_proto = exists('g:vundle_default_git_proto') ? g:vundle_default_git_proto : 'https' + + if arg =~? '^\s*\(gh\|github\):\S\+' + \ || arg =~? '^[a-z0-9][a-z0-9-]*/[^/]\+$' + let uri = git_proto.'://github.com/'.split(arg, ':')[-1] + if uri !~? '\.git$' + let uri .= '.git' + endif + let name = substitute(split(uri,'\/')[-1], '\.git\s*$','','i') + elseif arg =~? '^\s*\(git@\|git://\)\S\+' + \ || arg =~? '\(file\|https\?\)://' + \ || arg =~? '\.git\s*$' + let uri = arg + let name = split( substitute(uri,'/\?\.git\s*$','','i') ,'\/')[-1] + else + let name = arg + let uri = git_proto.'://github.com/vim-scripts/'.name.'.git' + endif + return {'name': name, 'uri': uri, 'name_spec': arg } +endf + +func! s:rtp_rm_a() + let paths = map(copy(g:bundles), 'v:val.rtpath') + let prepends = join(paths, ',') + let appends = join(paths, '/after,').'/after' + exec 'set rtp-='.fnameescape(prepends) + exec 'set rtp-='.fnameescape(appends) +endf + +func! s:rtp_add_a() + let paths = map(copy(g:bundles), 'v:val.rtpath') + let prepends = join(paths, ',') + let appends = join(paths, '/after,').'/after' + exec 'set rtp^='.fnameescape(prepends) + exec 'set rtp+='.fnameescape(appends) +endf + +func! s:rtp_rm(dir) abort + exec 'set rtp-='.fnameescape(expand(a:dir, 1)) + exec 'set rtp-='.fnameescape(expand(a:dir.'/after', 1)) +endf + +func! s:rtp_add(dir) abort + exec 'set rtp^='.fnameescape(expand(a:dir, 1)) + exec 'set rtp+='.fnameescape(expand(a:dir.'/after', 1)) +endf + +func! s:expand_path(path) abort + return simplify(expand(a:path, 1)) +endf + +func! s:rtpath(opts) + return has_key(a:opts, 'rtp') ? s:expand_path(a:opts.path().'/'.a:opts.rtp) : a:opts.path() +endf + +let s:bundle = {} + +func! s:bundle.path() + return s:expand_path(g:bundle_dir.'/'.self.name) +endf + diff --git a/.vim/bundle/vundle/autoload/vundle/installer.vim b/.vim/bundle/vundle/autoload/vundle/installer.vim new file mode 100644 index 0000000..bc2f41d --- /dev/null +++ b/.vim/bundle/vundle/autoload/vundle/installer.vim @@ -0,0 +1,285 @@ +func! vundle#installer#new(bang, ...) abort + let bundles = (a:1 == '') ? + \ g:bundles : + \ map(copy(a:000), 'vundle#config#bundle(v:val, {})') + + let names = vundle#scripts#bundle_names(map(copy(bundles), 'v:val.name_spec')) + call vundle#scripts#view('Installer',['" Installing plugins to '.expand(g:bundle_dir, 1)], names + ['Helptags']) + + call s:process(a:bang, (a:bang ? 'add!' : 'add')) + + call vundle#config#require(bundles) +endf + + +func! s:process(bang, cmd) + let msg = '' + + redraw + sleep 1m + + let lines = (getline('.','$')[0:-2]) + + for line in lines + redraw + + exec ':norm '.a:cmd + + if 'error' == g:vundle_last_status + let msg = 'With errors; press l to view log' + endif + + if 'updated' == g:vundle_last_status && empty(msg) + let msg = 'Plugins updated; press u to view changelog' + endif + + " goto next one + exec ':+1' + + setl nomodified + endfor + + redraw + echo 'Done! '.msg +endf + +func! vundle#installer#run(func_name, name, ...) abort + let n = a:name + + echo 'Processing '.n + call s:sign('active') + + sleep 1m + + let status = call(a:func_name, a:1) + + call s:sign(status) + + redraw + + if 'new' == status + echo n.' installed' + elseif 'updated' == status + echo n.' updated' + elseif 'todate' == status + echo n.' already installed' + elseif 'deleted' == status + echo n.' deleted' + elseif 'helptags' == status + echo n.' regenerated' + elseif 'error' == status + echohl Error + echo 'Error processing '.n + echohl None + sleep 1 + else + throw 'whoops, unknown status:'.status + endif + + let g:vundle_last_status = status + + return status +endf + +func! s:sign(status) + if (!has('signs')) + return + endif + + exe ":sign place ".line('.')." line=".line('.')." name=Vu_". a:status ." buffer=" . bufnr("%") +endf + +func! vundle#installer#install_and_require(bang, name) abort + let result = vundle#installer#install(a:bang, a:name) + let b = vundle#config#bundle(a:name, {}) + call vundle#installer#helptags([b]) + call vundle#config#require([b]) + return result +endf + +func! vundle#installer#install(bang, name) abort + if !isdirectory(g:bundle_dir) | call mkdir(g:bundle_dir, 'p') | endif + + let n = substitute(a:name,"['".'"]\+','','g') + let matched = filter(copy(g:bundles), 'v:val.name_spec == n') + + if len(matched) > 0 + let b = matched[0] + else + let b = vundle#config#init_bundle(a:name, {}) + endif + + return s:sync(a:bang, b) +endf + +func! vundle#installer#docs() abort + let error_count = vundle#installer#helptags(g:bundles) + if error_count > 0 + return 'error' + endif + return 'helptags' +endf + +func! vundle#installer#helptags(bundles) abort + let bundle_dirs = map(copy(a:bundles),'v:val.rtpath') + let help_dirs = filter(bundle_dirs, 's:has_doc(v:val)') + + call s:log('') + call s:log('Helptags:') + + let statuses = map(copy(help_dirs), 's:helptags(v:val)') + let errors = filter(statuses, 'v:val == 0') + + call s:log('Helptags: '.len(help_dirs).' plugins processed') + + return len(errors) +endf + +func! vundle#installer#list(bang) abort + let bundles = vundle#scripts#bundle_names(map(copy(g:bundles), 'v:val.name_spec')) + call vundle#scripts#view('list', ['" My Plugins'], bundles) + redraw + echo len(g:bundles).' plugins configured' +endf + + +func! vundle#installer#clean(bang) abort + let bundle_dirs = map(copy(g:bundles), 'v:val.path()') + let all_dirs = (v:version > 702 || (v:version == 702 && has("patch51"))) + \ ? split(globpath(g:bundle_dir, '*', 1), "\n") + \ : split(globpath(g:bundle_dir, '*'), "\n") + let x_dirs = filter(all_dirs, '0 > index(bundle_dirs, v:val)') + + if empty(x_dirs) + let headers = ['" All clean!'] + let names = [] + else + let headers = ['" Removing Plugins:'] + let names = vundle#scripts#bundle_names(map(copy(x_dirs), 'fnamemodify(v:val, ":t")')) + end + + call vundle#scripts#view('clean', headers, names) + redraw + + if (a:bang || empty(names)) + call s:process(a:bang, 'D') + else + call inputsave() + let response = input('Continue? [Y/n]: ') + call inputrestore() + if (response =~? 'y' || response == '') + call s:process(a:bang, 'D') + endif + endif +endf + + +func! vundle#installer#delete(bang, dir_name) abort + + let cmd = ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) ? + \ 'rmdir /S /Q' : + \ 'rm -rf' + + let bundle = vundle#config#init_bundle(a:dir_name, {}) + let cmd .= ' '.vundle#installer#shellesc(bundle.path()) + + let out = s:system(cmd) + + call s:log('') + call s:log('Plugin '.a:dir_name) + call s:log('$ '.cmd) + call s:log('> '.out) + + if 0 != v:shell_error + return 'error' + else + return 'deleted' + endif +endf + +func! s:has_doc(rtp) abort + return isdirectory(a:rtp.'/doc') + \ && (!filereadable(a:rtp.'/doc/tags') || filewritable(a:rtp.'/doc/tags')) + \ && (v:version > 702 || (v:version == 702 && has("patch51"))) + \ ? !(empty(glob(a:rtp.'/doc/*.txt', 1)) && empty(glob(a:rtp.'/doc/*.??x', 1))) + \ : !(empty(glob(a:rtp.'/doc/*.txt')) && empty(glob(a:rtp.'/doc/*.??x'))) +endf + +func! s:helptags(rtp) abort + " it is important to keep trailing slash here + let doc_path = resolve(a:rtp . '/doc/') + call s:log(':helptags '.doc_path) + try + execute 'helptags ' . doc_path + catch + call s:log("> Error running :helptags ".doc_path) + return 0 + endtry + return 1 +endf + +func! s:sync(bang, bundle) abort + let git_dir = expand(a:bundle.path().'/.git/', 1) + if isdirectory(git_dir) || filereadable(expand(a:bundle.path().'/.git', 1)) + if !(a:bang) | return 'todate' | endif + let cmd = 'cd '.vundle#installer#shellesc(a:bundle.path()).' && git pull && git submodule update --init --recursive' + + let cmd = g:shellesc_cd(cmd) + + let get_current_sha = 'cd '.vundle#installer#shellesc(a:bundle.path()).' && git rev-parse HEAD' + let get_current_sha = g:shellesc_cd(get_current_sha) + let initial_sha = s:system(get_current_sha)[0:15] + else + let cmd = 'git clone --recursive '.vundle#installer#shellesc(a:bundle.uri).' '.vundle#installer#shellesc(a:bundle.path()) + let initial_sha = '' + endif + + let out = s:system(cmd) + call s:log('') + call s:log('Plugin '.a:bundle.name_spec) + call s:log('$ '.cmd) + call s:log('> '.out) + + if 0 != v:shell_error + return 'error' + end + + if empty(initial_sha) + return 'new' + endif + + let updated_sha = s:system(get_current_sha)[0:15] + + if initial_sha == updated_sha + return 'todate' + endif + + call add(g:updated_bundles, [initial_sha, updated_sha, a:bundle]) + return 'updated' +endf + +func! vundle#installer#shellesc(cmd) abort + if ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) + return '"' . substitute(a:cmd, '"', '\\"', 'g') . '"' + endif + return shellescape(a:cmd) +endf + +func! g:shellesc_cd(cmd) abort + if ((has('win32') || has('win64')) && empty(matchstr(&shell, 'sh'))) + let cmd = substitute(a:cmd, '^cd ','cd /d ','') " add /d switch to change drives + return cmd + else + return a:cmd + endif +endf + +func! s:system(cmd) abort + return system(a:cmd) +endf + +func! s:log(str) abort + let fmt = '%y%m%d %H:%M:%S' + call add(g:vundle_log, '['.strftime(fmt).'] '.a:str) + return a:str +endf diff --git a/.vim/bundle/vundle/autoload/vundle/scripts.vim b/.vim/bundle/vundle/autoload/vundle/scripts.vim new file mode 100644 index 0000000..5c43547 --- /dev/null +++ b/.vim/bundle/vundle/autoload/vundle/scripts.vim @@ -0,0 +1,189 @@ +func! vundle#scripts#all(bang, ...) + let b:match = '' + let info = ['"Keymap: i - Install plugin; c - Cleanup; s - Search; R - Reload list'] + let matches = s:load_scripts(a:bang) + if !empty(a:1) + let matches = filter(matches, 'v:val =~? "'.escape(a:1,'"').'"') + let info += ['"Search results for: '.a:1] + " TODO: highlight matches + let b:match = a:1 + endif + call vundle#scripts#view('search',info, vundle#scripts#bundle_names(reverse(matches))) + redraw + echo len(matches).' plugins found' +endf + +func! vundle#scripts#reload() abort + silent exec ':PluginSearch! '.(exists('b:match') ? b:match : '') + redraw +endf + +func! vundle#scripts#complete(a,c,d) + return join(s:load_scripts(0),"\n") +endf + +func! s:view_log() + if !exists('g:vundle_log_file') + let g:vundle_log_file = tempname() + endif + + call writefile(g:vundle_log, g:vundle_log_file) + execute 'silent pedit ' . g:vundle_log_file + + wincmd P | wincmd H +endf + +func! s:create_changelog() abort + for bundle_data in g:updated_bundles + let initial_sha = bundle_data[0] + let updated_sha = bundle_data[1] + let bundle = bundle_data[2] + + let cmd = 'cd '.vundle#installer#shellesc(bundle.path()). + \ ' && git log --pretty=format:"%s %an, %ar" --graph '. + \ initial_sha.'..'.updated_sha + + let cmd = g:shellesc_cd(cmd) + + let updates = system(cmd) + + call add(g:vundle_changelog, '') + call add(g:vundle_changelog, 'Updated Plugin: '.bundle.name) + + if bundle.uri =~ "https://github.com" + call add(g:vundle_changelog, 'Compare at: '.bundle.uri[0:-5].'/compare/'.initial_sha.'...'.updated_sha) + endif + + for update in split(updates, '\n') + let update = substitute(update, '\s\+$', '', '') + call add(g:vundle_changelog, ' '.update) + endfor + endfor +endf + +func! s:view_changelog() + call s:create_changelog() + + if !exists('g:vundle_changelog_file') + let g:vundle_changelog_file = tempname() + endif + + call writefile(g:vundle_changelog, g:vundle_changelog_file) + execute 'silent pedit ' . g:vundle_changelog_file + + wincmd P | wincmd H +endf + +func! vundle#scripts#bundle_names(names) + return map(copy(a:names), ' printf("Plugin ' ."'%s'".'", v:val) ') +endf + +func! vundle#scripts#view(title, headers, results) + if exists('g:vundle_view') && bufloaded(g:vundle_view) + exec g:vundle_view.'bd!' + endif + + exec 'silent pedit [Vundle] '.a:title + + wincmd P | wincmd H + + let g:vundle_view = bufnr('%') + " + " make buffer modifiable + " to append without errors + set modifiable + + call append(0, a:headers + a:results) + + setl buftype=nofile + setl noswapfile + + setl cursorline + setl nonu ro noma + if (exists('&relativenumber')) | setl norelativenumber | endif + + setl ft=vundle + setl syntax=vim + syn keyword vimCommand Plugin + syn keyword vimCommand Bundle + syn keyword vimCommand Helptags + + com! -buffer -bang -nargs=1 DeletePlugin + \ call vundle#installer#run('vundle#installer#delete', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=? InstallAndRequirePlugin + \ call vundle#installer#run('vundle#installer#install_and_require', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=? InstallPlugin + \ call vundle#installer#run('vundle#installer#install', split(,',')[0], ['!' == '', ]) + + com! -buffer -bang -nargs=0 InstallHelptags + \ call vundle#installer#run('vundle#installer#docs', 'helptags', []) + + com! -buffer -nargs=0 VundleLog call s:view_log() + + com! -buffer -nargs=0 VundleChangelog call s:view_changelog() + + nnoremap q :silent bd! + nnoremap D :exec 'Delete'.getline('.') + + nnoremap add :exec 'Install'.getline('.') + nnoremap add! :exec 'Install'.substitute(getline('.'), '^Plugin ', 'Plugin! ', '') + + nnoremap i :exec 'InstallAndRequire'.getline('.') + nnoremap I :exec 'InstallAndRequire'.substitute(getline('.'), '^Plugin ', 'Plugin! ', '') + + nnoremap l :VundleLog + nnoremap u :VundleChangelog + nnoremap h :h vundle + nnoremap ? :norm h + + nnoremap c :PluginClean + nnoremap C :PluginClean! + + nnoremap s :PluginSearch + nnoremap R :call vundle#scripts#reload() + + " goto first line after headers + exec ':'.(len(a:headers) + 1) +endf + +func! s:fetch_scripts(to) + let scripts_dir = fnamemodify(expand(a:to, 1), ":h") + if !isdirectory(scripts_dir) + call mkdir(scripts_dir, "p") + endif + + let l:vim_scripts_json = 'http://vim-scripts.org/api/scripts.json' + if executable("curl") + let cmd = 'curl --fail -s -o '.vundle#installer#shellesc(a:to).' '.l:vim_scripts_json + elseif executable("wget") + let temp = vundle#installer#shellesc(tempname()) + let cmd = 'wget -q -O '.temp.' '.l:vim_scripts_json. ' && mv -f '.temp.' '.vundle#installer#shellesc(a:to) + if (has('win32') || has('win64')) + let cmd = substitute(cmd, 'mv -f ', 'move /Y ', '') " change force flag + let cmd = vundle#installer#shellesc(cmd) + end + else + echoerr 'Error curl or wget is not available!' + return 1 + endif + + call system(cmd) + + if (0 != v:shell_error) + echoerr 'Error fetching scripts!' + return v:shell_error + endif + return 0 +endf + +func! s:load_scripts(bang) + let f = expand(g:bundle_dir.'/.vundle/script-names.vim-scripts.org.json', 1) + if a:bang || !filereadable(f) + if 0 != s:fetch_scripts(f) + return [] + end + endif + return eval(readfile(f, 'b')[0]) +endf