diff --git a/bashrc b/bashrc index 1d46448..9546680 100644 --- a/bashrc +++ b/bashrc @@ -32,7 +32,7 @@ ec2-info() { } export EDITOR=vim export GOPATH=$HOME/code/go -export PATH=$HOME/bin:/usr/local/go/bin:$HOME/perl5/bin:/usr/sbin/:$GOPATH/bin:$HOME/bin/vim/vim-8.0.1481/bin/bin/:$HOME/Library/Python/2.7/bin:$PATH +export PATH=$HOME/bin:$HOME/bin/fzf/bin/:$HOME/gobin/go/bin/:/usr/local/go/bin:$HOME/perl5/bin:/usr/sbin/:$GOPATH/bin:$HOME/Library/Python/2.7/bin:$HOME/bin/vim/vim-8.0.1481/bin/bin/:$PATH [ -f $HOME/perl5/lib/perl5/Devel/Local.pm ] && source `which devel-local.sh` function github() { git clone git@github.com:SocialFlowDev/$1.git diff --git a/install.sh b/install.sh index d8d4469..9ed1ce9 100755 --- a/install.sh +++ b/install.sh @@ -8,13 +8,7 @@ DIR="$(pwd)" ln -sf "$DIR/jsbeautifyrc" "$HOME/.jsbeautifyrc" ln -sf "$DIR/jshintrc" "$HOME/.jshintrc" mkdir -p "$HOME/.vim/colors" - mkdir -p "$HOME/.vim/plugin" - mkdir -p "$HOME/.vim/autoload" mkdir -p "$HOME/.ssh" ln -sf "$DIR/ssh-config" "$HOME/.ssh/config" ln -sf "$DIR/vim-colors/molokaimod.vim" "$HOME/.vim/colors/molokaimod.vim" - ln -sf "$DIR/vim-plugin/ack.vim" "$HOME/.vim/plugin/ack.vim" - ln -sf "$DIR/vim-plugin/openssl.vim" "$HOME/.vim/plugin/openssl.vim" - ln -sf "$DIR/vim-plugin/gnupg.vim" "$HOME/.vim/plugin/gnupg.vim" - ln -sf "$DIR/vim-autoload/pathogen.vim" "$HOME/.vim/autoload/pathogen.vim" - ln -sf "$DIR/vim-bundle" "$HOME/.vim/bundle" + ln -sf "$DIR/vim-autoload" "$HOME/.vim/autoload" diff --git a/ssh-config b/ssh-config index dc17e3f..fc94065 100644 --- a/ssh-config +++ b/ssh-config @@ -17,7 +17,7 @@ Host *.mars.sfsrv.net Host *.saturn.sfsrv.net User appuser ConnectTimeout 30 - #ProxyCommand docker exec -i saturnvpn nc -q0 %h %p 2>/dev/null + ProxyCommand docker exec -i saturnvpn nc -q0 %h %p 2>/dev/null StrictHostKeyChecking false KbdInteractiveAuthentication false diff --git a/tmux.conf b/tmux.conf index 137dac8..0d9d5f6 100644 --- a/tmux.conf +++ b/tmux.conf @@ -97,5 +97,5 @@ bind k next-window unbind @ bind @ command-prompt -p "join pane to:" "join-pane -t '%%'" -set-option -g default-command "reattach-to-user-namespace -l bash" +if-shell "uname | grep -q Darwin" "set-option -g default-command \"reattach-to-user-namespace -l bash\"" diff --git a/vim-autoload/pathogen.vim b/vim-autoload/pathogen.vim deleted file mode 100644 index a13ae08..0000000 --- a/vim-autoload/pathogen.vim +++ /dev/null @@ -1,347 +0,0 @@ -" pathogen.vim - path option manipulation -" Maintainer: Tim Pope -" Version: 2.3 - -" Install in ~/.vim/autoload (or ~\vimfiles\autoload). -" -" For management of individually installed plugins in ~/.vim/bundle (or -" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your -" .vimrc is the only other setup necessary. -" -" The API is documented inline below. - -if exists("g:loaded_pathogen") || &cp - finish -endif -let g:loaded_pathogen = 1 - -" Point of entry for basic default usage. Give a relative path to invoke -" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke -" pathogen#surround(). Curly braces are expanded with pathogen#expand(): -" "bundle/{}" finds all subdirectories inside "bundle" inside all directories -" in the runtime path. -function! pathogen#infect(...) abort - for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}'] - if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]' - call pathogen#surround(path) - elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)' - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#surround(path . '/{}') - elseif path =~# '[{}*]' - call pathogen#interpose(path) - else - call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')') - call pathogen#interpose(path . '/{}') - endif - endfor - call pathogen#cycle_filetype() - if pathogen#is_disabled($MYVIMRC) - return 'finish' - endif - return '' -endfunction - -" Split a path into a list. -function! pathogen#split(path) abort - if type(a:path) == type([]) | return a:path | endif - if empty(a:path) | return [] | endif - let split = split(a:path,'\\\@]','\\&','') - endif -endfunction - -" Like findfile(), but hardcoded to use the runtimepath. -function! pathogen#runtime_findfile(file,count) abort "{{{1 - let rtp = pathogen#join(1,pathogen#split(&rtp)) - let file = findfile(a:file,rtp,a:count) - if file ==# '' - return '' - else - return fnamemodify(file,':p') - endif -endfunction - -" Section: Deprecated - -function! s:warn(msg) abort - echohl WarningMsg - echomsg a:msg - echohl NONE -endfunction - -" Prepend all subdirectories of path to the rtp, and append all 'after' -" directories in those subdirectories. Deprecated. -function! pathogen#runtime_prepend_subdirectories(path) abort - call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')') - return pathogen#surround(a:path . pathogen#slash() . '{}') -endfunction - -function! pathogen#incubate(...) abort - let name = a:0 ? a:1 : 'bundle/{}' - call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')') - return pathogen#interpose(name) -endfunction - -" Deprecated alias for pathogen#interpose(). -function! pathogen#runtime_append_all_bundles(...) abort - if a:0 - call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')') - else - call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()') - endif - return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}') -endfunction - -if exists(':Vedit') - finish -endif - -let s:vopen_warning = 0 - -function! s:find(count,cmd,file,lcd) - let rtp = pathogen#join(1,pathogen#split(&runtimepath)) - let file = pathogen#runtime_findfile(a:file,a:count) - if file ==# '' - return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'" - endif - if !s:vopen_warning - let s:vopen_warning = 1 - let warning = '|echohl WarningMsg|echo "Install scriptease.vim to continue using :V'.a:cmd.'"|echohl NONE' - else - let warning = '' - endif - if a:lcd - let path = file[0:-strlen(a:file)-2] - execute 'lcd `=path`' - return a:cmd.' '.pathogen#fnameescape(a:file) . warning - else - return a:cmd.' '.pathogen#fnameescape(file) . warning - endif -endfunction - -function! s:Findcomplete(A,L,P) - let sep = pathogen#slash() - let cheats = { - \'a': 'autoload', - \'d': 'doc', - \'f': 'ftplugin', - \'i': 'indent', - \'p': 'plugin', - \'s': 'syntax'} - if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0]) - let request = cheats[a:A[0]].a:A[1:-1] - else - let request = a:A - endif - let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*' - let found = {} - for path in pathogen#split(&runtimepath) - let path = expand(path, ':p') - let matches = split(glob(path.sep.pattern),"\n") - call map(matches,'isdirectory(v:val) ? v:val.sep : v:val') - call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]') - for match in matches - let found[match] = 1 - endfor - endfor - return sort(keys(found)) -endfunction - -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(,'edit',,0) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(,'edit',,0) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(,'edit',,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(,'split',,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(,'vsplit',,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(,'tabedit',,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(,'pedit',,1) -command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(,'read',,1) - -" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=': diff --git a/vim-autoload/plug.vim b/vim-autoload/plug.vim new file mode 100644 index 0000000..9dd02c0 --- /dev/null +++ b/vim-autoload/plug.vim @@ -0,0 +1,2504 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') || has('win64') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]).'/**' + for dir in ['ftdetect', 'ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if s:is_win + set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1 + elseif a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'batchfile': (s:is_win && (s:nvim || s:vim8)) ? tempname().'.bat' : '', + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd + if !empty(job.batchfile) + call writefile(["@echo off\r", cmd . "\r"], job.batchfile) + let cmd = job.batchfile + endif + let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], cmd) + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + if has_key(job, 'batchfile') && !empty(job.batchfile) + call delete(job.batchfile) + endif + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = !isdirectory(spec.dir) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg) + let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g') + let escaped = substitute(escaped, '%', '%%', 'g') + let escaped = substitute(escaped, '"', '\\^&', 'g') + let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g') + return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"' +endfunction + +function! s:shellesc(arg) + if &shell =~# 'cmd.exe$' + return s:shellesc_cmd(a:arg) + endif + return shellescape(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let diff = s:system_chomp('git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 's:shellesc(v:val)')), v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap :silent! call preview_commit() + nnoremap o :silent! call preview_commit() + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@ -" Version: 1.79 -" ============================================================================= - -" ** Static variables {{{1 -" s:ignore() {{{2 -fu! s:ignore() - let igdirs = [ - \ '\.git', - \ '\.hg', - \ '\.svn', - \ '_darcs', - \ '\.bzr', - \ '\.cdv', - \ '\~\.dep', - \ '\~\.dot', - \ '\~\.nib', - \ '\~\.plst', - \ '\.pc', - \ '_MTN', - \ 'blib', - \ 'CVS', - \ 'RCS', - \ 'SCCS', - \ '_sgbak', - \ 'autom4te\.cache', - \ 'cover_db', - \ '_build', - \ ] - let igfiles = [ - \ '\~$', - \ '#.+#$', - \ '[._].*\.swp$', - \ 'core\.\d+$', - \ '\.exe$', - \ '\.so$', - \ '\.bak$', - \ '\.png$', - \ '\.jpg$', - \ '\.gif$', - \ '\.zip$', - \ '\.rar$', - \ '\.tar\.gz$', - \ ] - retu { - \ 'dir': '\v[\/]('.join(igdirs, '|').')$', - \ 'file': '\v'.join(igfiles, '|'), - \ } -endf -" Script local vars {{{2 -let [s:pref, s:bpref, s:opts, s:new_opts, s:lc_opts] = - \ ['g:ctrlp_', 'b:ctrlp_', { - \ 'abbrev': ['s:abbrev', {}], - \ 'arg_map': ['s:argmap', 0], - \ 'buffer_func': ['s:buffunc', {}], - \ 'by_filename': ['s:byfname', 0], - \ 'custom_ignore': ['s:usrign', s:ignore()], - \ 'default_input': ['s:deftxt', 0], - \ 'dont_split': ['s:nosplit', 'netrw'], - \ 'dotfiles': ['s:showhidden', 0], - \ 'extensions': ['s:extensions', []], - \ 'follow_symlinks': ['s:folsym', 0], - \ 'highlight_match': ['s:mathi', [1, 'CtrlPMatch']], - \ 'jump_to_buffer': ['s:jmptobuf', 'Et'], - \ 'key_loop': ['s:keyloop', 0], - \ 'lazy_update': ['s:lazy', 0], - \ 'match_func': ['s:matcher', {}], - \ 'match_window': ['s:mw', ''], - \ 'match_window_bottom': ['s:mwbottom', 1], - \ 'match_window_reversed': ['s:mwreverse', 1], - \ 'max_depth': ['s:maxdepth', 40], - \ 'max_files': ['s:maxfiles', 10000], - \ 'max_height': ['s:mxheight', 10], - \ 'max_history': ['s:maxhst', exists('+hi') ? &hi : 20], - \ 'mruf_default_order': ['s:mrudef', 0], - \ 'open_func': ['s:openfunc', {}], - \ 'open_multi': ['s:opmul', '1v'], - \ 'open_new_file': ['s:newfop', 'v'], - \ 'prompt_mappings': ['s:urprtmaps', 0], - \ 'regexp_search': ['s:regexp', 0], - \ 'root_markers': ['s:rmarkers', []], - \ 'split_window': ['s:splitwin', 0], - \ 'status_func': ['s:status', {}], - \ 'tabpage_position': ['s:tabpage', 'ac'], - \ 'use_caching': ['s:caching', 1], - \ 'use_migemo': ['s:migemo', 0], - \ 'user_command': ['s:usrcmd', ''], - \ 'working_path_mode': ['s:pathmode', 'ra'], - \ }, { - \ 'open_multiple_files': 's:opmul', - \ 'regexp': 's:regexp', - \ 'reuse_window': 's:nosplit', - \ 'show_hidden': 's:showhidden', - \ 'switch_buffer': 's:jmptobuf', - \ }, { - \ 'root_markers': 's:rmarkers', - \ 'user_command': 's:usrcmd', - \ 'working_path_mode': 's:pathmode', - \ }] - -" Global options -let s:glbs = { 'magic': 1, 'to': 1, 'tm': 0, 'sb': 1, 'hls': 0, 'im': 0, - \ 'report': 9999, 'sc': 0, 'ss': 0, 'siso': 0, 'mfd': 200, 'ttimeout': 0, - \ 'gcr': 'a:blinkon0', 'ic': 1, 'lmap': '', 'mousef': 0, 'imd': 1 } - -" Keymaps -let [s:lcmap, s:prtmaps] = ['nn ', { - \ 'PrtBS()': ['', ''], - \ 'PrtDelete()': [''], - \ 'PrtDeleteWord()': [''], - \ 'PrtClear()': [''], - \ 'PrtSelectMove("j")': ['', ''], - \ 'PrtSelectMove("k")': ['', ''], - \ 'PrtSelectMove("t")': ['', ''], - \ 'PrtSelectMove("b")': ['', ''], - \ 'PrtSelectMove("u")': ['', ''], - \ 'PrtSelectMove("d")': ['', ''], - \ 'PrtHistory(-1)': [''], - \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], - \ 'AcceptSelection("h")': ['', '', ''], - \ 'AcceptSelection("t")': [''], - \ 'AcceptSelection("v")': ['', ''], - \ 'ToggleFocus()': [''], - \ 'ToggleRegex()': [''], - \ 'ToggleByFname()': [''], - \ 'ToggleType(1)': ['', ''], - \ 'ToggleType(-1)': ['', ''], - \ 'PrtExpandDir()': [''], - \ 'PrtInsert("c")': ['', ''], - \ 'PrtInsert()': [''], - \ 'PrtCurStart()': [''], - \ 'PrtCurEnd()': [''], - \ 'PrtCurLeft()': ['', '', ''], - \ 'PrtCurRight()': ['', ''], - \ 'PrtClearCache()': [''], - \ 'PrtDeleteEnt()': [''], - \ 'CreateNewFile()': [''], - \ 'MarkToOpen()': [''], - \ 'OpenMulti()': [''], - \ 'PrtExit()': ['', '', ''], - \ }] - -if !has('gui_running') - cal add(s:prtmaps['PrtBS()'], remove(s:prtmaps['PrtCurLeft()'], 0)) -en - -let s:compare_lim = 3000 - -let s:ficounts = {} - -let s:ccex = s:pref.'clear_cache_on_exit' - -" Regexp -let s:fpats = { - \ '^\(\\|\)\|\(\\|\)$': '\\|', - \ '^\\\(zs\|ze\|<\|>\)': '^\\\(zs\|ze\|<\|>\)', - \ '^\S\*$': '\*', - \ '^\S\\?$': '\\?', - \ } - -" Keypad -let s:kprange = { - \ 'Plus': '+', - \ 'Minus': '-', - \ 'Divide': '/', - \ 'Multiply': '*', - \ 'Point': '.', - \ } - -" Highlight groups -let s:hlgrps = { - \ 'NoEntries': 'Error', - \ 'Mode1': 'Character', - \ 'Mode2': 'LineNr', - \ 'Stats': 'Function', - \ 'Match': 'Identifier', - \ 'PrtBase': 'Comment', - \ 'PrtText': 'Normal', - \ 'PrtCursor': 'Constant', - \ } -" Get the options {{{2 -fu! s:opts(...) - unl! s:usrign s:usrcmd s:urprtmaps - for each in ['byfname', 'regexp', 'extensions'] | if exists('s:'.each) - let {each} = s:{each} - en | endfo - for [ke, va] in items(s:opts) - let {va[0]} = exists(s:pref.ke) ? {s:pref.ke} : va[1] - endfo - unl va - for [ke, va] in items(s:new_opts) - let {va} = {exists(s:pref.ke) ? s:pref.ke : va} - endfo - unl va - for [ke, va] in items(s:lc_opts) - if exists(s:bpref.ke) - unl {va} - let {va} = {s:bpref.ke} - en - endfo - " Match window options - cal s:match_window_opts() - " One-time values - if a:0 && a:1 != {} - unl va - for [ke, va] in items(a:1) - let opke = substitute(ke, '\(\w:\)\?ctrlp_', '', '') - if has_key(s:lc_opts, opke) - let sva = s:lc_opts[opke] - unl {sva} - let {sva} = va - en - endfo - en - for each in ['byfname', 'regexp'] | if exists(each) - let s:{each} = {each} - en | endfo - if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en - let s:maxdepth = min([s:maxdepth, 100]) - let s:glob = s:showhidden ? '.*\|*' : '*' - let s:igntype = empty(s:usrign) ? -1 : type(s:usrign) - let s:lash = ctrlp#utils#lash() - if s:keyloop - let [s:lazy, s:glbs['imd']] = [0, 0] - en - if s:lazy - cal extend(s:glbs, { 'ut': ( s:lazy > 1 ? s:lazy : 250 ) }) - en - " Extensions - if !( exists('extensions') && extensions == s:extensions ) - for each in s:extensions - exe 'ru autoload/ctrlp/'.each.'.vim' - endfo - en - " Keymaps - if type(s:urprtmaps) == 4 - cal extend(s:prtmaps, s:urprtmaps) - en -endf - -fu! s:match_window_opts() - let s:mw_pos = - \ s:mw =~ 'top\|bottom' ? matchstr(s:mw, 'top\|bottom') : - \ exists('g:ctrlp_match_window_bottom') ? ( s:mwbottom ? 'bottom' : 'top' ) - \ : 'bottom' - let s:mw_order = - \ s:mw =~ 'order:[^,]\+' ? matchstr(s:mw, 'order:\zs[^,]\+') : - \ exists('g:ctrlp_match_window_reversed') ? ( s:mwreverse ? 'btt' : 'ttb' ) - \ : 'btt' - let s:mw_max = - \ s:mw =~ 'max:[^,]\+' ? str2nr(matchstr(s:mw, 'max:\zs\d\+')) : - \ exists('g:ctrlp_max_height') ? s:mxheight - \ : 10 - let s:mw_min = - \ s:mw =~ 'min:[^,]\+' ? str2nr(matchstr(s:mw, 'min:\zs\d\+')) : 1 - let [s:mw_max, s:mw_min] = [max([s:mw_max, 1]), max([s:mw_min, 1])] - let s:mw_min = min([s:mw_min, s:mw_max]) - let s:mw_res = - \ s:mw =~ 'results:[^,]\+' ? str2nr(matchstr(s:mw, 'results:\zs\d\+')) - \ : min([s:mw_max, &lines]) - let s:mw_res = max([s:mw_res, 1]) -endf -"}}}1 -" * Open & Close {{{1 -fu! s:Open() - cal s:log(1) - cal s:getenv() - cal s:execextvar('enter') - sil! exe 'keepa' ( s:mw_pos == 'top' ? 'to' : 'bo' ) '1new ControlP' - cal s:buffunc(1) - let [s:bufnr, s:winw] = [bufnr('%'), winwidth(0)] - let [s:focus, s:prompt] = [1, ['', '', '']] - abc - if !exists('s:hstry') - let hst = filereadable(s:gethistloc()[1]) ? s:gethistdata() : [''] - let s:hstry = empty(hst) || !s:maxhst ? [''] : hst - en - for [ke, va] in items(s:glbs) | if exists('+'.ke) - sil! exe 'let s:glb_'.ke.' = &'.ke.' | let &'.ke.' = '.string(va) - en | endfo - if s:opmul != '0' && has('signs') - sign define ctrlpmark text=+> texthl=Search - en - cal s:setupblank() -endf - -fu! s:Close() - cal s:buffunc(0) - if winnr('$') == 1 - bw! - el - try | bun! - cat | clo! | endt - cal s:unmarksigns() - en - for key in keys(s:glbs) | if exists('+'.key) - sil! exe 'let &'.key.' = s:glb_'.key - en | endfo - if exists('s:glb_acd') | let &acd = s:glb_acd | en - let g:ctrlp_lines = [] - if s:winres[1] >= &lines && s:winres[2] == winnr('$') - exe s:winres[0].s:winres[0] - en - unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:cline s:init s:savestr - \ s:mrbs s:did_exp - cal ctrlp#recordhist() - cal s:execextvar('exit') - cal s:log(0) - let v:errmsg = s:ermsg - ec -endf -" * Clear caches {{{1 -fu! ctrlp#clr(...) - let [s:matches, g:ctrlp_new{ a:0 ? a:1 : 'cache' }] = [1, 1] -endf - -fu! ctrlp#clra() - let cadir = ctrlp#utils#cachedir() - if isdirectory(cadir) - let cafiles = split(s:glbpath(s:fnesc(cadir, 'g', ','), '**', 1), "\n") - let eval = '!isdirectory(v:val) && v:val !~ ''\v[\/]cache[.a-z]+$|\.log$''' - sil! cal map(s:ifilter(cafiles, eval), 'delete(v:val)') - en - cal ctrlp#clr() -endf - -fu! s:Reset(args) - let opts = has_key(a:args, 'opts') ? [a:args['opts']] : [] - cal call('s:opts', opts) - cal s:autocmds() - cal ctrlp#utils#opts() - cal s:execextvar('opts') -endf -" * Files {{{1 -fu! ctrlp#files() - let cafile = ctrlp#utils#cachefile() - if g:ctrlp_newcache || !filereadable(cafile) || s:nocache(cafile) - let [lscmd, s:initcwd, g:ctrlp_allfiles] = [s:lsCmd(), s:dyncwd, []] - " Get the list of files - if empty(lscmd) - if !ctrlp#igncwd(s:dyncwd) - cal s:GlobPath(s:fnesc(s:dyncwd, 'g', ','), 0) - en - el - sil! cal ctrlp#progress('Indexing...') - try | cal s:UserCmd(lscmd) - cat | retu [] | endt - en - " Remove base directory - cal ctrlp#rmbasedir(g:ctrlp_allfiles) - if len(g:ctrlp_allfiles) <= s:compare_lim - cal sort(g:ctrlp_allfiles, 'ctrlp#complen') - en - cal s:writecache(cafile) - let catime = getftime(cafile) - el - let catime = getftime(cafile) - if !( exists('s:initcwd') && s:initcwd == s:dyncwd ) - \ || get(s:ficounts, s:dyncwd, [0, catime])[1] != catime - let s:initcwd = s:dyncwd - let g:ctrlp_allfiles = ctrlp#utils#readfile(cafile) - en - en - cal extend(s:ficounts, { s:dyncwd : [len(g:ctrlp_allfiles), catime] }) - retu g:ctrlp_allfiles -endf - -fu! s:GlobPath(dirs, depth) - let entries = split(globpath(a:dirs, s:glob), "\n") - let [dnf, depth] = [ctrlp#dirnfile(entries), a:depth + 1] - cal extend(g:ctrlp_allfiles, dnf[1]) - if !empty(dnf[0]) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth - sil! cal ctrlp#progress(len(g:ctrlp_allfiles), 1) - cal s:GlobPath(join(map(dnf[0], 's:fnesc(v:val, "g", ",")'), ','), depth) - en -endf - -fu! s:UserCmd(lscmd) - let [path, lscmd] = [s:dyncwd, a:lscmd] - let do_ign = - \ type(s:usrcmd) == 4 && has_key(s:usrcmd, 'ignore') && s:usrcmd['ignore'] - if do_ign && ctrlp#igncwd(s:cwd) | retu | en - if exists('+ssl') && &ssl - let [ssl, &ssl, path] = [&ssl, 0, tr(path, '/', '\')] - en - if has('win32') || has('win64') - let lscmd = substitute(lscmd, '\v(^|\&\&\s*)\zscd (/d)@!', 'cd /d ', '') - en - let path = exists('*shellescape') ? shellescape(path) : path - let g:ctrlp_allfiles = split(system(printf(lscmd, path)), "\n") - if exists('+ssl') && exists('ssl') - let &ssl = ssl - cal map(g:ctrlp_allfiles, 'tr(v:val, "\\", "/")') - en - if exists('s:vcscmd') && s:vcscmd - cal map(g:ctrlp_allfiles, 'tr(v:val, "/", "\\")') - en - if do_ign - if !empty(s:usrign) - let g:ctrlp_allfiles = ctrlp#dirnfile(g:ctrlp_allfiles)[1] - en - if &wig != '' - cal filter(g:ctrlp_allfiles, 'glob(v:val) != ""') - en - en -endf - -fu! s:lsCmd() - let cmd = s:usrcmd - if type(cmd) == 1 - retu cmd - elsei type(cmd) == 3 && len(cmd) >= 2 && cmd[:1] != ['', ''] - if s:findroot(s:dyncwd, cmd[0], 0, 1) == [] - retu len(cmd) == 3 ? cmd[2] : '' - en - let s:vcscmd = s:lash == '\' - retu cmd[1] - elsei type(cmd) == 4 && ( has_key(cmd, 'types') || has_key(cmd, 'fallback') ) - let fndroot = [] - if has_key(cmd, 'types') && cmd['types'] != {} - let [markrs, cmdtypes] = [[], values(cmd['types'])] - for pair in cmdtypes - cal add(markrs, pair[0]) - endfo - let fndroot = s:findroot(s:dyncwd, markrs, 0, 1) - en - if fndroot == [] - retu has_key(cmd, 'fallback') ? cmd['fallback'] : '' - en - for pair in cmdtypes - if pair[0] == fndroot[0] | brea | en - endfo - let s:vcscmd = s:lash == '\' - retu pair[1] - en -endf -" - Buffers {{{1 -fu! ctrlp#buffers(...) - let ids = sort(filter(range(1, bufnr('$')), 'empty(getbufvar(v:val, "&bt"))' - \ .' && getbufvar(v:val, "&bl")'), 's:compmreb') - if a:0 && a:1 == 'id' - retu ids - el - let bufs = [[], []] - for id in ids - let bname = bufname(id) - let ebname = bname == '' - let fname = fnamemodify(ebname ? '['.id.'*No Name]' : bname, ':.') - cal add(bufs[ebname], fname) - endfo - retu bufs[0] + bufs[1] - en -endf -" * MatchedItems() {{{1 -fu! s:MatchIt(items, pat, limit, exc) - let [lines, id] = [[], 0] - let pat = - \ s:byfname() ? map(split(a:pat, '^[^;]\+\\\@= 0 - cal add(lines, item) - en | cat | brea | endt - if a:limit > 0 && len(lines) >= a:limit | brea | en - endfo - let s:mdata = [s:dyncwd, s:itemtype, s:regexp, s:sublist(a:items, id, -1)] - retu lines -endf - -fu! s:MatchedItems(items, pat, limit) - let exc = exists('s:crfilerel') ? s:crfilerel : '' - let items = s:narrowable() ? s:matched + s:mdata[3] : a:items - if s:matcher != {} - let argms = - \ has_key(s:matcher, 'arg_type') && s:matcher['arg_type'] == 'dict' ? [{ - \ 'items': items, - \ 'str': a:pat, - \ 'limit': a:limit, - \ 'mmode': s:mmode(), - \ 'ispath': s:ispath, - \ 'crfile': exc, - \ 'regex': s:regexp, - \ }] : [items, a:pat, a:limit, s:mmode(), s:ispath, exc, s:regexp] - let lines = call(s:matcher['match'], argms, s:matcher) - el - let lines = s:MatchIt(items, a:pat, a:limit, exc) - en - let s:matches = len(lines) - unl! s:did_exp - retu lines -endf - -fu! s:SplitPattern(str) - let str = a:str - if s:migemo && s:regexp && len(str) > 0 && executable('cmigemo') - let str = s:migemo(str) - en - let s:savestr = str - if s:regexp - let pat = s:regexfilter(str) - el - let lst = split(str, '\zs') - if exists('+ssl') && !&ssl - cal map(lst, 'escape(v:val, ''\'')') - en - for each in ['^', '$', '.'] - cal map(lst, 'escape(v:val, each)') - endfo - en - if exists('lst') - let pat = '' - if !empty(lst) - if s:byfname() && index(lst, ';') > 0 - let fbar = index(lst, ';') - let lst_1 = s:sublist(lst, 0, fbar - 1) - let lst_2 = len(lst) - 1 > fbar ? s:sublist(lst, fbar + 1, -1) : [''] - let pat = s:buildpat(lst_1).';'.s:buildpat(lst_2) - el - let pat = s:buildpat(lst) - en - en - en - retu escape(pat, '~') -endf -" * BuildPrompt() {{{1 -fu! s:Render(lines, pat) - let [&ma, lines, s:res_count] = [1, a:lines, len(a:lines)] - let height = min([max([s:mw_min, s:res_count]), s:winmaxh]) - let pat = s:byfname() ? split(a:pat, '^[^;]\+\\\@' ).( s:byfname() ? 'd' : '>' ).'> ' - let str = escape(s:getinput(), '\') - let lazy = str == '' || exists('s:force') || !has('autocmd') ? 0 : s:lazy - if a:upd && !lazy && ( s:matches || s:regexp || exists('s:did_exp') - \ || str =~ '\(\\\(<\|>\)\|[*|]\)\|\(\\\:\([^:]\|\\:\)*$\)' ) - sil! cal s:Update(str) - en - sil! cal ctrlp#statusline() - " Toggling - let [hiactive, hicursor, base] = s:focus - \ ? ['CtrlPPrtText', 'CtrlPPrtCursor', base] - \ : ['CtrlPPrtBase', 'CtrlPPrtBase', tr(base, '>', '-')] - let hibase = 'CtrlPPrtBase' - " Build it - redr - let prt = copy(s:prompt) - cal map(prt, 'escape(v:val, ''"\'')') - exe 'echoh' hibase '| echon "'.base.'" - \ | echoh' hiactive '| echon "'.prt[0].'" - \ | echoh' hicursor '| echon "'.prt[1].'" - \ | echoh' hiactive '| echon "'.prt[2].'" | echoh None' - " Append the cursor at the end - if empty(prt[1]) && s:focus - exe 'echoh' hibase '| echon "_" | echoh None' - en -endf -" - SetDefTxt() {{{1 -fu! s:SetDefTxt() - if s:deftxt == '0' || ( s:deftxt == 1 && !s:ispath ) | retu | en - let txt = s:deftxt - if !type(txt) - let path = s:crfpath.s:lash(s:crfpath) - let txt = txt && !stridx(path, s:dyncwd) ? ctrlp#rmbasedir([path])[0] : '' - en - let s:prompt[0] = txt -endf -" ** Prt Actions {{{1 -" Editing {{{2 -fu! s:PrtClear() - if !s:focus | retu | en - unl! s:hstgot - let [s:prompt, s:matches] = [['', '', ''], 1] - cal s:BuildPrompt(1) -endf - -fu! s:PrtAdd(char) - unl! s:hstgot - let s:act_add = 1 - let s:prompt[0] .= a:char - cal s:BuildPrompt(1) - unl s:act_add -endf - -fu! s:PrtBS() - if !s:focus | retu | en - unl! s:hstgot - let [s:prompt[0], s:matches] = [substitute(s:prompt[0], '.$', '', ''), 1] - cal s:BuildPrompt(1) -endf - -fu! s:PrtDelete() - if !s:focus | retu | en - unl! s:hstgot - let [prt, s:matches] = [s:prompt, 1] - let prt[1] = matchstr(prt[2], '^.') - let prt[2] = substitute(prt[2], '^.', '', '') - cal s:BuildPrompt(1) -endf - -fu! s:PrtDeleteWord() - if !s:focus | retu | en - unl! s:hstgot - let [str, s:matches] = [s:prompt[0], 1] - let str = str =~ '\W\w\+$' ? matchstr(str, '^.\+\W\ze\w\+$') - \ : str =~ '\w\W\+$' ? matchstr(str, '^.\+\w\ze\W\+$') - \ : str =~ '\s\+$' ? matchstr(str, '^.*\S\ze\s\+$') - \ : str =~ '\v^(\S+|\s+)$' ? '' : str - let s:prompt[0] = str - cal s:BuildPrompt(1) -endf - -fu! s:PrtInsert(...) - if !s:focus | retu | en - let type = !a:0 ? '' : a:1 - if !a:0 - let type = s:insertstr() - if type == 'cancel' | retu | en - en - if type ==# 'r' - let regcont = s:getregs() - if regcont < 0 | retu | en - en - unl! s:hstgot - let s:act_add = 1 - let s:prompt[0] .= type ==# 'w' ? s:crword - \ : type ==# 'f' ? s:crgfile - \ : type ==# 's' ? s:regisfilter('/') - \ : type ==# 'v' ? s:crvisual - \ : type ==# 'c' ? s:regisfilter('+') - \ : type ==# 'r' ? regcont : '' - cal s:BuildPrompt(1) - unl s:act_add -endf - -fu! s:PrtExpandDir() - if !s:focus | retu | en - let str = s:getinput('c') - if str =~ '\v^\@(cd|lc[hd]?|chd)\s.+' && s:spi - let hasat = split(str, '\v^\@(cd|lc[hd]?|chd)\s*\zs') - let str = get(hasat, 1, '') - if str =~# '\v^[~$]\i{-}[\/]?|^#(\):(p|h|8|\~|\.|g?s+)' - let spc = str =~# '^%' ? s:crfile - \ : str =~# '^' ? s:crgfile - \ : str =~# '^' ? s:crword - \ : str =~# '^' ? s:crnbword : '' - let pat = '(:(p|h|8|\~|\.|g?s(.)[^\3]*\3[^\3]*\3))+' - let mdr = matchstr(str, '\v^[^:]+\zs'.pat) - let nmd = matchstr(str, '\v^[^:]+'.pat.'\zs.{-}$') - let str = fnamemodify(s:fnesc(spc, 'g'), mdr).nmd - en - en - if str == '' | retu | en - unl! s:hstgot - let s:act_add = 1 - let [base, seed] = s:headntail(str) - if str =~# '^[\/]' - let base = expand('/').base - en - let dirs = s:dircompl(base, seed) - if len(dirs) == 1 - let str = dirs[0] - elsei len(dirs) > 1 - let str .= s:findcommon(dirs, str) - en - let s:prompt[0] = exists('hasat') ? hasat[0].str : str - cal s:BuildPrompt(1) - unl s:act_add -endf -" Movement {{{2 -fu! s:PrtCurLeft() - if !s:focus | retu | en - let prt = s:prompt - if !empty(prt[0]) - let s:prompt = [substitute(prt[0], '.$', '', ''), matchstr(prt[0], '.$'), - \ prt[1] . prt[2]] - en - cal s:BuildPrompt(0) -endf - -fu! s:PrtCurRight() - if !s:focus | retu | en - let prt = s:prompt - let s:prompt = [prt[0] . prt[1], matchstr(prt[2], '^.'), - \ substitute(prt[2], '^.', '', '')] - cal s:BuildPrompt(0) -endf - -fu! s:PrtCurStart() - if !s:focus | retu | en - let str = join(s:prompt, '') - let s:prompt = ['', matchstr(str, '^.'), substitute(str, '^.', '', '')] - cal s:BuildPrompt(0) -endf - -fu! s:PrtCurEnd() - if !s:focus | retu | en - let s:prompt = [join(s:prompt, ''), '', ''] - cal s:BuildPrompt(0) -endf - -fu! s:PrtSelectMove(dir) - let wht = winheight(0) - let dirs = {'t': 'gg','b': 'G','j': 'j','k': 'k','u': wht.'k','d': wht.'j'} - exe 'keepj norm!' dirs[a:dir] - if s:nolim != 1 | let s:cline = line('.') | en - if line('$') > winheight(0) | cal s:BuildPrompt(0) | en -endf - -fu! s:PrtSelectJump(char) - let lines = copy(s:lines) - if s:byfname() - cal map(lines, 'split(v:val, ''[\/]\ze[^\/]\+$'')[-1]') - en - " Cycle through matches, use s:jmpchr to store last jump - let chr = escape(matchstr(a:char, '^.'), '.~') - let smartcs = &scs && chr =~ '\u' ? '\C' : '' - if match(lines, smartcs.'^'.chr) >= 0 - " If not exists or does but not for the same char - let pos = match(lines, smartcs.'^'.chr) - if !exists('s:jmpchr') || ( exists('s:jmpchr') && s:jmpchr[0] != chr ) - let [jmpln, s:jmpchr] = [pos, [chr, pos]] - elsei exists('s:jmpchr') && s:jmpchr[0] == chr - " Start of lines - if s:jmpchr[1] == -1 | let s:jmpchr[1] = pos | en - let npos = match(lines, smartcs.'^'.chr, s:jmpchr[1] + 1) - let [jmpln, s:jmpchr] = [npos == -1 ? pos : npos, [chr, npos]] - en - exe 'keepj norm!' ( jmpln + 1 ).'G' - if s:nolim != 1 | let s:cline = line('.') | en - if line('$') > winheight(0) | cal s:BuildPrompt(0) | en - en -endf -" Misc {{{2 -fu! s:PrtFocusMap(char) - cal call(( s:focus ? 's:PrtAdd' : 's:PrtSelectJump' ), [a:char]) -endf - -fu! s:PrtClearCache() - if s:itemtype == 0 - cal ctrlp#clr() - elsei s:itemtype > 2 - cal ctrlp#clr(s:statypes[s:itemtype][1]) - en - if s:itemtype == 2 - let g:ctrlp_lines = ctrlp#mrufiles#refresh() - el - cal ctrlp#setlines() - en - let s:force = 1 - cal s:BuildPrompt(1) - unl s:force -endf - -fu! s:PrtDeleteEnt() - if s:itemtype == 2 - cal s:PrtDeleteMRU() - elsei type(s:getextvar('wipe')) == 1 - cal s:delent(s:getextvar('wipe')) - en -endf - -fu! s:PrtDeleteMRU() - if s:itemtype == 2 - cal s:delent('ctrlp#mrufiles#remove') - en -endf - -fu! s:PrtExit() - if bufnr('%') == s:bufnr && bufname('%') == 'ControlP' - noa cal s:Close() - noa winc p - en -endf - -fu! s:PrtHistory(...) - if !s:focus || !s:maxhst | retu | en - let [str, hst, s:matches] = [join(s:prompt, ''), s:hstry, 1] - " Save to history if not saved before - let [hst[0], hslen] = [exists('s:hstgot') ? hst[0] : str, len(hst)] - let idx = exists('s:hisidx') ? s:hisidx + a:1 : a:1 - " Limit idx within 0 and hslen - let idx = idx < 0 ? 0 : idx >= hslen ? hslen > 1 ? hslen - 1 : 0 : idx - let s:prompt = [hst[idx], '', ''] - let [s:hisidx, s:hstgot, s:force] = [idx, 1, 1] - cal s:BuildPrompt(1) - unl s:force -endf -"}}}1 -" * Mappings {{{1 -fu! s:MapNorms() - if exists('s:nmapped') && s:nmapped == s:bufnr | retu | en - let pcmd = "nn \ \ \ :\cal \%s(\"%s\")\" - let cmd = substitute(pcmd, 'k%s', 'char-%d', '') - let pfunc = 'PrtFocusMap' - let ranges = [32, 33, 125, 126] + range(35, 91) + range(93, 123) - for each in [34, 92, 124] - exe printf(cmd, each, pfunc, escape(nr2char(each), '"|\')) - endfo - for each in ranges - exe printf(cmd, each, pfunc, nr2char(each)) - endfo - for each in range(0, 9) - exe printf(pcmd, each, pfunc, each) - endfo - for [ke, va] in items(s:kprange) - exe printf(pcmd, ke, pfunc, va) - endfo - let s:nmapped = s:bufnr -endf - -fu! s:MapSpecs() - if !( exists('s:smapped') && s:smapped == s:bufnr ) - " Correct arrow keys in terminal - if ( has('termresponse') && v:termresponse =~ "\" ) - \ || &term =~? '\vxterm|','\B ','\C ','\D '] - exe s:lcmap.' ['.each - endfo - en - en - for [ke, va] in items(s:prtmaps) | for kp in va - exe s:lcmap kp ':cal '.ke.'' - endfo | endfo - let s:smapped = s:bufnr -endf - -fu! s:KeyLoop() - wh exists('s:init') && s:keyloop - redr - let nr = getchar() - let chr = !type(nr) ? nr2char(nr) : nr - if nr >=# 0x20 - cal s:PrtFocusMap(chr) - el - let cmd = matchstr(maparg(chr), ':\zs.\+\ze$') - exe ( cmd != '' ? cmd : 'norm '.chr ) - en - endw -endf -" * Toggling {{{1 -fu! s:ToggleFocus() - let s:focus = !s:focus - cal s:BuildPrompt(0) -endf - -fu! s:ToggleRegex() - let s:regexp = !s:regexp - cal s:PrtSwitcher() -endf - -fu! s:ToggleByFname() - if s:ispath - let s:byfname = !s:byfname - let s:mfunc = s:mfunc() - cal s:PrtSwitcher() - en -endf - -fu! s:ToggleType(dir) - let max = len(g:ctrlp_ext_vars) + 2 - let next = s:walker(max, s:itemtype, a:dir) - cal ctrlp#syntax() - cal ctrlp#setlines(next) - cal s:PrtSwitcher() -endf - -fu! s:ToggleKeyLoop() - let s:keyloop = !s:keyloop - if exists('+imd') - let &imd = !s:keyloop - en - if s:keyloop - let [&ut, s:lazy] = [0, 0] - cal s:KeyLoop() - elsei has_key(s:glbs, 'ut') - let [&ut, s:lazy] = [s:glbs['ut'], 1] - en -endf - -fu! s:ToggleMRURelative() - cal ctrlp#mrufiles#tgrel() - cal s:PrtClearCache() -endf - -fu! s:PrtSwitcher() - let [s:force, s:matches] = [1, 1] - cal s:BuildPrompt(1) - unl s:force -endf -" - SetWD() {{{1 -fu! s:SetWD(args) - if has_key(a:args, 'args') && stridx(a:args['args'], '--dir') >= 0 - \ && exists('s:dyncwd') - cal ctrlp#setdir(s:dyncwd) | retu - en - if has_key(a:args, 'dir') && a:args['dir'] != '' - cal ctrlp#setdir(a:args['dir']) | retu - en - let pmode = has_key(a:args, 'mode') ? a:args['mode'] : s:pathmode - let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()] - if s:crfile =~ '^.\+://' | retu | en - if pmode =~ 'c' || ( pmode =~ 'a' && stridx(s:crfpath, s:cwd) < 0 ) - \ || ( !type(pmode) && pmode ) - if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en - cal ctrlp#setdir(s:crfpath) - en - if pmode =~ 'r' || pmode == 2 - let markers = ['.git', '.hg', '.svn', '.bzr', '_darcs'] - let spath = pmode =~ 'd' ? s:dyncwd : pmode =~ 'w' ? s:cwd : s:crfpath - if type(s:rmarkers) == 3 && !empty(s:rmarkers) - if s:findroot(spath, s:rmarkers, 0, 0) != [] | retu | en - cal filter(markers, 'index(s:rmarkers, v:val) < 0') - en - cal s:findroot(spath, markers, 0, 0) - en -endf -" * AcceptSelection() {{{1 -fu! ctrlp#acceptfile(...) - let useb = 0 - if a:0 == 1 && type(a:1) == 4 - let [md, line] = [a:1['action'], a:1['line']] - let atl = has_key(a:1, 'tail') ? a:1['tail'] : '' - el - let [md, line] = [a:1, a:2] - let atl = a:0 > 2 ? a:3 : '' - en - if !type(line) - let [filpath, bufnr, useb] = [line, line, 1] - el - let filpath = fnamemodify(line, ':p') - if s:nonamecond(line, filpath) - let bufnr = str2nr(matchstr(line, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) - let [filpath, useb] = [bufnr, 1] - el - let bufnr = bufnr('^'.filpath.'$') - en - en - cal s:PrtExit() - let tail = s:tail() - let j2l = atl != '' ? atl : matchstr(tail, '^ +\zs\d\+$') - if ( s:jmptobuf =~ md || ( s:jmptobuf && md =~ '[et]' ) ) && bufnr > 0 - \ && !( md == 'e' && bufnr == bufnr('%') ) - let [jmpb, bufwinnr] = [1, bufwinnr(bufnr)] - let buftab = ( s:jmptobuf =~# '[tTVH]' || s:jmptobuf > 1 ) - \ ? s:buftab(bufnr, md) : [0, 0] - en - " Switch to existing buffer or open new one - if exists('jmpb') && bufwinnr > 0 - \ && !( md == 't' && ( s:jmptobuf !~# toupper(md) || buftab[0] ) ) - exe bufwinnr.'winc w' - if j2l | cal ctrlp#j2l(j2l) | en - elsei exists('jmpb') && buftab[0] - \ && !( md =~ '[evh]' && s:jmptobuf !~# toupper(md) ) - exe 'tabn' buftab[0] - exe buftab[1].'winc w' - if j2l | cal ctrlp#j2l(j2l) | en - el - " Determine the command to use - let useb = bufnr > 0 && buflisted(bufnr) && ( empty(tail) || useb ) - let cmd = - \ md == 't' || s:splitwin == 1 ? ( useb ? 'tab sb' : 'tabe' ) : - \ md == 'h' || s:splitwin == 2 ? ( useb ? 'sb' : 'new' ) : - \ md == 'v' || s:splitwin == 3 ? ( useb ? 'vert sb' : 'vne' ) : - \ call('ctrlp#normcmd', useb ? ['b', 'bo vert sb'] : ['e']) - " Reset &switchbuf option - let [swb, &swb] = [&swb, ''] - " Open new window/buffer - let [fid, tail] = [( useb ? bufnr : filpath ), ( atl != '' ? ' +'.atl : tail )] - let args = [cmd, fid, tail, 1, [useb, j2l]] - cal call('s:openfile', args) - let &swb = swb - en -endf - -fu! s:SpecInputs(str) - if a:str =~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*)$' && s:spi - let cwd = s:dyncwd - cal ctrlp#setdir(a:str =~ '^\.\.\.*$' ? - \ '../'.repeat('../', strlen(a:str) - 2) : a:str) - if cwd != s:dyncwd | cal ctrlp#setlines() | en - cal s:PrtClear() - retu 1 - elsei a:str == s:lash && s:spi - cal s:SetWD({ 'mode': 'rd' }) - cal ctrlp#setlines() - cal s:PrtClear() - retu 1 - elsei a:str =~ '^@.\+' && s:spi - retu s:at(a:str) - elsei a:str == '?' - cal s:PrtExit() - let hlpwin = &columns > 159 ? '| vert res 80' : '' - sil! exe 'bo vert h ctrlp-mappings' hlpwin '| norm! 0' - retu 1 - en - retu 0 -endf - -fu! s:AcceptSelection(action) - let [md, icr] = [a:action[0], match(a:action, 'r') >= 0] - let subm = icr || ( !icr && md == 'e' ) - if !subm && s:OpenMulti(md) != -1 | retu | en - let str = s:getinput() - if subm | if s:SpecInputs(str) | retu | en | en - " Get the selected line - let line = ctrlp#getcline() - if !subm && !s:itemtype && line == '' && line('.') > s:offset - \ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$' - cal s:CreateNewFile(md) | retu - en - if empty(line) | retu | en - " Do something with it - if s:openfunc != {} && has_key(s:openfunc, s:ctype) - let actfunc = s:openfunc[s:ctype] - let type = has_key(s:openfunc, 'arg_type') ? s:openfunc['arg_type'] : 'list' - el - if s:itemtype < 3 - let [actfunc, type] = ['ctrlp#acceptfile', 'dict'] - el - let [actfunc, exttype] = [s:getextvar('accept'), s:getextvar('act_farg')] - let type = exttype == 'dict' ? exttype : 'list' - en - en - let actargs = type == 'dict' ? [{ 'action': md, 'line': line, 'icr': icr }] - \ : [md, line] - cal call(actfunc, actargs) -endf -" - CreateNewFile() {{{1 -fu! s:CreateNewFile(...) - let [md, str] = ['', s:getinput('n')] - if empty(str) | retu | en - if s:argmap && !a:0 - " Get the extra argument - let md = s:argmaps(md, 1) - if md == 'cancel' | retu | en - en - let str = s:sanstail(str) - let [base, fname] = s:headntail(str) - if fname =~ '^[\/]$' | retu | en - if exists('s:marked') && len(s:marked) - " Use the first marked file's path - let path = fnamemodify(values(s:marked)[0], ':p:h') - let base = path.s:lash(path).base - let str = fnamemodify(base.s:lash.fname, ':.') - en - if base != '' | if isdirectory(ctrlp#utils#mkdir(base)) - let optyp = str | en | el | let optyp = fname - en - if !exists('optyp') | retu | en - let [filpath, tail] = [fnamemodify(optyp, ':p'), s:tail()] - if !stridx(filpath, s:dyncwd) | cal s:insertcache(str) | en - cal s:PrtExit() - let cmd = md == 'r' ? ctrlp#normcmd('e') : - \ s:newfop =~ '1\|t' || ( a:0 && a:1 == 't' ) || md == 't' ? 'tabe' : - \ s:newfop =~ '2\|h' || ( a:0 && a:1 == 'h' ) || md == 'h' ? 'new' : - \ s:newfop =~ '3\|v' || ( a:0 && a:1 == 'v' ) || md == 'v' ? 'vne' : - \ ctrlp#normcmd('e') - cal s:openfile(cmd, filpath, tail, 1) -endf -" * OpenMulti() {{{1 -fu! s:MarkToOpen() - if s:bufnr <= 0 || s:opmul == '0' - \ || ( s:itemtype > 2 && s:getextvar('opmul') != 1 ) - retu - en - let line = ctrlp#getcline() - if empty(line) | retu | en - let filpath = s:ispath ? fnamemodify(line, ':p') : line - if exists('s:marked') && s:dictindex(s:marked, filpath) > 0 - " Unmark and remove the file from s:marked - let key = s:dictindex(s:marked, filpath) - cal remove(s:marked, key) - if empty(s:marked) | unl s:marked | en - if has('signs') - exe 'sign unplace' key 'buffer='.s:bufnr - en - el - " Add to s:marked and place a new sign - if exists('s:marked') - let vac = s:vacantdict(s:marked) - let key = empty(vac) ? len(s:marked) + 1 : vac[0] - let s:marked = extend(s:marked, { key : filpath }) - el - let [key, s:marked] = [1, { 1 : filpath }] - en - if has('signs') - exe 'sign place' key 'line='.line('.').' name=ctrlpmark buffer='.s:bufnr - en - en - sil! cal ctrlp#statusline() -endf - -fu! s:OpenMulti(...) - let has_marked = exists('s:marked') - if ( !has_marked && a:0 ) || s:opmul == '0' || !s:ispath - \ || ( s:itemtype > 2 && s:getextvar('opmul') != 1 ) - retu -1 - en - " Get the options - let [nr, md] = [matchstr(s:opmul, '\d\+'), matchstr(s:opmul, '[thvi]')] - let [ur, jf] = [s:opmul =~ 'r', s:opmul =~ 'j'] - let md = a:0 ? a:1 : ( md == '' ? 'v' : md ) - let nopt = exists('g:ctrlp_open_multiple_files') - if !has_marked - let line = ctrlp#getcline() - if line == '' | retu | en - let marked = { 1 : fnamemodify(line, ':p') } - let [nr, ur, jf, nopt] = ['1', 0, 0, 1] - en - if ( s:argmap || !has_marked ) && !a:0 - let md = s:argmaps(md, !has_marked ? 2 : 0) - if md == 'c' - cal s:unmarksigns() - unl! s:marked - cal s:BuildPrompt(0) - elsei !has_marked && md =~ '[axd]' - retu s:OpenNoMarks(md, line) - en - if md =~ '\v^c(ancel)?$' | retu | en - let nr = nr == '0' ? ( nopt ? '' : '1' ) : nr - let ur = !has_marked && md == 'r' ? 1 : ur - en - let mkd = values(has_marked ? s:marked : marked) - cal s:sanstail(join(s:prompt, '')) - cal s:PrtExit() - if nr == '0' || md == 'i' - retu map(mkd, "s:openfile('bad', v:val, '', 0)") - en - let tail = s:tail() - let [emptytail, bufnr] = [empty(tail), bufnr('^'.mkd[0].'$')] - let useb = bufnr > 0 && buflisted(bufnr) && emptytail - " Move to a replaceable window - let ncmd = ( useb ? ['b', 'bo vert sb'] : ['e', 'bo vne'] ) - \ + ( ur ? [] : ['ignruw'] ) - let fst = call('ctrlp#normcmd', ncmd) - " Check if the current window has a replaceable buffer - let repabl = !( md == 't' && !ur ) && empty(bufname('%')) && empty(&l:ft) - " Commands for the rest of the files - let [ic, cmds] = [1, { 'v': ['vert sb', 'vne'], 'h': ['sb', 'new'], - \ 't': ['tab sb', 'tabe'] }] - let [swb, &swb] = [&swb, ''] - if md == 't' && ctrlp#tabcount() < tabpagenr() - let s:tabct = ctrlp#tabcount() - en - " Open the files - for va in mkd - let bufnr = bufnr('^'.va.'$') - if bufnr < 0 && getftype(va) == '' | con | en - let useb = bufnr > 0 && buflisted(bufnr) && emptytail - let snd = md != '' && has_key(cmds, md) ? - \ ( useb ? cmds[md][0] : cmds[md][1] ) : ( useb ? 'vert sb' : 'vne' ) - let cmd = ic == 1 && ( !( !ur && fst =~ '^[eb]$' ) || repabl ) ? fst : snd - let conds = [( nr != '' && nr > 1 && nr < ic ) || ( nr == '' && ic > 1 ), - \ nr != '' && nr < ic] - if conds[nopt] - if !buflisted(bufnr) | cal s:openfile('bad', va, '', 0) | en - el - cal s:openfile(cmd, useb ? bufnr : va, tail, ic == 1) - if jf | if ic == 1 - let crpos = [tabpagenr(), winnr()] - el - let crpos[0] += tabpagenr() <= crpos[0] - let crpos[1] += winnr() <= crpos[1] - en | en - let ic += 1 - en - endfo - if jf && exists('crpos') && ic > 2 - exe ( md == 't' ? 'tabn '.crpos[0] : crpos[1].'winc w' ) - en - let &swb = swb - unl! s:tabct -endf - -fu! s:OpenNoMarks(md, line) - if a:md == 'a' - let [s:marked, key] = [{}, 1] - for line in s:lines - let s:marked = extend(s:marked, { key : fnamemodify(line, ':p') }) - let key += 1 - endfo - cal s:remarksigns() - cal s:BuildPrompt(0) - elsei a:md == 'x' - let type = has_key(s:openfunc, 'arg_type') ? s:openfunc['arg_type'] : 'dict' - let argms = type == 'dict' ? [{ 'action': a:md, 'line': a:line }] - \ : [a:md, a:line] - cal call(s:openfunc[s:ctype], argms, s:openfunc) - elsei a:md == 'd' - let dir = fnamemodify(a:line, ':h') - if isdirectory(dir) - cal ctrlp#setdir(dir) - cal ctrlp#switchtype(0) - cal ctrlp#recordhist() - cal s:PrtClear() - en - en -endf -" ** Helper functions {{{1 -" Sorting {{{2 -fu! ctrlp#complen(...) - " By length - let [len1, len2] = [strlen(a:1), strlen(a:2)] - retu len1 == len2 ? 0 : len1 > len2 ? 1 : -1 -endf - -fu! s:compmatlen(...) - " By match length - let mln1 = s:shortest(s:matchlens(a:1, s:compat)) - let mln2 = s:shortest(s:matchlens(a:2, s:compat)) - retu mln1 == mln2 ? 0 : mln1 > mln2 ? 1 : -1 -endf - -fu! s:comptime(...) - " By last modified time - let [time1, time2] = [getftime(a:1), getftime(a:2)] - retu time1 == time2 ? 0 : time1 < time2 ? 1 : -1 -endf - -fu! s:compmreb(...) - " By last entered time (bufnr) - let [id1, id2] = [index(s:mrbs, a:1), index(s:mrbs, a:2)] - retu id1 == id2 ? 0 : id1 > id2 ? 1 : -1 -endf - -fu! s:compmref(...) - " By last entered time (MRU) - let [id1, id2] = [index(g:ctrlp_lines, a:1), index(g:ctrlp_lines, a:2)] - retu id1 == id2 ? 0 : id1 > id2 ? 1 : -1 -endf - -fu! s:comparent(...) - " By same parent dir - if !stridx(s:crfpath, s:dyncwd) - let [as1, as2] = [s:dyncwd.s:lash().a:1, s:dyncwd.s:lash().a:2] - let [loc1, loc2] = [s:getparent(as1), s:getparent(as2)] - if loc1 == s:crfpath && loc2 != s:crfpath | retu -1 | en - if loc2 == s:crfpath && loc1 != s:crfpath | retu 1 | en - retu 0 - en - retu 0 -endf - -fu! s:compfnlen(...) - " By filename length - let len1 = strlen(split(a:1, s:lash)[-1]) - let len2 = strlen(split(a:2, s:lash)[-1]) - retu len1 == len2 ? 0 : len1 > len2 ? 1 : -1 -endf - -fu! s:matchlens(str, pat, ...) - if empty(a:pat) || index(['^', '$'], a:pat) >= 0 | retu {} | en - let st = a:0 ? a:1 : 0 - let lens = a:0 >= 2 ? a:2 : {} - let nr = a:0 >= 3 ? a:3 : 0 - if nr > 20 | retu {} | en - if match(a:str, a:pat, st) >= 0 - let [mst, mnd] = [matchstr(a:str, a:pat, st), matchend(a:str, a:pat, st)] - let lens = extend(lens, { nr : [strlen(mst), mst] }) - let lens = s:matchlens(a:str, a:pat, mnd, lens, nr + 1) - en - retu lens -endf - -fu! s:shortest(lens) - retu min(map(values(a:lens), 'v:val[0]')) -endf - -fu! s:mixedsort(...) - if s:itemtype == 1 - let pat = '[\/]\?\[\d\+\*No Name\]$' - if a:1 =~# pat && a:2 =~# pat | retu 0 - elsei a:1 =~# pat | retu 1 - elsei a:2 =~# pat | retu -1 | en - en - let [cln, cml] = [ctrlp#complen(a:1, a:2), s:compmatlen(a:1, a:2)] - if s:ispath - let ms = [] - if s:res_count < 21 - let ms += [s:compfnlen(a:1, a:2)] - if s:itemtype !~ '^[12]$' | let ms += [s:comptime(a:1, a:2)] | en - if !s:itemtype | let ms += [s:comparent(a:1, a:2)] | en - en - if s:itemtype =~ '^[12]$' - let ms += [s:compmref(a:1, a:2)] - let cln = cml ? cln : 0 - en - let ms += [cml, 0, 0, 0] - let mp = call('s:multipliers', ms[:3]) - retu cln + ms[0] * mp[0] + ms[1] * mp[1] + ms[2] * mp[2] + ms[3] * mp[3] - en - retu cln + cml * 2 -endf - -fu! s:multipliers(...) - let mp0 = !a:1 ? 0 : 2 - let mp1 = !a:2 ? 0 : 1 + ( !mp0 ? 1 : mp0 ) - let mp2 = !a:3 ? 0 : 1 + ( !( mp0 + mp1 ) ? 1 : ( mp0 + mp1 ) ) - let mp3 = !a:4 ? 0 : 1 + ( !( mp0 + mp1 + mp2 ) ? 1 : ( mp0 + mp1 + mp2 ) ) - retu [mp0, mp1, mp2, mp3] -endf - -fu! s:compval(...) - retu a:1 - a:2 -endf -" Statusline {{{2 -fu! ctrlp#statusline() - if !exists('s:statypes') - let s:statypes = [ - \ ['files', 'fil'], - \ ['buffers', 'buf'], - \ ['mru files', 'mru'], - \ ] - if !empty(g:ctrlp_ext_vars) - cal map(copy(g:ctrlp_ext_vars), - \ 'add(s:statypes, [ v:val["lname"], v:val["sname"] ])') - en - en - let tps = s:statypes - let max = len(tps) - 1 - let nxt = tps[s:walker(max, s:itemtype, 1)][1] - let prv = tps[s:walker(max, s:itemtype, -1)][1] - let s:ctype = tps[s:itemtype][0] - let focus = s:focus ? 'prt' : 'win' - let byfname = s:ispath ? s:byfname ? 'file' : 'path' : 'line' - let marked = s:opmul != '0' ? - \ exists('s:marked') ? ' <'.s:dismrk().'>' : ' <->' : '' - if s:status != {} - let argms = - \ has_key(s:status, 'arg_type') && s:status['arg_type'] == 'dict' ? [{ - \ 'focus': focus, - \ 'byfname': byfname, - \ 'regex': s:regexp, - \ 'prev': prv, - \ 'item': s:ctype, - \ 'next': nxt, - \ 'marked': marked, - \ }] : [focus, byfname, s:regexp, prv, s:ctype, nxt, marked] - let &l:stl = call(s:status['main'], argms, s:status) - el - let item = '%#CtrlPMode1# '.s:ctype.' %*' - let focus = '%#CtrlPMode2# '.focus.' %*' - let byfname = '%#CtrlPMode1# '.byfname.' %*' - let regex = s:regexp ? '%#CtrlPMode2# regex %*' : '' - let slider = ' <'.prv.'>={'.item.'}=<'.nxt.'>' - let dir = ' %=%<%#CtrlPMode2# %{getcwd()} %*' - let &l:stl = focus.byfname.regex.slider.marked.dir - en -endf - -fu! s:dismrk() - retu has('signs') ? len(s:marked) : - \ '%<'.join(values(map(copy(s:marked), 'split(v:val, "[\\/]")[-1]')), ', ') -endf - -fu! ctrlp#progress(enum, ...) - if has('macunix') || has('mac') | sl 1m | en - let txt = a:0 ? '(press ctrl-c to abort)' : '' - if s:status != {} - let argms = has_key(s:status, 'arg_type') && s:status['arg_type'] == 'dict' - \ ? [{ 'str': a:enum }] : [a:enum] - let &l:stl = call(s:status['prog'], argms, s:status) - el - let &l:stl = '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*' - en - redraws -endf -" *** Paths {{{2 -" Line formatting {{{3 -fu! s:formatline(str) - let str = a:str - if s:itemtype == 1 - let filpath = fnamemodify(str, ':p') - let bufnr = s:nonamecond(str, filpath) - \ ? str2nr(matchstr(str, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) - \ : bufnr('^'.filpath.'$') - let idc = ( bufnr == bufnr('#') ? '#' : '' ) - \ . ( getbufvar(bufnr, '&ma') ? '' : '-' ) - \ . ( getbufvar(bufnr, '&ro') ? '=' : '' ) - \ . ( getbufvar(bufnr, '&mod') ? '+' : '' ) - let str .= idc != '' ? ' '.idc : '' - en - let cond = s:ispath && ( s:winw - 4 ) < s:strwidth(str) - retu '> '.( cond ? s:pathshorten(str) : str ) -endf - -fu! s:pathshorten(str) - retu matchstr(a:str, '^.\{9}').'...' - \ .matchstr(a:str, '.\{'.( s:winw - 16 ).'}$') -endf - -fu! s:offset(lines, height) - let s:offset = s:mw_order == 'btt' ? ( a:height - s:res_count ) : 0 - retu s:offset > 0 ? ( repeat([''], s:offset) + a:lines ) : a:lines -endf -" Directory completion {{{3 -fu! s:dircompl(be, sd) - if a:sd == '' | retu [] | en - if a:be == '' - let [be, sd] = [s:dyncwd, a:sd] - el - let be = a:be.s:lash(a:be) - let sd = be.a:sd - en - let dirs = split(globpath(s:fnesc(be, 'g', ','), a:sd.'*/'), "\n") - if a:be == '' - let dirs = ctrlp#rmbasedir(dirs) - en - cal filter(dirs, '!match(v:val, escape(sd, ''~$.\''))' - \ . ' && v:val !~ ''\v(^|[\/])\.{1,2}[\/]$''') - retu dirs -endf - -fu! s:findcommon(items, seed) - let [items, id, cmn, ic] = [copy(a:items), strlen(a:seed), '', 0] - cal map(items, 'strpart(v:val, id)') - for char in split(items[0], '\zs') - for item in items[1:] - if item[ic] != char | let brk = 1 | brea | en - endfo - if exists('brk') | brea | en - let cmn .= char - let ic += 1 - endfo - retu cmn -endf -" Misc {{{3 -fu! s:headntail(str) - let parts = split(a:str, '[\/]\ze[^\/]\+[\/:]\?$') - retu len(parts) == 1 ? ['', parts[0]] : len(parts) == 2 ? parts : [] -endf - -fu! s:lash(...) - retu ( a:0 ? a:1 : s:dyncwd ) !~ '[\/]$' ? s:lash : '' -endf - -fu! s:ispathitem() - retu s:itemtype < 3 || ( s:itemtype > 2 && s:getextvar('type') == 'path' ) -endf - -fu! ctrlp#igncwd(cwd) - retu ctrlp#utils#glob(a:cwd, 0) == '' || - \ ( s:igntype >= 0 && s:usrign(a:cwd, getftype(a:cwd)) ) -endf - -fu! ctrlp#dirnfile(entries) - let [items, cwd] = [[[], []], s:dyncwd.s:lash()] - for each in a:entries - let etype = getftype(each) - if s:igntype >= 0 && s:usrign(each, etype) | con | en - if etype == 'dir' - if s:showhidden | if each !~ '[\/]\.\{1,2}$' - cal add(items[0], each) - en | el - cal add(items[0], each) - en - elsei etype == 'link' - if s:folsym - let isfile = !isdirectory(each) - if s:folsym == 2 || !s:samerootsyml(each, isfile, cwd) - cal add(items[isfile], each) - en - en - elsei etype == 'file' - cal add(items[1], each) - en - endfo - retu items -endf - -fu! s:usrign(item, type) - retu s:igntype == 1 ? a:item =~ s:usrign - \ : s:igntype == 4 && has_key(s:usrign, a:type) && s:usrign[a:type] != '' - \ ? a:item =~ s:usrign[a:type] : 0 -endf - -fu! s:samerootsyml(each, isfile, cwd) - let resolve = fnamemodify(resolve(a:each), ':p:h') - let resolve .= s:lash(resolve) - retu !( stridx(resolve, a:cwd) && ( stridx(a:cwd, resolve) || a:isfile ) ) -endf - -fu! ctrlp#rmbasedir(items) - let cwd = s:dyncwd.s:lash() - if a:items != [] && !stridx(a:items[0], cwd) - let idx = strlen(cwd) - retu map(a:items, 'strpart(v:val, idx)') - en - retu a:items -endf -" Working directory {{{3 -fu! s:getparent(item) - let parent = substitute(a:item, '[\/][^\/]\+[\/:]\?$', '', '') - if parent == '' || parent !~ '[\/]' - let parent .= s:lash - en - retu parent -endf - -fu! s:findroot(curr, mark, depth, type) - let [depth, fnd] = [a:depth + 1, 0] - if type(a:mark) == 1 - let fnd = s:glbpath(s:fnesc(a:curr, 'g', ','), a:mark, 1) != '' - elsei type(a:mark) == 3 - for markr in a:mark - if s:glbpath(s:fnesc(a:curr, 'g', ','), markr, 1) != '' - let fnd = 1 - brea - en - endfo - en - if fnd - if !a:type | cal ctrlp#setdir(a:curr) | en - retu [exists('markr') ? markr : a:mark, a:curr] - elsei depth > s:maxdepth - cal ctrlp#setdir(s:cwd) - el - let parent = s:getparent(a:curr) - if parent != a:curr - retu s:findroot(parent, a:mark, depth, a:type) - en - en - retu [] -endf - -fu! ctrlp#setdir(path, ...) - let cmd = a:0 ? a:1 : 'lc!' - sil! exe cmd s:fnesc(a:path, 'c') - let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()] -endf -" Fallbacks {{{3 -fu! s:glbpath(...) - retu call('ctrlp#utils#globpath', a:000) -endf - -fu! s:fnesc(...) - retu call('ctrlp#utils#fnesc', a:000) -endf - -fu! ctrlp#setlcdir() - if exists('*haslocaldir') - cal ctrlp#setdir(getcwd(), haslocaldir() ? 'lc!' : 'cd!') - en -endf -" Highlighting {{{2 -fu! ctrlp#syntax() - if ctrlp#nosy() | retu | en - for [ke, va] in items(s:hlgrps) | cal ctrlp#hicheck('CtrlP'.ke, va) | endfo - if synIDattr(synIDtrans(hlID('Normal')), 'bg') !~ '^-1$\|^$' - sil! exe 'hi CtrlPLinePre '.( has("gui_running") ? 'gui' : 'cterm' ).'fg=bg' - en - sy match CtrlPNoEntries '^ == NO ENTRIES ==$' - if hlexists('CtrlPLinePre') - sy match CtrlPLinePre '^>' - en -endf - -fu! s:highlight(pat, grp) - if s:matcher != {} | retu | en - cal clearmatches() - if !empty(a:pat) && s:ispath - let pat = s:regexp ? substitute(a:pat, '\\\@ \\zs', 'g') : a:pat - if s:byfname - let pat = substitute(pat, '\[\^\(.\{-}\)\]\\{-}', '[^\\/\1]\\{-}', 'g') - let pat = substitute(pat, '\$\@') - en -endf - -fu! s:dohighlight() - retu s:mathi[0] && exists('*clearmatches') && !ctrlp#nosy() -endf -" Prompt history {{{2 -fu! s:gethistloc() - let utilcadir = ctrlp#utils#cachedir() - let cache_dir = utilcadir.s:lash(utilcadir).'hist' - retu [cache_dir, cache_dir.s:lash(cache_dir).'cache.txt'] -endf - -fu! s:gethistdata() - retu ctrlp#utils#readfile(s:gethistloc()[1]) -endf - -fu! ctrlp#recordhist() - let str = join(s:prompt, '') - if empty(str) || !s:maxhst | retu | en - let hst = s:hstry - if len(hst) > 1 && hst[1] == str | retu | en - cal extend(hst, [str], 1) - if len(hst) > s:maxhst | cal remove(hst, s:maxhst, -1) | en - cal ctrlp#utils#writecache(hst, s:gethistloc()[0], s:gethistloc()[1]) -endf -" Signs {{{2 -fu! s:unmarksigns() - if !s:dosigns() | retu | en - for key in keys(s:marked) - exe 'sign unplace' key 'buffer='.s:bufnr - endfo -endf - -fu! s:remarksigns() - if !s:dosigns() | retu | en - for ic in range(1, len(s:lines)) - let line = s:ispath ? fnamemodify(s:lines[ic - 1], ':p') : s:lines[ic - 1] - let key = s:dictindex(s:marked, line) - if key > 0 - exe 'sign place' key 'line='.ic.' name=ctrlpmark buffer='.s:bufnr - en - endfo -endf - -fu! s:dosigns() - retu exists('s:marked') && s:bufnr > 0 && s:opmul != '0' && has('signs') -endf -" Lists & Dictionaries {{{2 -fu! s:ifilter(list, str) - let [rlist, estr] = [[], substitute(a:str, 'v:val', 'each', 'g')] - for each in a:list - try - if eval(estr) - cal add(rlist, each) - en - cat | con | endt - endfo - retu rlist -endf - -fu! s:dictindex(dict, expr) - for key in keys(a:dict) - if a:dict[key] == a:expr | retu key | en - endfo - retu -1 -endf - -fu! s:vacantdict(dict) - retu filter(range(1, max(keys(a:dict))), '!has_key(a:dict, v:val)') -endf - -fu! s:sublist(l, s, e) - retu v:version > 701 ? a:l[(a:s):(a:e)] : s:sublist7071(a:l, a:s, a:e) -endf - -fu! s:sublist7071(l, s, e) - let [newlist, id, ae] = [[], a:s, a:e == -1 ? len(a:l) - 1 : a:e] - wh id <= ae - cal add(newlist, get(a:l, id)) - let id += 1 - endw - retu newlist -endf -" Buffers {{{2 -fu! s:buftab(bufnr, md) - for tabnr in range(1, tabpagenr('$')) - if tabpagenr() == tabnr && a:md == 't' | con | en - let buflist = tabpagebuflist(tabnr) - if index(buflist, a:bufnr) >= 0 - for winnr in range(1, tabpagewinnr(tabnr, '$')) - if buflist[winnr - 1] == a:bufnr | retu [tabnr, winnr] | en - endfo - en - endfo - retu [0, 0] -endf - -fu! s:bufwins(bufnr) - let winns = 0 - for tabnr in range(1, tabpagenr('$')) - let winns += count(tabpagebuflist(tabnr), a:bufnr) - endfo - retu winns -endf - -fu! s:nonamecond(str, filpath) - retu a:str =~ '[\/]\?\[\d\+\*No Name\]$' && !filereadable(a:filpath) - \ && bufnr('^'.a:filpath.'$') < 1 -endf - -fu! ctrlp#normcmd(cmd, ...) - if a:0 < 2 && s:nosplit() | retu a:cmd | en - let norwins = filter(range(1, winnr('$')), - \ 'empty(getbufvar(winbufnr(v:val), "&bt"))') - for each in norwins - let bufnr = winbufnr(each) - if empty(bufname(bufnr)) && empty(getbufvar(bufnr, '&ft')) - let fstemp = each | brea - en - endfo - let norwin = empty(norwins) ? 0 : norwins[0] - if norwin - if index(norwins, winnr()) < 0 - exe ( exists('fstemp') ? fstemp : norwin ).'winc w' - en - retu a:cmd - en - retu a:0 ? a:1 : 'bo vne' -endf - -fu! ctrlp#modfilecond(w) - retu &mod && !&hid && &bh != 'hide' && s:bufwins(bufnr('%')) == 1 && !&cf && - \ ( ( !&awa && a:w ) || filewritable(fnamemodify(bufname('%'), ':p')) != 1 ) -endf - -fu! s:nosplit() - retu !empty(s:nosplit) && match([bufname('%'), &l:ft, &l:bt], s:nosplit) >= 0 -endf - -fu! s:setupblank() - setl noswf nonu nobl nowrap nolist nospell nocuc wfh - setl fdc=0 fdl=99 tw=0 bt=nofile bh=unload - if v:version > 702 - setl nornu noudf cc=0 - en -endf - -fu! s:leavepre() - if exists('s:bufnr') && s:bufnr == bufnr('%') | bw! | en - if !( exists(s:ccex) && !{s:ccex} ) - \ && !( has('clientserver') && len(split(serverlist(), "\n")) > 1 ) - cal ctrlp#clra() - en -endf - -fu! s:checkbuf() - if !exists('s:init') && exists('s:bufnr') && s:bufnr > 0 - exe s:bufnr.'bw!' - en -endf - -fu! s:iscmdwin() - let ermsg = v:errmsg - sil! noa winc p - sil! noa winc p - let [v:errmsg, ermsg] = [ermsg, v:errmsg] - retu ermsg =~ '^E11:' -endf -" Arguments {{{2 -fu! s:at(str) - if a:str =~ '\v^\@(cd|lc[hd]?|chd).*' - let str = substitute(a:str, '\v^\@(cd|lc[hd]?|chd)\s*', '', '') - if str == '' | retu 1 | en - let str = str =~ '^%:.\+' ? fnamemodify(s:crfile, str[1:]) : str - let path = fnamemodify(expand(str, 1), ':p') - if isdirectory(path) - if path != s:dyncwd - cal ctrlp#setdir(path) - cal ctrlp#setlines() - en - cal ctrlp#recordhist() - cal s:PrtClear() - en - retu 1 - en - retu 0 -endf - -fu! s:tail() - if exists('s:optail') && !empty('s:optail') - let tailpref = s:optail !~ '^\s*+' ? ' +' : ' ' - retu tailpref.s:optail - en - retu '' -endf - -fu! s:sanstail(str) - let str = s:spi ? - \ substitute(a:str, '^\(@.*$\|\\\\\ze@\|\.\.\zs[.\/]\+$\)', '', 'g') : a:str - let [str, pat] = [substitute(str, '\\\\', '\', 'g'), '\([^:]\|\\:\)*$'] - unl! s:optail - if str =~ '\\\@= 0 - retu char - elsei char =~# "\\v\|\|\|\|\|\" - cal s:BuildPrompt(0) - retu 'cancel' - elsei char =~# "\" && a:args != [] - retu a:args[0] - en - retu call(a:func, a:args) -endf - -fu! s:getregs() - let char = s:textdialog('Insert from register: ') - if char =~# "\\v\|\|\|\|\|\" - cal s:BuildPrompt(0) - retu -1 - elsei char =~# "\" - retu s:getregs() - en - retu s:regisfilter(char) -endf - -fu! s:regisfilter(reg) - retu substitute(getreg(a:reg), "[\t\n]", ' ', 'g') -endf -" Misc {{{2 -fu! s:modevar() - let s:matchtype = s:mtype() - let s:ispath = s:ispathitem() - let s:mfunc = s:mfunc() - let s:nolim = s:getextvar('nolim') - let s:dosort = s:getextvar('sort') - let s:spi = !s:itemtype || s:getextvar('specinput') > 0 -endf - -fu! s:nosort() - retu s:matcher != {} || s:nolim == 1 || ( s:itemtype == 2 && s:mrudef ) - \ || ( s:itemtype =~ '\v^(1|2)$' && s:prompt == ['', '', ''] ) || !s:dosort -endf - -fu! s:byfname() - retu s:ispath && s:byfname -endf - -fu! s:narrowable() - retu exists('s:act_add') && exists('s:matched') && s:matched != [] - \ && exists('s:mdata') && s:mdata[:2] == [s:dyncwd, s:itemtype, s:regexp] - \ && s:matcher == {} && !exists('s:did_exp') -endf - -fu! s:getinput(...) - let [prt, spi] = [s:prompt, ( a:0 ? a:1 : '' )] - if s:abbrev != {} - let gmd = has_key(s:abbrev, 'gmode') ? s:abbrev['gmode'] : '' - let str = ( gmd =~ 't' && !a:0 ) || spi == 'c' ? prt[0] : join(prt, '') - if gmd =~ 't' && gmd =~ 'k' && !a:0 && matchstr(str, '.$') =~ '\k' - retu join(prt, '') - en - let [pf, rz] = [( s:byfname() ? 'f' : 'p' ), ( s:regexp ? 'r' : 'z' )] - for dict in s:abbrev['abbrevs'] - let dmd = has_key(dict, 'mode') ? dict['mode'] : '' - let pat = escape(dict['pattern'], '~') - if ( dmd == '' || ( dmd =~ pf && dmd =~ rz && !a:0 ) - \ || dmd =~ '['.spi.']' ) && str =~ pat - let [str, s:did_exp] = [join(split(str, pat, 1), dict['expanded']), 1] - en - endfo - if gmd =~ 't' && !a:0 - let prt[0] = str - el - retu str - en - en - retu spi == 'c' ? prt[0] : join(prt, '') -endf - -fu! s:migemo(str) - let [str, rtp] = [a:str, s:fnesc(&rtp, 'g')] - let dict = s:glbpath(rtp, printf("dict/%s/migemo-dict", &enc), 1) - if !len(dict) - let dict = s:glbpath(rtp, "dict/migemo-dict", 1) - en - if len(dict) - let [tokens, str, cmd] = [split(str, '\s'), '', 'cmigemo -v -w %s -d %s'] - for token in tokens - let rtn = system(printf(cmd, shellescape(token), shellescape(dict))) - let str .= !v:shell_error && strlen(rtn) > 0 ? '.*'.rtn : token - endfo - en - retu str -endf - -fu! s:strwidth(str) - retu exists('*strdisplaywidth') ? strdisplaywidth(a:str) : strlen(a:str) -endf - -fu! ctrlp#j2l(nr) - exe 'norm!' a:nr.'G' - sil! norm! zvzz -endf - -fu! s:maxf(len) - retu s:maxfiles && a:len > s:maxfiles -endf - -fu! s:regexfilter(str) - let str = a:str - for key in keys(s:fpats) | if str =~ key - let str = substitute(str, s:fpats[key], '', 'g') - en | endfo - retu str -endf - -fu! s:walker(m, p, d) - retu a:d >= 0 ? a:p < a:m ? a:p + a:d : 0 : a:p > 0 ? a:p + a:d : a:m -endf - -fu! s:delent(rfunc) - if a:rfunc == '' | retu | en - let [s:force, tbrem] = [1, []] - if exists('s:marked') - let tbrem = values(s:marked) - cal s:unmarksigns() - unl s:marked - en - if tbrem == [] && ( has('dialog_gui') || has('dialog_con') ) && - \ confirm("Wipe all entries?", "&OK\n&Cancel") != 1 - unl s:force - cal s:BuildPrompt(0) - retu - en - let g:ctrlp_lines = call(a:rfunc, [tbrem]) - cal s:BuildPrompt(1) - unl s:force -endf -" Entering & Exiting {{{2 -fu! s:getenv() - let [s:cwd, s:winres] = [getcwd(), [winrestcmd(), &lines, winnr('$')]] - let [s:crword, s:crnbword] = [expand('', 1), expand('', 1)] - let [s:crgfile, s:crline] = [expand('', 1), getline('.')] - let [s:winmaxh, s:crcursor] = [min([s:mw_max, &lines]), getpos('.')] - let [s:crbufnr, s:crvisual] = [bufnr('%'), s:lastvisual()] - let s:crfile = bufname('%') == '' - \ ? '['.s:crbufnr.'*No Name]' : expand('%:p', 1) - let s:crfpath = expand('%:p:h', 1) - let s:mrbs = ctrlp#mrufiles#bufs() -endf - -fu! s:lastvisual() - let cview = winsaveview() - let [ovreg, ovtype] = [getreg('v'), getregtype('v')] - let [oureg, outype] = [getreg('"'), getregtype('"')] - sil! norm! gv"vy - let selected = s:regisfilter('v') - cal setreg('v', ovreg, ovtype) - cal setreg('"', oureg, outype) - cal winrestview(cview) - retu selected -endf - -fu! s:log(m) - if exists('g:ctrlp_log') && g:ctrlp_log | if a:m - let cadir = ctrlp#utils#cachedir() - let apd = g:ctrlp_log > 1 ? '>' : '' - sil! exe 'redi! >'.apd cadir.s:lash(cadir).'ctrlp.log' - el - sil! redi END - en | en -endf - -fu! s:buffunc(e) - if a:e && has_key(s:buffunc, 'enter') - cal call(s:buffunc['enter'], [], s:buffunc) - elsei !a:e && has_key(s:buffunc, 'exit') - cal call(s:buffunc['exit'], [], s:buffunc) - en -endf - -fu! s:openfile(cmd, fid, tail, chkmod, ...) - let cmd = a:cmd - if a:chkmod && cmd =~ '^[eb]$' && ctrlp#modfilecond(!( cmd == 'b' && &aw )) - let cmd = cmd == 'b' ? 'sb' : 'sp' - en - let cmd = cmd =~ '^tab' ? ctrlp#tabcount().cmd : cmd - let j2l = a:0 && a:1[0] ? a:1[1] : 0 - exe cmd.( a:0 && a:1[0] ? '' : a:tail ) s:fnesc(a:fid, 'f') - if j2l - cal ctrlp#j2l(j2l) - en - if !empty(a:tail) - sil! norm! zvzz - en - if cmd != 'bad' - cal ctrlp#setlcdir() - en -endf - -fu! ctrlp#tabcount() - if exists('s:tabct') - let tabct = s:tabct - let s:tabct += 1 - elsei !type(s:tabpage) - let tabct = s:tabpage - elsei type(s:tabpage) == 1 - let tabpos = - \ s:tabpage =~ 'c' ? tabpagenr() : - \ s:tabpage =~ 'f' ? 1 : - \ s:tabpage =~ 'l' ? tabpagenr('$') : - \ tabpagenr() - let tabct = - \ s:tabpage =~ 'a' ? tabpos : - \ s:tabpage =~ 'b' ? tabpos - 1 : - \ tabpos - en - retu tabct < 0 ? 0 : tabct -endf - -fu! s:settype(type) - retu a:type < 0 ? exists('s:itemtype') ? s:itemtype : 0 : a:type -endf -" Matching {{{2 -fu! s:matchfname(item, pat) - let parts = split(a:item, '[\/]\ze[^\/]\+$') - let mfn = match(parts[-1], a:pat[0]) - retu len(a:pat) == 1 ? mfn : len(a:pat) == 2 ? - \ ( mfn >= 0 && ( len(parts) == 2 ? match(parts[0], a:pat[1]) : -1 ) >= 0 - \ ? 0 : -1 ) : -1 - en -endf - -fu! s:matchtabs(item, pat) - retu match(split(a:item, '\t\+')[0], a:pat) -endf - -fu! s:matchtabe(item, pat) - retu match(split(a:item, '\t\+[^\t]\+$')[0], a:pat) -endf - -fu! s:buildpat(lst) - let pat = a:lst[0] - for item in range(1, len(a:lst) - 1) - let pat .= '[^'.a:lst[item - 1].']\{-}'.a:lst[item] - endfo - retu pat -endf - -fu! s:mfunc() - let mfunc = 'match' - if s:byfname() - let mfunc = 's:matchfname' - elsei s:itemtype > 2 - let matchtypes = { 'tabs': 's:matchtabs', 'tabe': 's:matchtabe' } - if has_key(matchtypes, s:matchtype) - let mfunc = matchtypes[s:matchtype] - en - en - retu mfunc -endf - -fu! s:mmode() - let matchmodes = { - \ 'match': 'full-line', - \ 's:matchfname': 'filename-only', - \ 's:matchtabs': 'first-non-tab', - \ 's:matchtabe': 'until-last-tab', - \ } - retu matchmodes[s:mfunc] -endf -" Cache {{{2 -fu! s:writecache(cafile) - if ( g:ctrlp_newcache || !filereadable(a:cafile) ) && !s:nocache() - cal ctrlp#utils#writecache(g:ctrlp_allfiles) - let g:ctrlp_newcache = 0 - en -endf - -fu! s:nocache(...) - if !s:caching - retu 1 - elsei s:caching > 1 - if !( exists(s:ccex) && !{s:ccex} ) || has_key(s:ficounts, s:dyncwd) - retu get(s:ficounts, s:dyncwd, [0, 0])[0] < s:caching - elsei a:0 && filereadable(a:1) - retu len(ctrlp#utils#readfile(a:1)) < s:caching - en - retu 1 - en - retu 0 -endf - -fu! s:insertcache(str) - let [data, g:ctrlp_newcache, str] = [g:ctrlp_allfiles, 1, a:str] - if data == [] || strlen(str) <= strlen(data[0]) - let pos = 0 - elsei strlen(str) >= strlen(data[-1]) - let pos = len(data) - 1 - el - let pos = 0 - for each in data - if strlen(each) > strlen(str) | brea | en - let pos += 1 - endfo - en - cal insert(data, str, pos) - cal s:writecache(ctrlp#utils#cachefile()) -endf -" Extensions {{{2 -fu! s:mtype() - retu s:itemtype > 2 ? s:getextvar('type') : 'path' -endf - -fu! s:execextvar(key) - if !empty(g:ctrlp_ext_vars) - cal map(filter(copy(g:ctrlp_ext_vars), - \ 'has_key(v:val, a:key)'), 'eval(v:val[a:key])') - en -endf - -fu! s:getextvar(key) - if s:itemtype > 2 - let vars = g:ctrlp_ext_vars[s:itemtype - 3] - retu has_key(vars, a:key) ? vars[a:key] : -1 - en - retu -1 -endf - -fu! ctrlp#getcline() - let [linenr, offset] = [line('.'), ( s:offset > 0 ? s:offset : 0 )] - retu !empty(s:lines) && !( offset && linenr <= offset ) - \ ? s:lines[linenr - 1 - offset] : '' -endf - -fu! ctrlp#getmarkedlist() - retu exists('s:marked') ? values(s:marked) : [] -endf - -fu! ctrlp#exit() - cal s:PrtExit() -endf - -fu! ctrlp#prtclear() - cal s:PrtClear() -endf - -fu! ctrlp#switchtype(id) - cal s:ToggleType(a:id - s:itemtype) -endf - -fu! ctrlp#nosy() - retu !( has('syntax') && exists('g:syntax_on') ) -endf - -fu! ctrlp#hicheck(grp, defgrp) - if !hlexists(a:grp) - exe 'hi link' a:grp a:defgrp - en -endf - -fu! ctrlp#call(func, ...) - retu call(a:func, a:000) -endf - -fu! ctrlp#getvar(var) - retu {a:var} -endf -"}}}1 -" * Initialization {{{1 -fu! ctrlp#setlines(...) - if a:0 | let s:itemtype = a:1 | en - cal s:modevar() - let types = ['ctrlp#files()', 'ctrlp#buffers()', 'ctrlp#mrufiles#list()'] - if !empty(g:ctrlp_ext_vars) - cal map(copy(g:ctrlp_ext_vars), 'add(types, v:val["init"])') - en - let g:ctrlp_lines = eval(types[s:itemtype]) -endf - -fu! ctrlp#init(type, ...) - if exists('s:init') || s:iscmdwin() | retu | en - let [s:ermsg, v:errmsg] = [v:errmsg, ''] - let [s:matches, s:init] = [1, 1] - cal s:Reset(a:0 ? a:1 : {}) - noa cal s:Open() - cal s:SetWD(a:0 ? a:1 : {}) - cal s:MapNorms() - cal s:MapSpecs() - cal ctrlp#syntax() - cal ctrlp#setlines(s:settype(a:type)) - cal s:SetDefTxt() - cal s:BuildPrompt(1) - if s:keyloop | cal s:KeyLoop() | en -endf -" - Autocmds {{{1 -if has('autocmd') - aug CtrlPAug - au! - au BufEnter ControlP cal s:checkbuf() - au BufLeave ControlP noa cal s:Close() - au VimLeavePre * cal s:leavepre() - aug END -en - -fu! s:autocmds() - if !has('autocmd') | retu | en - if exists('#CtrlPLazy') - au! CtrlPLazy - en - if s:lazy - aug CtrlPLazy - au! - au CursorHold ControlP cal s:ForceUpdate() - aug END - en -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim deleted file mode 100644 index 89bda89..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim +++ /dev/null @@ -1,140 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/bookmarkdir.vim -" Description: Bookmarked directories extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_bookmarkdir') && g:loaded_ctrlp_bookmarkdir - fini -en -let g:loaded_ctrlp_bookmarkdir = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#bookmarkdir#init()', - \ 'accept': 'ctrlp#bookmarkdir#accept', - \ 'lname': 'bookmarked dirs', - \ 'sname': 'bkd', - \ 'type': 'tabs', - \ 'opmul': 1, - \ 'nolim': 1, - \ 'wipe': 'ctrlp#bookmarkdir#remove', - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -" Utilities {{{1 -fu! s:getinput(str, ...) - echoh Identifier - cal inputsave() - let input = call('input', a:0 ? [a:str] + a:000 : [a:str]) - cal inputrestore() - echoh None - retu input -endf - -fu! s:cachefile() - if !exists('s:cadir') || !exists('s:cafile') - let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'bkd' - let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt' - en - retu s:cafile -endf - -fu! s:writecache(lines) - cal ctrlp#utils#writecache(a:lines, s:cadir, s:cafile) -endf - -fu! s:getbookmarks() - retu ctrlp#utils#readfile(s:cachefile()) -endf - -fu! s:savebookmark(name, cwd) - let cwds = exists('+ssl') ? [tr(a:cwd, '\', '/'), tr(a:cwd, '/', '\')] : [a:cwd] - let entries = filter(s:getbookmarks(), 'index(cwds, s:parts(v:val)[1]) < 0') - cal s:writecache(insert(entries, a:name.' '.a:cwd)) -endf - -fu! s:setentries() - let time = getftime(s:cachefile()) - if !( exists('s:bookmarks') && time == s:bookmarks[0] ) - let s:bookmarks = [time, s:getbookmarks()] - en -endf - -fu! s:parts(str) - let mlist = matchlist(a:str, '\v([^\t]+)\t(.*)$') - retu mlist != [] ? mlist[1:2] : ['', ''] -endf - -fu! s:process(entries, type) - retu map(a:entries, 's:modify(v:val, a:type)') -endf - -fu! s:modify(entry, type) - let [name, dir] = s:parts(a:entry) - let dir = fnamemodify(dir, a:type) - retu name.' '.( dir == '' ? '.' : dir ) -endf - -fu! s:msg(name, cwd) - redr - echoh Identifier | echon 'Bookmarked ' | echoh Constant - echon a:name.' ' | echoh Directory | echon a:cwd - echoh None -endf - -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPBookmark', 'Identifier') - cal ctrlp#hicheck('CtrlPTabExtra', 'Comment') - sy match CtrlPBookmark '^> [^\t]\+' contains=CtrlPLinePre - sy match CtrlPTabExtra '\zs\t.*\ze$' - en -endf -" Public {{{1 -fu! ctrlp#bookmarkdir#init() - cal s:setentries() - cal s:syntax() - retu s:process(copy(s:bookmarks[1]), ':.') -endf - -fu! ctrlp#bookmarkdir#accept(mode, str) - let parts = s:parts(s:modify(a:str, ':p')) - cal call('s:savebookmark', parts) - if a:mode =~ 't\|v\|h' - cal ctrlp#exit() - en - cal ctrlp#setdir(parts[1], a:mode =~ 't\|h' ? 'chd!' : 'lc!') - if a:mode == 'e' - cal ctrlp#switchtype(0) - cal ctrlp#recordhist() - cal ctrlp#prtclear() - en -endf - -fu! ctrlp#bookmarkdir#add(dir, ...) - let str = 'Directory to bookmark: ' - let cwd = a:dir != '' ? a:dir : s:getinput(str, getcwd(), 'dir') - if cwd == '' | retu | en - let cwd = fnamemodify(cwd, ':p') - let name = a:0 && a:1 != '' ? a:1 : s:getinput('Bookmark as: ', cwd) - if name == '' | retu | en - let name = tr(name, ' ', ' ') - cal s:savebookmark(name, cwd) - cal s:msg(name, cwd) -endf - -fu! ctrlp#bookmarkdir#remove(entries) - cal s:process(a:entries, ':p') - cal s:writecache(a:entries == [] ? [] : - \ filter(s:getbookmarks(), 'index(a:entries, v:val) < 0')) - cal s:setentries() - retu s:process(copy(s:bookmarks[1]), ':.') -endf - -fu! ctrlp#bookmarkdir#id() - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/buffertag.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/buffertag.vim deleted file mode 100644 index a38cad5..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/buffertag.vim +++ /dev/null @@ -1,264 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/buffertag.vim -" Description: Buffer Tag extension -" Maintainer: Kien Nguyen -" Credits: Much of the code was taken from tagbar.vim by Jan Larres, plus -" a few lines from taglist.vim by Yegappan Lakshmanan and from -" buffertag.vim by Takeshi Nishida. -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_buftag') && g:loaded_ctrlp_buftag - fini -en -let g:loaded_ctrlp_buftag = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#buffertag#init(s:crfile)', - \ 'accept': 'ctrlp#buffertag#accept', - \ 'lname': 'buffer tags', - \ 'sname': 'bft', - \ 'exit': 'ctrlp#buffertag#exit()', - \ 'type': 'tabs', - \ 'opts': 'ctrlp#buffertag#opts()', - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) - -let [s:pref, s:opts] = ['g:ctrlp_buftag_', { - \ 'systemenc': ['s:enc', &enc], - \ 'ctags_bin': ['s:bin', ''], - \ 'types': ['s:usr_types', {}], - \ }] - -let s:bins = [ - \ 'ctags-exuberant', - \ 'exuberant-ctags', - \ 'exctags', - \ '/usr/local/bin/ctags', - \ '/opt/local/bin/ctags', - \ 'ctags', - \ 'ctags.exe', - \ 'tags', - \ ] - -let s:types = { - \ 'asm' : '%sasm%sasm%sdlmt', - \ 'aspperl': '%sasp%sasp%sfsv', - \ 'aspvbs' : '%sasp%sasp%sfsv', - \ 'awk' : '%sawk%sawk%sf', - \ 'beta' : '%sbeta%sbeta%sfsv', - \ 'c' : '%sc%sc%sdgsutvf', - \ 'cpp' : '%sc++%sc++%snvdtcgsuf', - \ 'cs' : '%sc#%sc#%sdtncEgsipm', - \ 'cobol' : '%scobol%scobol%sdfgpPs', - \ 'eiffel' : '%seiffel%seiffel%scf', - \ 'erlang' : '%serlang%serlang%sdrmf', - \ 'expect' : '%stcl%stcl%scfp', - \ 'fortran': '%sfortran%sfortran%spbceiklmntvfs', - \ 'html' : '%shtml%shtml%saf', - \ 'java' : '%sjava%sjava%spcifm', - \ 'javascript': '%sjavascript%sjavascript%sf', - \ 'lisp' : '%slisp%slisp%sf', - \ 'lua' : '%slua%slua%sf', - \ 'make' : '%smake%smake%sm', - \ 'ocaml' : '%socaml%socaml%scmMvtfCre', - \ 'pascal' : '%spascal%spascal%sfp', - \ 'perl' : '%sperl%sperl%sclps', - \ 'php' : '%sphp%sphp%scdvf', - \ 'python' : '%spython%spython%scmf', - \ 'rexx' : '%srexx%srexx%ss', - \ 'ruby' : '%sruby%sruby%scfFm', - \ 'scheme' : '%sscheme%sscheme%ssf', - \ 'sh' : '%ssh%ssh%sf', - \ 'csh' : '%ssh%ssh%sf', - \ 'zsh' : '%ssh%ssh%sf', - \ 'slang' : '%sslang%sslang%snf', - \ 'sml' : '%ssml%ssml%secsrtvf', - \ 'sql' : '%ssql%ssql%scFPrstTvfp', - \ 'tcl' : '%stcl%stcl%scfmp', - \ 'vera' : '%svera%svera%scdefgmpPtTvx', - \ 'verilog': '%sverilog%sverilog%smcPertwpvf', - \ 'vim' : '%svim%svim%savf', - \ 'yacc' : '%syacc%syacc%sl', - \ } - -cal map(s:types, 'printf(v:val, "--language-force=", " --", "-types=")') - -if executable('jsctags') - cal extend(s:types, { 'javascript': { 'args': '-f -', 'bin': 'jsctags' } }) -en - -fu! ctrlp#buffertag#opts() - for [ke, va] in items(s:opts) - let {va[0]} = exists(s:pref.ke) ? {s:pref.ke} : va[1] - endfo - " Ctags bin - if empty(s:bin) - for bin in s:bins | if executable(bin) - let s:bin = bin - brea - en | endfo - el - let s:bin = expand(s:bin, 1) - en - " Types - cal extend(s:types, s:usr_types) -endf -" Utilities {{{1 -fu! s:validfile(fname, ftype) - if ( !empty(a:fname) || !empty(a:ftype) ) && filereadable(a:fname) - \ && index(keys(s:types), a:ftype) >= 0 | retu 1 | en - retu 0 -endf - -fu! s:exectags(cmd) - if exists('+ssl') - let [ssl, &ssl] = [&ssl, 0] - en - if &sh =~ 'cmd\.exe' - let [sxq, &sxq, shcf, &shcf] = [&sxq, '"', &shcf, '/s /c'] - en - let output = system(a:cmd) - if &sh =~ 'cmd\.exe' - let [&sxq, &shcf] = [sxq, shcf] - en - if exists('+ssl') - let &ssl = ssl - en - retu output -endf - -fu! s:exectagsonfile(fname, ftype) - let [ags, ft] = ['-f - --sort=no --excmd=pattern --fields=nKs ', a:ftype] - if type(s:types[ft]) == 1 - let ags .= s:types[ft] - let bin = s:bin - elsei type(s:types[ft]) == 4 - let ags = s:types[ft]['args'] - let bin = expand(s:types[ft]['bin'], 1) - en - if empty(bin) | retu '' | en - let cmd = s:esctagscmd(bin, ags, a:fname) - if empty(cmd) | retu '' | en - let output = s:exectags(cmd) - if v:shell_error || output =~ 'Warning: cannot open' | retu '' | en - retu output -endf - -fu! s:esctagscmd(bin, args, ...) - if exists('+ssl') - let [ssl, &ssl] = [&ssl, 0] - en - let fname = a:0 ? shellescape(a:1) : '' - let cmd = shellescape(a:bin).' '.a:args.' '.fname - if &sh =~ 'cmd\.exe' - let cmd = substitute(cmd, '[&()@^<>|]', '^\0', 'g') - en - if exists('+ssl') - let &ssl = ssl - en - if has('iconv') - let last = s:enc != &enc ? s:enc : !empty( $LANG ) ? $LANG : &enc - let cmd = iconv(cmd, &enc, last) - en - retu cmd -endf - -fu! s:process(fname, ftype) - if !s:validfile(a:fname, a:ftype) | retu [] | endif - let ftime = getftime(a:fname) - if has_key(g:ctrlp_buftags, a:fname) - \ && g:ctrlp_buftags[a:fname]['time'] >= ftime - let lines = g:ctrlp_buftags[a:fname]['lines'] - el - let data = s:exectagsonfile(a:fname, a:ftype) - let [raw, lines] = [split(data, '\n\+'), []] - for line in raw - if line !~# '^!_TAG_' && len(split(line, ';"')) == 2 - let parsed_line = s:parseline(line) - if parsed_line != '' - cal add(lines, parsed_line) - en - en - endfo - let cache = { a:fname : { 'time': ftime, 'lines': lines } } - cal extend(g:ctrlp_buftags, cache) - en - retu lines -endf - -fu! s:parseline(line) - let vals = matchlist(a:line, - \ '\v^([^\t]+)\t(.+)\t[?/]\^?(.{-1,})\$?[?/]\;\"\t(.+)\tline(no)?\:(\d+)') - if vals == [] | retu '' | en - let [bufnr, bufname] = [bufnr('^'.vals[2].'$'), fnamemodify(vals[2], ':p:t')] - retu vals[1].' '.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'| '.vals[3] -endf - -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPTagKind', 'Title') - cal ctrlp#hicheck('CtrlPBufName', 'Directory') - cal ctrlp#hicheck('CtrlPTabExtra', 'Comment') - sy match CtrlPTagKind '\zs[^\t|]\+\ze|\d\+:[^|]\+|\d\+|' - sy match CtrlPBufName '|\d\+:\zs[^|]\+\ze|\d\+|' - sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName,CtrlPTagKind - en -endf - -fu! s:chknearby(pat) - if match(getline('.'), a:pat) < 0 - let [int, forw, maxl] = [1, 1, line('$')] - wh !search(a:pat, 'W'.( forw ? '' : 'b' )) - if !forw - if int > maxl | brea | en - let int += int - en - let forw = !forw - endw - en -endf -" Public {{{1 -fu! ctrlp#buffertag#init(fname) - let bufs = exists('s:btmode') && s:btmode - \ ? filter(ctrlp#buffers(), 'filereadable(v:val)') - \ : [exists('s:bufname') ? s:bufname : a:fname] - let lines = [] - for each in bufs - let bname = fnamemodify(each, ':p') - let tftype = get(split(getbufvar('^'.bname.'$', '&ft'), '\.'), 0, '') - cal extend(lines, s:process(bname, tftype)) - endfo - cal s:syntax() - retu lines -endf - -fu! ctrlp#buffertag#accept(mode, str) - let vals = matchlist(a:str, - \ '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)\|\s(.+)$') - let bufnr = str2nr(get(vals, 1)) - if bufnr - cal ctrlp#acceptfile(a:mode, bufnr) - exe 'norm!' str2nr(get(vals, 2, line('.'))).'G' - cal s:chknearby('\V\C'.get(vals, 3, '')) - sil! norm! zvzz - en -endf - -fu! ctrlp#buffertag#cmd(mode, ...) - let s:btmode = a:mode - if a:0 && !empty(a:1) - let s:btmode = 0 - let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1 - let s:bufname = fnamemodify(bname, ':p') - en - retu s:id -endf - -fu! ctrlp#buffertag#exit() - unl! s:btmode s:bufname -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/changes.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/changes.vim deleted file mode 100644 index 313d8c2..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/changes.vim +++ /dev/null @@ -1,98 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/changes.vim -" Description: Change list extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_changes') && g:loaded_ctrlp_changes - fini -en -let g:loaded_ctrlp_changes = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#changes#init(s:bufnr, s:crbufnr)', - \ 'accept': 'ctrlp#changes#accept', - \ 'lname': 'changes', - \ 'sname': 'chs', - \ 'exit': 'ctrlp#changes#exit()', - \ 'type': 'tabe', - \ 'sort': 0, - \ 'nolim': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -" Utilities {{{1 -fu! s:changelist(bufnr) - sil! exe 'noa hid b' a:bufnr - redi => result - sil! changes - redi END - retu map(split(result, "\n")[1:], 'tr(v:val, " ", " ")') -endf - -fu! s:process(clines, ...) - let [clines, evas] = [[], []] - for each in a:clines - let parts = matchlist(each, '\v^.\s*\d+\s+(\d+)\s+(\d+)\s(.*)$') - if !empty(parts) - if parts[3] == '' | let parts[3] = ' ' | en - cal add(clines, parts[3].' |'.a:1.':'.a:2.'|'.parts[1].':'.parts[2].'|') - en - endfo - retu reverse(filter(clines, 'count(clines, v:val) == 1')) -endf - -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPBufName', 'Directory') - cal ctrlp#hicheck('CtrlPTabExtra', 'Comment') - sy match CtrlPBufName '\t|\d\+:\zs[^|]\+\ze|\d\+:\d\+|$' - sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName - en -endf -" Public {{{1 -fu! ctrlp#changes#init(original_bufnr, bufnr) - let bufnr = exists('s:bufnr') ? s:bufnr : a:bufnr - let bufs = exists('s:clmode') && s:clmode ? ctrlp#buffers('id') : [bufnr] - cal filter(bufs, 'v:val > 0') - let [swb, &swb] = [&swb, ''] - let lines = [] - for each in bufs - let bname = bufname(each) - let fnamet = fnamemodify(bname == '' ? '[No Name]' : bname, ':t') - cal extend(lines, s:process(s:changelist(each), each, fnamet)) - endfo - sil! exe 'noa hid b' a:original_bufnr - let &swb = swb - cal ctrlp#syntax() - cal s:syntax() - retu lines -endf - -fu! ctrlp#changes#accept(mode, str) - let info = matchlist(a:str, '\t|\(\d\+\):[^|]\+|\(\d\+\):\(\d\+\)|$') - let bufnr = str2nr(get(info, 1)) - if bufnr - cal ctrlp#acceptfile(a:mode, bufnr) - cal cursor(get(info, 2), get(info, 3)) - sil! norm! zvzz - en -endf - -fu! ctrlp#changes#cmd(mode, ...) - let s:clmode = a:mode - if a:0 && !empty(a:1) - let s:clmode = 0 - let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1 - let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$') - en - retu s:id -endf - -fu! ctrlp#changes#exit() - unl! s:clmode s:bufnr -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/dir.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/dir.vim deleted file mode 100644 index 4e6d4ad..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/dir.vim +++ /dev/null @@ -1,95 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/dir.vim -" Description: Directory extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_dir') && g:loaded_ctrlp_dir - fini -en -let [g:loaded_ctrlp_dir, g:ctrlp_newdir] = [1, 0] - -let s:ars = ['s:maxdepth', 's:maxfiles', 's:compare_lim', 's:glob', 's:caching'] - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#dir#init('.join(s:ars, ', ').')', - \ 'accept': 'ctrlp#dir#accept', - \ 'lname': 'dirs', - \ 'sname': 'dir', - \ 'type': 'path', - \ 'specinput': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) - -let s:dircounts = {} -" Utilities {{{1 -fu! s:globdirs(dirs, depth) - let entries = split(globpath(a:dirs, s:glob), "\n") - let [dirs, depth] = [ctrlp#dirnfile(entries)[0], a:depth + 1] - cal extend(g:ctrlp_alldirs, dirs) - let nr = len(g:ctrlp_alldirs) - if !empty(dirs) && !s:max(nr, s:maxfiles) && depth <= s:maxdepth - sil! cal ctrlp#progress(nr) - cal map(dirs, 'ctrlp#utils#fnesc(v:val, "g", ",")') - cal s:globdirs(join(dirs, ','), depth) - en -endf - -fu! s:max(len, max) - retu a:max && a:len > a:max -endf - -fu! s:nocache() - retu !s:caching || ( s:caching > 1 && get(s:dircounts, s:cwd) < s:caching ) -endf -" Public {{{1 -fu! ctrlp#dir#init(...) - let s:cwd = getcwd() - for each in range(len(s:ars)) - let {s:ars[each]} = a:{each + 1} - endfo - let cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'dir' - let cafile = cadir.ctrlp#utils#lash().ctrlp#utils#cachefile('dir') - if g:ctrlp_newdir || s:nocache() || !filereadable(cafile) - let [s:initcwd, g:ctrlp_alldirs] = [s:cwd, []] - if !ctrlp#igncwd(s:cwd) - cal s:globdirs(ctrlp#utils#fnesc(s:cwd, 'g', ','), 0) - en - cal ctrlp#rmbasedir(g:ctrlp_alldirs) - if len(g:ctrlp_alldirs) <= s:compare_lim - cal sort(g:ctrlp_alldirs, 'ctrlp#complen') - en - cal ctrlp#utils#writecache(g:ctrlp_alldirs, cadir, cafile) - let g:ctrlp_newdir = 0 - el - if !( exists('s:initcwd') && s:initcwd == s:cwd ) - let s:initcwd = s:cwd - let g:ctrlp_alldirs = ctrlp#utils#readfile(cafile) - en - en - cal extend(s:dircounts, { s:cwd : len(g:ctrlp_alldirs) }) - retu g:ctrlp_alldirs -endf - -fu! ctrlp#dir#accept(mode, str) - let path = a:mode == 'h' ? getcwd() : s:cwd.ctrlp#call('s:lash', s:cwd).a:str - if a:mode =~ 't\|v\|h' - cal ctrlp#exit() - en - cal ctrlp#setdir(path, a:mode =~ 't\|h' ? 'chd!' : 'lc!') - if a:mode == 'e' - sil! cal ctrlp#statusline() - cal ctrlp#setlines(s:id) - cal ctrlp#recordhist() - cal ctrlp#prtclear() - en -endf - -fu! ctrlp#dir#id() - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/line.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/line.vim deleted file mode 100644 index 5bec47e..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/line.vim +++ /dev/null @@ -1,72 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/line.vim -" Description: Line extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_line') && g:loaded_ctrlp_line - fini -en -let g:loaded_ctrlp_line = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#line#init(s:crbufnr)', - \ 'accept': 'ctrlp#line#accept', - \ 'lname': 'lines', - \ 'sname': 'lns', - \ 'type': 'tabe', - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -" Utilities {{{1 -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPBufName', 'Directory') - cal ctrlp#hicheck('CtrlPTabExtra', 'Comment') - sy match CtrlPBufName '\t|\zs[^|]\+\ze|\d\+:\d\+|$' - sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName - en -endf -" Public {{{1 -fu! ctrlp#line#init(bufnr) - let [lines, bufnr] = [[], exists('s:bufnr') ? s:bufnr : a:bufnr] - let bufs = exists('s:lnmode') && s:lnmode ? ctrlp#buffers('id') : [bufnr] - for bufnr in bufs - let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)] - if lfb == [] && bufn != '' - let lfb = ctrlp#utils#readfile(fnamemodify(bufn, ':p')) - en - cal map(lfb, 'tr(v:val, '' '', '' '')') - let [linenr, len_lfb] = [1, len(lfb)] - let buft = bufn == '' ? '[No Name]' : fnamemodify(bufn, ':t') - wh linenr <= len_lfb - let lfb[linenr - 1] .= ' |'.buft.'|'.bufnr.':'.linenr.'|' - let linenr += 1 - endw - cal extend(lines, filter(lfb, 'v:val !~ ''^\s*\t|[^|]\+|\d\+:\d\+|$''')) - endfo - cal s:syntax() - retu lines -endf - -fu! ctrlp#line#accept(mode, str) - let info = matchlist(a:str, '\t|[^|]\+|\(\d\+\):\(\d\+\)|$') - let bufnr = str2nr(get(info, 1)) - if bufnr - cal ctrlp#acceptfile(a:mode, bufnr, get(info, 2)) - en -endf - -fu! ctrlp#line#cmd(mode, ...) - let s:lnmode = a:mode - if a:0 && !empty(a:1) - let s:lnmode = 0 - let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1 - let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$') - en - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/mixed.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/mixed.vim deleted file mode 100644 index 74d904d..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/mixed.vim +++ /dev/null @@ -1,88 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/mixed.vim -" Description: Mixing Files + MRU + Buffers -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_mixed') && g:loaded_ctrlp_mixed - fini -en -let [g:loaded_ctrlp_mixed, g:ctrlp_newmix] = [1, 0] - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#mixed#init(s:compare_lim)', - \ 'accept': 'ctrlp#acceptfile', - \ 'lname': 'fil + mru + buf', - \ 'sname': 'mix', - \ 'type': 'path', - \ 'opmul': 1, - \ 'specinput': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -" Utilities {{{1 -fu! s:newcache(cwd) - if g:ctrlp_newmix || !has_key(g:ctrlp_allmixes, 'data') | retu 1 | en - retu g:ctrlp_allmixes['cwd'] != a:cwd - \ || g:ctrlp_allmixes['filtime'] < getftime(ctrlp#utils#cachefile()) - \ || g:ctrlp_allmixes['mrutime'] < getftime(ctrlp#mrufiles#cachefile()) - \ || g:ctrlp_allmixes['bufs'] < len(ctrlp#mrufiles#bufs()) -endf - -fu! s:getnewmix(cwd, clim) - if g:ctrlp_newmix - cal ctrlp#mrufiles#refresh('raw') - let g:ctrlp_newcache = 1 - en - let g:ctrlp_lines = copy(ctrlp#files()) - cal ctrlp#progress('Mixing...') - let mrufs = copy(ctrlp#mrufiles#list('raw')) - if exists('+ssl') && &ssl - cal map(mrufs, 'tr(v:val, "\\", "/")') - en - let allbufs = map(ctrlp#buffers(), 'fnamemodify(v:val, ":p")') - let [bufs, ubufs] = [[], []] - for each in allbufs - cal add(filereadable(each) ? bufs : ubufs, each) - endfo - let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0') - if len(mrufs) > len(g:ctrlp_lines) - cal filter(mrufs, 'stridx(v:val, a:cwd)') - el - let cwd_mrufs = filter(copy(mrufs), '!stridx(v:val, a:cwd)') - let cwd_mrufs = ctrlp#rmbasedir(cwd_mrufs) - for each in cwd_mrufs - let id = index(g:ctrlp_lines, each) - if id >= 0 | cal remove(g:ctrlp_lines, id) | en - endfo - en - let mrufs += ubufs - cal map(mrufs, 'fnamemodify(v:val, ":.")') - let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines) - \ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines - if len(g:ctrlp_lines) <= a:clim - cal sort(g:ctrlp_lines, 'ctrlp#complen') - en - let g:ctrlp_allmixes = { 'filtime': getftime(ctrlp#utils#cachefile()), - \ 'mrutime': getftime(ctrlp#mrufiles#cachefile()), 'cwd': a:cwd, - \ 'bufs': len(ctrlp#mrufiles#bufs()), 'data': g:ctrlp_lines } -endf -" Public {{{1 -fu! ctrlp#mixed#init(clim) - let cwd = getcwd() - if s:newcache(cwd) - cal s:getnewmix(cwd, a:clim) - el - let g:ctrlp_lines = g:ctrlp_allmixes['data'] - en - let g:ctrlp_newmix = 0 - retu g:ctrlp_lines -endf - -fu! ctrlp#mixed#id() - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/mrufiles.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/mrufiles.vim deleted file mode 100644 index a182111..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/mrufiles.vim +++ /dev/null @@ -1,154 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/mrufiles.vim -" Description: Most Recently Used Files extension -" Author: Kien Nguyen -" ============================================================================= - -" Static variables {{{1 -let [s:mrbs, s:mrufs] = [[], []] - -fu! ctrlp#mrufiles#opts() - let [pref, opts] = ['g:ctrlp_mruf_', { - \ 'max': ['s:max', 250], - \ 'include': ['s:in', ''], - \ 'exclude': ['s:ex', ''], - \ 'case_sensitive': ['s:cseno', 1], - \ 'relative': ['s:re', 0], - \ 'save_on_update': ['s:soup', 1], - \ }] - for [ke, va] in items(opts) - let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]] - endfo -endf -cal ctrlp#mrufiles#opts() -" Utilities {{{1 -fu! s:excl(fn) - retu !empty({s:ex}) && a:fn =~# {s:ex} -endf - -fu! s:mergelists() - let diskmrufs = ctrlp#utils#readfile(ctrlp#mrufiles#cachefile()) - cal filter(diskmrufs, 'index(s:mrufs, v:val) < 0') - let mrufs = s:mrufs + diskmrufs - retu s:chop(mrufs) -endf - -fu! s:chop(mrufs) - if len(a:mrufs) > {s:max} | cal remove(a:mrufs, {s:max}, -1) | en - retu a:mrufs -endf - -fu! s:reformat(mrufs, ...) - let cwd = getcwd() - let cwd .= cwd !~ '[\/]$' ? ctrlp#utils#lash() : '' - if {s:re} - let cwd = exists('+ssl') ? tr(cwd, '/', '\') : cwd - cal filter(a:mrufs, '!stridx(v:val, cwd)') - en - if a:0 && a:1 == 'raw' | retu a:mrufs | en - let idx = strlen(cwd) - if exists('+ssl') && &ssl - let cwd = tr(cwd, '\', '/') - cal map(a:mrufs, 'tr(v:val, "\\", "/")') - en - retu map(a:mrufs, '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val') -endf - -fu! s:record(bufnr) - if s:locked | retu | en - let bufnr = a:bufnr + 0 - let bufname = bufname(bufnr) - if bufnr > 0 && !empty(bufname) - cal filter(s:mrbs, 'v:val != bufnr') - cal insert(s:mrbs, bufnr) - cal s:addtomrufs(bufname) - en -endf - -fu! s:addtomrufs(fname) - let fn = fnamemodify(a:fname, ':p') - let fn = exists('+ssl') ? tr(fn, '/', '\') : fn - if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} ) - \ || !empty(getbufvar('^'.fn.'$', '&bt')) || !filereadable(fn) | retu - en - let idx = index(s:mrufs, fn, 0, !{s:cseno}) - if idx - cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn') - cal insert(s:mrufs, fn) - if {s:soup} && idx < 0 - cal s:savetofile(s:mergelists()) - en - en -endf - -fu! s:savetofile(mrufs) - cal ctrlp#utils#writecache(a:mrufs, s:cadir, s:cafile) -endf -" Public {{{1 -fu! ctrlp#mrufiles#refresh(...) - let mrufs = s:mergelists() - cal filter(mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)') - if exists('+ssl') - cal map(mrufs, 'tr(v:val, "/", "\\")') - cal map(s:mrufs, 'tr(v:val, "/", "\\")') - let cond = 'count(mrufs, v:val, !{s:cseno}) == 1' - cal filter(mrufs, cond) - cal filter(s:mrufs, cond) - en - cal s:savetofile(mrufs) - retu a:0 && a:1 == 'raw' ? [] : s:reformat(mrufs) -endf - -fu! ctrlp#mrufiles#remove(files) - let mrufs = [] - if a:files != [] - let mrufs = s:mergelists() - let cond = 'index(a:files, v:val, 0, !{s:cseno}) < 0' - cal filter(mrufs, cond) - cal filter(s:mrufs, cond) - en - cal s:savetofile(mrufs) - retu s:reformat(mrufs) -endf - -fu! ctrlp#mrufiles#add(fn) - if !empty(a:fn) - cal s:addtomrufs(a:fn) - en -endf - -fu! ctrlp#mrufiles#list(...) - retu a:0 ? a:1 == 'raw' ? s:reformat(s:mergelists(), a:1) : 0 - \ : s:reformat(s:mergelists()) -endf - -fu! ctrlp#mrufiles#bufs() - retu s:mrbs -endf - -fu! ctrlp#mrufiles#tgrel() - let {s:re} = !{s:re} -endf - -fu! ctrlp#mrufiles#cachefile() - if !exists('s:cadir') || !exists('s:cafile') - let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'mru' - let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt' - en - retu s:cafile -endf - -fu! ctrlp#mrufiles#init() - if !has('autocmd') | retu | en - let s:locked = 0 - aug CtrlPMRUF - au! - au BufAdd,BufEnter,BufLeave,BufWritePost * cal s:record(expand('', 1)) - au QuickFixCmdPre *vimgrep* let s:locked = 1 - au QuickFixCmdPost *vimgrep* let s:locked = 0 - au VimLeavePre * cal s:savetofile(s:mergelists()) - aug END -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/quickfix.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/quickfix.vim deleted file mode 100644 index 03ab921..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/quickfix.vim +++ /dev/null @@ -1,59 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/quickfix.vim -" Description: Quickfix extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_quickfix') && g:loaded_ctrlp_quickfix - fini -en -let g:loaded_ctrlp_quickfix = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#quickfix#init()', - \ 'accept': 'ctrlp#quickfix#accept', - \ 'lname': 'quickfix', - \ 'sname': 'qfx', - \ 'type': 'line', - \ 'sort': 0, - \ 'nolim': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) - -fu! s:lineout(dict) - retu printf('%s|%d:%d| %s', bufname(a:dict['bufnr']), a:dict['lnum'], - \ a:dict['col'], matchstr(a:dict['text'], '\s*\zs.*\S')) -endf -" Utilities {{{1 -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPqfLineCol', 'Search') - sy match CtrlPqfLineCol '|\zs\d\+:\d\+\ze|' - en -endf -" Public {{{1 -fu! ctrlp#quickfix#init() - cal s:syntax() - retu map(getqflist(), 's:lineout(v:val)') -endf - -fu! ctrlp#quickfix#accept(mode, str) - let vals = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|') - if vals == [] || vals[1] == '' | retu | en - cal ctrlp#acceptfile(a:mode, vals[1]) - let cur_pos = getpos('.')[1:2] - if cur_pos != [1, 1] && cur_pos != map(vals[2:3], 'str2nr(v:val)') - mark ' - en - cal cursor(vals[2], vals[3]) - sil! norm! zvzz -endf - -fu! ctrlp#quickfix#id() - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/rtscript.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/rtscript.vim deleted file mode 100644 index eed21c6..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/rtscript.vim +++ /dev/null @@ -1,59 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/rtscript.vim -" Description: Runtime scripts extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_rtscript') && g:loaded_ctrlp_rtscript - fini -en -let [g:loaded_ctrlp_rtscript, g:ctrlp_newrts] = [1, 0] - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#rtscript#init(s:caching)', - \ 'accept': 'ctrlp#acceptfile', - \ 'lname': 'runtime scripts', - \ 'sname': 'rts', - \ 'type': 'path', - \ 'opmul': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) - -let s:filecounts = {} -" Utilities {{{1 -fu! s:nocache() - retu g:ctrlp_newrts || - \ !s:caching || ( s:caching > 1 && get(s:filecounts, s:cwd) < s:caching ) -endf -" Public {{{1 -fu! ctrlp#rtscript#init(caching) - let [s:caching, s:cwd] = [a:caching, getcwd()] - if s:nocache() || - \ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp ) - sil! cal ctrlp#progress('Indexing...') - let entries = split(globpath(ctrlp#utils#fnesc(&rtp, 'g'), '**/*.*'), "\n") - cal filter(entries, 'count(entries, v:val) == 1') - let [entries, echoed] = [ctrlp#dirnfile(entries)[1], 1] - el - let [entries, results] = g:ctrlp_rtscache[2:3] - en - if s:nocache() || - \ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, s:cwd] ) - if !exists('echoed') - sil! cal ctrlp#progress('Processing...') - en - let results = map(copy(entries), 'fnamemodify(v:val, '':.'')') - en - let [g:ctrlp_rtscache, g:ctrlp_newrts] = [[&rtp, s:cwd, entries, results], 0] - cal extend(s:filecounts, { s:cwd : len(results) }) - retu results -endf - -fu! ctrlp#rtscript#id() - retu s:id -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/tag.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/tag.vim deleted file mode 100644 index 626363a..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/tag.vim +++ /dev/null @@ -1,138 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/tag.vim -" Description: Tag file extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag - fini -en -let g:loaded_ctrlp_tag = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#tag#init()', - \ 'accept': 'ctrlp#tag#accept', - \ 'lname': 'tags', - \ 'sname': 'tag', - \ 'enter': 'ctrlp#tag#enter()', - \ 'type': 'tabs', - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) -" Utilities {{{1 -fu! s:findcount(str) - let [tg, ofname] = split(a:str, '\t\+\ze[^\t]\+$') - let tgs = taglist('^'.tg.'$') - if len(tgs) < 2 - retu [0, 0, 0, 0] - en - let bname = fnamemodify(bufname('%'), ':p') - let fname = expand(fnamemodify(simplify(ofname), ':s?^[.\/]\+??:p:.'), 1) - let [fnd, cnt, pos, ctgs, otgs] = [0, 0, 0, [], []] - for tgi in tgs - let lst = bname == fnamemodify(tgi["filename"], ':p') ? 'ctgs' : 'otgs' - cal call('add', [{lst}, tgi]) - endfo - let ntgs = ctgs + otgs - for tgi in ntgs - let cnt += 1 - let fulname = fnamemodify(tgi["filename"], ':p') - if stridx(fulname, fname) >= 0 - \ && strlen(fname) + stridx(fulname, fname) == strlen(fulname) - let fnd += 1 - let pos = cnt - en - endfo - let cnt = 0 - for tgi in ntgs - let cnt += 1 - if tgi["filename"] == ofname - let [fnd, pos] = [0, cnt] - en - endfo - retu [1, fnd, pos, len(ctgs)] -endf - -fu! s:filter(tags) - let nr = 0 - wh 0 < 1 - if a:tags == [] | brea | en - if a:tags[nr] =~ '^!' && a:tags[nr] !~# '^!_TAG_' - let nr += 1 - con - en - if a:tags[nr] =~# '^!_TAG_' && len(a:tags) > nr - cal remove(a:tags, nr) - el - brea - en - endw - retu a:tags -endf - -fu! s:syntax() - if !ctrlp#nosy() - cal ctrlp#hicheck('CtrlPTabExtra', 'Comment') - sy match CtrlPTabExtra '\zs\t.*\ze$' - en -endf -" Public {{{1 -fu! ctrlp#tag#init() - if empty(s:tagfiles) | retu [] | en - let g:ctrlp_alltags = [] - let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1')) - for each in tagfiles - let alltags = s:filter(ctrlp#utils#readfile(each)) - cal extend(g:ctrlp_alltags, alltags) - endfo - cal s:syntax() - retu g:ctrlp_alltags -endf - -fu! ctrlp#tag#accept(mode, str) - cal ctrlp#exit() - let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t') - let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str)] - let cmds = { - \ 't': ['tab sp', 'tab stj'], - \ 'h': ['sp', 'stj'], - \ 'v': ['vs', 'vert stj'], - \ 'e': ['', 'tj'], - \ } - let utg = fdcnt[3] < 2 && fdcnt[0] == 1 && fdcnt[1] == 1 - let cmd = !fdcnt[0] || utg ? cmds[a:mode][0] : cmds[a:mode][1] - let cmd = a:mode == 'e' && ctrlp#modfilecond(!&aw) - \ ? ( cmd == 'tj' ? 'stj' : 'sp' ) : cmd - let cmd = a:mode == 't' ? ctrlp#tabcount().cmd : cmd - if !fdcnt[0] || utg - if cmd != '' - exe cmd - en - let save_cst = &cst - set cst& - cal feedkeys(":".( utg ? fdcnt[2] : "" )."ta ".tg."\r", 'nt') - let &cst = save_cst - el - let ext = "" - if fdcnt[1] < 2 && fdcnt[2] - let [sav_more, &more] = [&more, 0] - let ext = fdcnt[2]."\r".":let &more = ".sav_more."\r" - en - cal feedkeys(":".cmd." ".tg."\r".ext, 'nt') - en - cal ctrlp#setlcdir() -endf - -fu! ctrlp#tag#id() - retu s:id -endf - -fu! ctrlp#tag#enter() - let tfs = tagfiles() - let s:tagfiles = tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'), - \ 'filereadable(v:val)') : [] -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/undo.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/undo.vim deleted file mode 100644 index dee705e..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/undo.vim +++ /dev/null @@ -1,154 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/undo.vim -" Description: Undo extension -" Author: Kien Nguyen -" ============================================================================= - -" Init {{{1 -if ( exists('g:loaded_ctrlp_undo') && g:loaded_ctrlp_undo ) - fini -en -let g:loaded_ctrlp_undo = 1 - -cal add(g:ctrlp_ext_vars, { - \ 'init': 'ctrlp#undo#init()', - \ 'accept': 'ctrlp#undo#accept', - \ 'lname': 'undo', - \ 'sname': 'udo', - \ 'enter': 'ctrlp#undo#enter()', - \ 'exit': 'ctrlp#undo#exit()', - \ 'type': 'line', - \ 'sort': 0, - \ 'nolim': 1, - \ }) - -let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars) - -let s:text = map(['second', 'seconds', 'minutes', 'hours', 'days', 'weeks', - \ 'months', 'years'], '" ".v:val." ago"') -" Utilities {{{1 -fu! s:getundo() - if exists('*undotree') - \ && ( v:version > 703 || ( v:version == 703 && has('patch005') ) ) - retu [1, undotree()] - el - redi => result - sil! undol - redi END - retu [0, split(result, "\n")[1:]] - en -endf - -fu! s:flatten(tree, cur) - let flatdict = {} - for each in a:tree - let saved = has_key(each, 'save') ? 'saved' : '' - let current = each['seq'] == a:cur ? 'current' : '' - cal extend(flatdict, { each['seq'] : [each['time'], saved, current] }) - if has_key(each, 'alt') - cal extend(flatdict, s:flatten(each['alt'], a:cur)) - en - endfo - retu flatdict -endf - -fu! s:elapsed(nr) - let [text, time] = [s:text, localtime() - a:nr] - let mins = time / 60 - let hrs = time / 3600 - let days = time / 86400 - let wks = time / 604800 - let mons = time / 2592000 - let yrs = time / 31536000 - if yrs > 1 - retu yrs.text[7] - elsei mons > 1 - retu mons.text[6] - elsei wks > 1 - retu wks.text[5] - elsei days > 1 - retu days.text[4] - elsei hrs > 1 - retu hrs.text[3] - elsei mins > 1 - retu mins.text[2] - elsei time == 1 - retu time.text[0] - elsei time < 120 - retu time.text[1] - en -endf - -fu! s:syntax() - if ctrlp#nosy() | retu | en - for [ke, va] in items({'T': 'Directory', 'Br': 'Comment', 'Nr': 'String', - \ 'Sv': 'Comment', 'Po': 'Title'}) - cal ctrlp#hicheck('CtrlPUndo'.ke, va) - endfo - sy match CtrlPUndoT '\v\d+ \zs[^ ]+\ze|\d+:\d+:\d+' - sy match CtrlPUndoBr '\[\|\]' - sy match CtrlPUndoNr '\[\d\+\]' contains=CtrlPUndoBr - sy match CtrlPUndoSv 'saved' - sy match CtrlPUndoPo 'current' -endf - -fu! s:dict2list(dict) - for ke in keys(a:dict) - let a:dict[ke][0] = s:elapsed(a:dict[ke][0]) - endfo - retu map(keys(a:dict), 'eval(''[v:val, a:dict[v:val]]'')') -endf - -fu! s:compval(...) - retu a:2[0] - a:1[0] -endf - -fu! s:format(...) - let saved = !empty(a:1[1][1]) ? ' '.a:1[1][1] : '' - let current = !empty(a:1[1][2]) ? ' '.a:1[1][2] : '' - retu a:1[1][0].' ['.a:1[0].']'.saved.current -endf - -fu! s:formatul(...) - let parts = matchlist(a:1, - \ '\v^\s+(\d+)\s+\d+\s+([^ ]+\s?[^ ]+|\d+\s\w+\s\w+)(\s*\d*)$') - retu parts == [] ? '----' - \ : parts[2].' ['.parts[1].']'.( parts[3] != '' ? ' saved' : '' ) -endf -" Public {{{1 -fu! ctrlp#undo#init() - let entries = s:undos[0] ? s:undos[1]['entries'] : s:undos[1] - if empty(entries) | retu [] | en - if !exists('s:lines') - if s:undos[0] - let entries = s:dict2list(s:flatten(entries, s:undos[1]['seq_cur'])) - let s:lines = map(sort(entries, 's:compval'), 's:format(v:val)') - el - let s:lines = map(reverse(entries), 's:formatul(v:val)') - en - en - cal s:syntax() - retu s:lines -endf - -fu! ctrlp#undo#accept(mode, str) - let undon = matchstr(a:str, '\[\zs\d\+\ze\]') - if empty(undon) | retu | en - cal ctrlp#exit() - exe 'u' undon -endf - -fu! ctrlp#undo#id() - retu s:id -endf - -fu! ctrlp#undo#enter() - let s:undos = s:getundo() -endf - -fu! ctrlp#undo#exit() - unl! s:lines -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/autoload/ctrlp/utils.vim b/vim-bundle/ctrlp.vim/autoload/ctrlp/utils.vim deleted file mode 100644 index 91b9f24..0000000 --- a/vim-bundle/ctrlp.vim/autoload/ctrlp/utils.vim +++ /dev/null @@ -1,110 +0,0 @@ -" ============================================================================= -" File: autoload/ctrlp/utils.vim -" Description: Utilities -" Author: Kien Nguyen -" ============================================================================= - -" Static variables {{{1 -fu! ctrlp#utils#lash() - retu &ssl || !exists('+ssl') ? '/' : '\' -endf - -fu! s:lash(...) - retu ( a:0 ? a:1 : getcwd() ) !~ '[\/]$' ? s:lash : '' -endf - -fu! ctrlp#utils#opts() - let s:lash = ctrlp#utils#lash() - let usrhome = $HOME . s:lash( $HOME ) - let cahome = exists('$XDG_CACHE_HOME') ? $XDG_CACHE_HOME : usrhome.'.cache' - let cadir = isdirectory(usrhome.'.ctrlp_cache') - \ ? usrhome.'.ctrlp_cache' : cahome.s:lash(cahome).'ctrlp' - if exists('g:ctrlp_cache_dir') - let cadir = expand(g:ctrlp_cache_dir, 1) - if isdirectory(cadir.s:lash(cadir).'.ctrlp_cache') - let cadir = cadir.s:lash(cadir).'.ctrlp_cache' - en - en - let s:cache_dir = cadir -endf -cal ctrlp#utils#opts() - -let s:wig_cond = v:version > 702 || ( v:version == 702 && has('patch051') ) -" Files and Directories {{{1 -fu! ctrlp#utils#cachedir() - retu s:cache_dir -endf - -fu! ctrlp#utils#cachefile(...) - let [tail, dir] = [a:0 == 1 ? '.'.a:1 : '', a:0 == 2 ? a:1 : getcwd()] - let cache_file = substitute(dir, '\([\/]\|^\a\zs:\)', '%', 'g').tail.'.txt' - retu a:0 == 1 ? cache_file : s:cache_dir.s:lash(s:cache_dir).cache_file -endf - -fu! ctrlp#utils#readfile(file) - if filereadable(a:file) - let data = readfile(a:file) - if empty(data) || type(data) != 3 - unl data - let data = [] - en - retu data - en - retu [] -endf - -fu! ctrlp#utils#mkdir(dir) - if exists('*mkdir') && !isdirectory(a:dir) - sil! cal mkdir(a:dir, 'p') - en - retu a:dir -endf - -fu! ctrlp#utils#writecache(lines, ...) - if isdirectory(ctrlp#utils#mkdir(a:0 ? a:1 : s:cache_dir)) - sil! cal writefile(a:lines, a:0 >= 2 ? a:2 : ctrlp#utils#cachefile()) - en -endf - -fu! ctrlp#utils#glob(...) - let path = ctrlp#utils#fnesc(a:1, 'g') - retu s:wig_cond ? glob(path, a:2) : glob(path) -endf - -fu! ctrlp#utils#globpath(...) - retu call('globpath', s:wig_cond ? a:000 : a:000[:1]) -endf - -fu! ctrlp#utils#fnesc(path, type, ...) - if exists('*fnameescape') - if exists('+ssl') - if a:type == 'c' - let path = escape(a:path, '%#') - elsei a:type == 'f' - let path = fnameescape(a:path) - elsei a:type == 'g' - let path = escape(a:path, '?*') - en - let path = substitute(path, '[', '[[]', 'g') - el - let path = fnameescape(a:path) - en - el - if exists('+ssl') - if a:type == 'c' - let path = escape(a:path, '%#') - elsei a:type == 'f' - let path = escape(a:path, " \t\n%#*?|<\"") - elsei a:type == 'g' - let path = escape(a:path, '?*') - en - let path = substitute(path, '[', '[[]', 'g') - el - let path = escape(a:path, " \t\n*?[{`$\\%#'\"|!<") - en - en - retu a:0 ? escape(path, a:1) : path -endf -"}}} - -" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/doc/ctrlp.txt b/vim-bundle/ctrlp.vim/doc/ctrlp.txt deleted file mode 100644 index e697b93..0000000 --- a/vim-bundle/ctrlp.vim/doc/ctrlp.txt +++ /dev/null @@ -1,1451 +0,0 @@ -*ctrlp.txt* Fuzzy file, buffer, mru, tag, ... finder. v1.79 -*CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'* -=============================================================================== -# # -# :::::::: ::::::::::: ::::::::: ::: ::::::::: # -# :+: :+: :+: :+: :+: :+: :+: :+: # -# +:+ +:+ +:+ +:+ +:+ +:+ +:+ # -# +#+ +#+ +#++:++#: +#+ +#++:++#+ # -# +#+ +#+ +#+ +#+ +#+ +#+ # -# #+# #+# #+# #+# #+# #+# #+# # -# ######## ### ### ### ########## ### # -# # -=============================================================================== -CONTENTS *ctrlp-contents* - - 1. Intro........................................|ctrlp-intro| - 2. Options......................................|ctrlp-options| - 3. Commands.....................................|ctrlp-commands| - 4. Mappings.....................................|ctrlp-mappings| - 5. Input Formats................................|ctrlp-input-formats| - 6. Extensions...................................|ctrlp-extensions| - -=============================================================================== -INTRO *ctrlp-intro* - -Full path fuzzy file, buffer, mru, tag, ... finder with an intuitive interface. -Written in pure Vimscript for MacVim, gVim and Vim version 7.0+. Has full -support for Vim's |regexp| as search pattern, built-in MRU files monitoring, -project's root finder, and more. - -To enable optional extensions (tag, dir, rtscript...), see |ctrlp-extensions|. - -=============================================================================== -OPTIONS *ctrlp-options* - -Overview:~ - - |loaded_ctrlp|................Disable the plugin. - |ctrlp_map|...................Default mapping. - |ctrlp_cmd|...................Default command used for the default mapping. - |ctrlp_by_filename|...........Default to filename mode or not. - |ctrlp_regexp|................Default to regexp mode or not. - |ctrlp_match_window|..........Order, height and position of the match window. - |ctrlp_switch_buffer|.........Jump to an open buffer if already opened. - |ctrlp_reuse_window|..........Reuse special windows (help, quickfix, etc). - |ctrlp_tabpage_position|......Where to put the new tab page. - |ctrlp_working_path_mode|.....How to set CtrlP's local working directory. - |ctrlp_root_markers|..........Additional, high priority root markers. - |ctrlp_use_caching|...........Use per-session caching or not. - |ctrlp_clear_cache_on_exit|...Keep cache after exiting Vim or not. - |ctrlp_cache_dir|.............Location of the cache directory. - |ctrlp_show_hidden|...........Ignore dotfiles and dotdirs or not. - |ctrlp_custom_ignore|.........Hide stuff when using |globpath()|. - |ctrlp_max_files|.............Number of files to scan initially. - |ctrlp_max_depth|.............Directory depth to recurse into when scanning. - |ctrlp_user_command|..........Use an external scanner. - |ctrlp_max_history|...........Number of entries saved in the prompt history. - |ctrlp_open_new_file|.........How to open a file created by . - |ctrlp_open_multiple_files|...How to open files selected by . - |ctrlp_arg_map|...............Intercept and or not. - |ctrlp_follow_symlinks|.......Follow symbolic links or not. - |ctrlp_lazy_update|...........Only update when typing has stopped. - |ctrlp_default_input|.........Seed the prompt with an initial string. - |ctrlp_abbrev|................Input abbreviations. - |ctrlp_key_loop|..............Use input looping for multi-byte input. - |ctrlp_use_migemo|............Use Migemo patterns for Japanese filenames. - |ctrlp_prompt_mappings|.......Change the mappings inside the prompt. - - MRU mode: - |ctrlp_mruf_max|..............Max MRU entries to remember. - |ctrlp_mruf_exclude|..........Files that shouldn't be remembered. - |ctrlp_mruf_include|..........Files to be remembered. - |ctrlp_mruf_relative|.........Show only MRU files in the working directory. - |ctrlp_mruf_default_order|....Disable sorting. - |ctrlp_mruf_case_sensitive|...MRU files are case sensitive or not. - |ctrlp_mruf_save_on_update|...Save to disk whenever a new entry is added. - - BufferTag mode: (to enable, see |ctrlp-extensions|) - |g:ctrlp_buftag_ctags_bin|....The location of the ctags-compatible binary. - |g:ctrlp_buftag_systemenc|....The encoding used for the ctags command. - |g:ctrlp_buftag_types|........Add new filetypes and set the cmd arguments. - - Advanced options: - |ctrlp_open_func|.............Use custom file opening functions. - |ctrlp_status_func|...........Change CtrlP's two statuslines. - |ctrlp_buffer_func|...........Call custom functions in the CtrlP buffer. - |ctrlp_match_func|............Replace the built-in matching algorithm. - -------------------------------------------------------------------------------- -Detailed descriptions and default values:~ - - *'g:ctrlp_map'* -Use this option to change the mapping to invoke CtrlP in |Normal| mode: > - let g:ctrlp_map = '' -< - - *'g:ctrlp_cmd'* -Set the default opening command to use when pressing the above mapping: > - let g:ctrlp_cmd = 'CtrlP' -< - - *'g:loaded_ctrlp'* -Use this to disable the plugin completely: > - let g:loaded_ctrlp = 1 -< - - *'g:ctrlp_by_filename'* -Set this to 1 to set searching by filename (as opposed to full path) as the -default: > - let g:ctrlp_by_filename = 0 -< -Can be toggled on/off by pressing inside the prompt. - - *'g:ctrlp_regexp'* -Set this to 1 to set regexp search as the default: > - let g:ctrlp_regexp = 0 -< -Can be toggled on/off by pressing inside the prompt. - - *'g:ctrlp_match_window'* -Change the postion, the listing order of results, the minimum and the maximum -heights of the match window: > - let g:ctrlp_match_window = '' -< -Example: > - let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:10' -< -The position: (default: bottom) - top - show the match window at the top of the screen. - bottom - show the match window at the bottom of the screen. - -The listing order of results: (default: btt) - order:ttb - from top to bottom. - order:btt - from bottom to top. - -The minimum and maximum heights: - min:{n} - show minimum {n} lines (default: 1). - max:{n} - show maximum {n} lines (default: 10). - -The maximum number of results: - results:{n} - list maximum {n} results (default: sync with max height). - -Note: When a setting isn't set, its default value will be used. - - *'g:ctrlp_switch_buffer'* -When opening a file, if it's already open in a window somewhere, CtrlP will try -to jump to it instead of opening a new instance: > - let g:ctrlp_switch_buffer = 'Et' -< - e - jump when is pressed, but only to windows in the current tab. - t - jump when is pressed, but only to windows in another tab. - v - like "e", but jump when is pressed. - h - like "e", but jump when is pressed. - E, T, V, H - like "e", "t", "v", and "h", but jump to windows anywhere. - 0 or - disable this feature. - - *'g:ctrlp_reuse_window'* -When opening a file with , CtrlP avoids opening it in windows created by -plugins, help and quickfix. Use this to setup some exceptions: > - let g:ctrlp_reuse_window = 'netrw' -< -Acceptable values are partial name, filetype or buftype of the special buffers. -Use regexp to specify the pattern. -Example: > - let g:ctrlp_reuse_window = 'netrw\|help\|quickfix' -< - - *'g:ctrlp_tabpage_position'* -Where to put the new tab page when opening one: > - let g:ctrlp_tabpage_position = 'ac' -< - a - after. - b - before. - c - the current tab page. - l - the last tab page. - f - the first tab page. - - *'g:ctrlp_working_path_mode'* -When starting up, CtrlP sets its local working directory according to this -variable: > - let g:ctrlp_working_path_mode = 'ra' -< - c - the directory of the current file. - a - like "c", but only applies when the current working directory outside of - CtrlP isn't a direct ancestor of the directory of the current file. - r - the nearest ancestor that contains one of these directories or files: - .git .hg .svn .bzr _darcs - w - begin finding a root from the current working directory outside of CtrlP - instead of from the directory of the current file (default). Only applies - when "r" is also present. - 0 or - disable this feature. - -Note #1: if "a" or "c" is included with "r", use the behavior of "a" or "c" (as -a fallback) when a root can't be found. - -Note #2: you can use a |b:var| to set this option on a per buffer basis. - - *'g:ctrlp_root_markers'* -Use this to set your own root markers in addition to the default ones (.git, -.hg, .svn, .bzr, and _darcs). Your markers will take precedence: > - let g:ctrlp_root_markers = [''] -< -Note: you can use a |b:var| to set this option on a per buffer basis. - - *'g:ctrlp_use_caching'* -Enable/Disable per-session caching: > - let g:ctrlp_use_caching = 1 -< - 0 - Disable caching. - 1 - Enable caching. - n - When bigger than 1, disable caching and use the number as the limit to - enable caching again. - -Note: you can quickly purge the cache by pressing while inside CtrlP. - - *'g:ctrlp_clear_cache_on_exit'* -Set this to 0 to enable cross-session caching by not deleting the cache files -upon exiting Vim: > - let g:ctrlp_clear_cache_on_exit = 1 -< - - *'g:ctrlp_cache_dir'* -Set the directory to store the cache files: > - let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp' -< - - *'g:ctrlp_show_hidden'* -Set this to 1 if you want CtrlP to scan for dotfiles and dotdirs: > - let g:ctrlp_show_hidden = 0 -< -Note: does not apply when a command defined with |g:ctrlp_user_command| is -being used. - - *'ctrlp-wildignore'* -You can use Vim's |'wildignore'| to exclude files and directories from the -results. -Examples: > - " Excluding version control directories - set wildignore+=*/.git/*,*/.hg/*,*/.svn/* " Linux/MacOSX - set wildignore+=*\\.git\\*,*\\.hg\\*,*\\.svn\\* " Windows ('noshellslash') -< -Note #1: the `*/` in front of each directory glob is required. - -Note #2: |wildignore| influences the result of |expand()|, |globpath()| and -|glob()| which many plugins use to find stuff on the system (e.g. VCS related -plugins look for .git/, .hg/,... some other plugins look for external *.exe -tools on Windows). So be a little mindful of what you put in your |wildignore|. - - *'g:ctrlp_custom_ignore'* -In addition to |'wildignore'|, use this for files and directories you want only -CtrlP to not show. Use regexp to specify the patterns: > - let g:ctrlp_custom_ignore = '' -< -Examples: > - let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$' - let g:ctrlp_custom_ignore = { - \ 'dir': '\v[\/]\.(git|hg|svn)$', - \ 'file': '\v\.(exe|so|dll)$', - \ 'link': 'SOME_BAD_SYMBOLIC_LINKS', - \ } - let g:ctrlp_custom_ignore = { - \ 'file': '\v(\.cpp|\.h|\.hh|\.cxx)@ - let g:ctrlp_max_files = 10000 -< -Note: does not apply when a command defined with |g:ctrlp_user_command| is -being used. - - *'g:ctrlp_max_depth'* -The maximum depth of a directory tree to recurse into: > - let g:ctrlp_max_depth = 40 -< -Note: does not apply when a command defined with |g:ctrlp_user_command| is -being used. - - *'g:ctrlp_user_command'* -Specify an external tool to use for listing files instead of using Vim's -|globpath()|. Use %s in place of the target directory: > - let g:ctrlp_user_command = '' -< -Examples: > - let g:ctrlp_user_command = 'find %s -type f' " MacOSX/Linux - let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows -< -You can also use 'grep', 'findstr' or something else to filter the results. -Examples: > - let g:ctrlp_user_command = - \ 'find %s -type f | grep -v -P "\.jpg$|/tmp/"' " MacOSX/Linux - let g:ctrlp_user_command = - \ 'dir %s /-n /b /s /a-d | findstr /v /l ".jpg \\tmp\\"' " Windows -< -Use a version control listing command when inside a repository, this is faster -when scanning large projects: > - let g:ctrlp_user_command = [root_marker, listing_command, fallback_command] - let g:ctrlp_user_command = { - \ 'types': { - \ 1: [root_marker_1, listing_command_1], - \ n: [root_marker_n, listing_command_n], - \ }, - \ 'fallback': fallback_command, - \ 'ignore': 0 or 1 - \ } -< -Some examples: > - " Single VCS, listing command does not list untracked files: - let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files'] - let g:ctrlp_user_command = ['.hg', 'hg --cwd %s locate -I .'] - - " Multiple VCS's: - let g:ctrlp_user_command = { - \ 'types': { - \ 1: ['.git', 'cd %s && git ls-files'], - \ 2: ['.hg', 'hg --cwd %s locate -I .'], - \ }, - \ 'fallback': 'find %s -type f' - \ } - - " Single VCS, listing command lists untracked files (slower): - let g:ctrlp_user_command = - \ ['.git', 'cd %s && git ls-files . -co --exclude-standard'] - - let g:ctrlp_user_command = - \ ['.hg', 'hg --cwd %s status -numac -I . $(hg root)'] " MacOSX/Linux - - let g:ctrlp_user_command = ['.hg', 'for /f "tokens=1" %%a in (''hg root'') ' - \ . 'do hg --cwd %s status -numac -I . %%a'] " Windows -< -Note #1: in the |Dictionary| format, 'fallback' and 'ignore' are optional. In -the |List| format, fallback_command is optional. - -Note #2: if the fallback_command is empty or the 'fallback' key is not defined, -|globpath()| will then be used when scanning outside of a repository. - -Note #3: unless the |Dictionary| format is used and 'ignore' is defined and set -to 1, the |wildignore| and |g:ctrlp_custom_ignore| options do not apply when -these custom commands are being used. When not present, 'ignore' is set to 0 by -default to retain the performance advantage of using external commands. - -Note #4: when changing the option's variable type, remember to |:unlet| it -first or restart Vim to avoid the "E706: Variable type mismatch" error. - -Note #5: you can use a |b:var| to set this option on a per buffer basis. - - *'g:ctrlp_max_history'* -The maximum number of input strings you want CtrlP to remember. The default -value mirrors Vim's global |'history'| option: > - let g:ctrlp_max_history = &history -< -Set to 0 to disable prompt's history. Browse the history with and . - - *'g:ctrlp_open_new_file'* -Use this option to specify how the newly created file is to be opened when -pressing : > - let g:ctrlp_open_new_file = 'v' -< - t - in a new tab. - h - in a new horizontal split. - v - in a new vertical split. - r - in the current window. - - *'g:ctrlp_open_multiple_files'* -If non-zero, this will enable opening multiple files with and : > - let g:ctrlp_open_multiple_files = 'v' -< -Example: > - let g:ctrlp_open_multiple_files = '2vjr' -< -For the number: - - If given, it'll be used as the maximum number of windows or tabs to create - when opening the files (the rest will be opened as hidden buffers). - - If not given, will open all files, each in a new window or new tab. - -For the letters: - t - each file in a new tab. - h - each file in a new horizontal split. - v - each file in a new vertical split. - i - all files as hidden buffers. - j - after opening, jump to the first opened tab or window. - r - open the first file in the current window, then the remaining files in - new splits or new tabs depending on which of "h", "v" and "t" is also - present. - - *'g:ctrlp_arg_map'* -When this is set to 1, the and mappings will accept one extra key -as an argument to override their default behavior: > - let g:ctrlp_arg_map = 0 -< -Pressing or will then prompt for a keypress. The key can be: - t - open in tab(s) - h - open in horizontal split(s) - v - open in vertical split(s) - i - open as hidden buffers (for only) - c - clear the marked files (for only) - r - open in the current window (for only) - , , - cancel and go back to the prompt. - - use the default behavior specified with |g:ctrlp_open_new_file| and - |g:ctrlp_open_multiple_files|. - - *'g:ctrlp_follow_symlinks'* -If non-zero, CtrlP will follow symbolic links when listing files: > - let g:ctrlp_follow_symlinks = 0 -< - 0 - don't follow symbolic links. - 1 - follow but ignore looped internal symlinks to avoid duplicates. - 2 - follow all symlinks indiscriminately. - -Note: does not apply when a command defined with |g:ctrlp_user_command| is -being used. - - *'g:ctrlp_lazy_update'* -Set this to 1 to enable the lazy-update feature: only update the match window -after typing's been stopped for a certain amount of time: > - let g:ctrlp_lazy_update = 0 -< -If is 1, update after 250ms. If bigger than 1, the number will be used as the -delay time in milliseconds. - - *'g:ctrlp_default_input'* -Set this to 1 to enable seeding the prompt with the current file's relative -path: > - let g:ctrlp_default_input = 0 -< -Instead of 1 or 0, if the value of the option is a string, it'll be used as-is -as the default input: > - let g:ctrlp_default_input = 'anystring' -< - - *'g:ctrlp_abbrev'* -Define input abbreviations that can be expanded (either internally or visibly) -in the prompt: > - let g:ctrlp_abbrev = {} -< -Examples: > - let g:ctrlp_abbrev = { - \ 'gmode': 'i', - \ 'abbrevs': [ - \ { - \ 'pattern': '^cd b', - \ 'expanded': '@cd ~/.vim/bundle', - \ 'mode': 'pfrz', - \ }, - \ { - \ 'pattern': '\(^@.\+\|\\\@ (use the expanded string in the - new filename). - c - only when auto-completing directory names with (expand the pattern - immediately before doing the auto-completion). - or not defined - always enable. - -Note: the abbrev entries are evaluated in sequence, so a later entry can be -evaluated against the expanded result of a previous entry; this includes itself -when 'gmode' is "t". - - *'g:ctrlp_key_loop'* -An experimental feature. Set this to 1 to enable input looping for the typing -of multi-byte characters: > - let g:ctrlp_key_loop = 0 -< -Note #1: when set, this option resets the |g:ctrlp_lazy_update| option. - -Note #2: you can toggle this feature inside the prompt with a custom mapping: > - let g:ctrlp_prompt_mappings = { 'ToggleKeyLoop()': [''] } -< - - *'g:ctrlp_use_migemo'* -Set this to 1 to use Migemo Pattern for Japanese filenames. Migemo Search only -works in regexp mode. To split the pattern, separate words with space: > - let g:ctrlp_use_migemo = 0 -< - - *'g:ctrlp_prompt_mappings'* -Use this to customize the mappings inside CtrlP's prompt to your liking. You -only need to keep the lines that you've changed the values (inside []): > - let g:ctrlp_prompt_mappings = { - \ 'PrtBS()': ['', ''], - \ 'PrtDelete()': [''], - \ 'PrtDeleteWord()': [''], - \ 'PrtClear()': [''], - \ 'PrtSelectMove("j")': ['', ''], - \ 'PrtSelectMove("k")': ['', ''], - \ 'PrtSelectMove("t")': ['', ''], - \ 'PrtSelectMove("b")': ['', ''], - \ 'PrtSelectMove("u")': ['', ''], - \ 'PrtSelectMove("d")': ['', ''], - \ 'PrtHistory(-1)': [''], - \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], - \ 'AcceptSelection("h")': ['', '', ''], - \ 'AcceptSelection("t")': [''], - \ 'AcceptSelection("v")': ['', ''], - \ 'ToggleFocus()': [''], - \ 'ToggleRegex()': [''], - \ 'ToggleByFname()': [''], - \ 'ToggleType(1)': ['', ''], - \ 'ToggleType(-1)': ['', ''], - \ 'PrtExpandDir()': [''], - \ 'PrtInsert("c")': ['', ''], - \ 'PrtInsert()': [''], - \ 'PrtCurStart()': [''], - \ 'PrtCurEnd()': [''], - \ 'PrtCurLeft()': ['', '', ''], - \ 'PrtCurRight()': ['', ''], - \ 'PrtClearCache()': [''], - \ 'PrtDeleteEnt()': [''], - \ 'CreateNewFile()': [''], - \ 'MarkToOpen()': [''], - \ 'OpenMulti()': [''], - \ 'PrtExit()': ['', '', ''], - \ } -< -Note: if pressing moves the cursor one character to the left instead of -deleting a character for you, add this to your |.vimrc| to disable the plugin's -default mapping: > - let g:ctrlp_prompt_mappings = { 'PrtCurLeft()': ['', ''] } -< - ----------------------------------------- -MRU mode options:~ - - *'g:ctrlp_mruf_max'* -Specify the number of recently opened files you want CtrlP to remember: > - let g:ctrlp_mruf_max = 250 -< - - *'g:ctrlp_mruf_exclude'* -Files you don't want CtrlP to remember. Use regexp to specify the patterns: > - let g:ctrlp_mruf_exclude = '' -< -Examples: > - let g:ctrlp_mruf_exclude = '/tmp/.*\|/temp/.*' " MacOSX/Linux - let g:ctrlp_mruf_exclude = '^C:\\dev\\tmp\\.*' " Windows -< - - *'g:ctrlp_mruf_include'* -And if you want CtrlP to only remember some files, specify them here: > - let g:ctrlp_mruf_include = '' -< -Example: > - let g:ctrlp_mruf_include = '\.py$\|\.rb$' -< - - *'g:ctrlp_mruf_relative'* -Set this to 1 to show only MRU files in the current working directory: > - let g:ctrlp_mruf_relative = 0 -< -Note: you can use a custom mapping to toggle this option inside the prompt: > - let g:ctrlp_prompt_mappings = { 'ToggleMRURelative()': [''] } -< - - *'g:ctrlp_mruf_default_order'* -Set this to 1 to disable sorting when searching in MRU mode: > - let g:ctrlp_mruf_default_order = 0 -< - - *'g:ctrlp_mruf_case_sensitive'* -Match this with your file system case-sensitivity setting to avoid duplicate -MRU entries: > - let g:ctrlp_mruf_case_sensitive = 1 -< - - *'g:ctrlp_mruf_save_on_update'* -Set this to 0 to disable saving of the MRU list to hard drive whenever a new -entry is added, saving will then only occur when exiting Vim: > - let g:ctrlp_mruf_save_on_update = 1 -< - ----------------------------------------- -Advanced options:~ - - *'g:ctrlp_open_func'* -Define a custom function to open the selected file: > - let g:ctrlp_open_func = {} -< -Example: > - let g:ctrlp_open_func = { - \ 'files' : 'Function_Name_1', - \ 'buffers' : 'Function_Name_2', - \ 'mru files' : 'Function_Name_3', - \ } -< -Structure of the functions: > - function! Function_Name(action, line) - " Arguments: - " | - " +- a:action : The opening action: - " | + 'e' : user pressed (default) - " | + 'h' : user pressed (default) - " | + 'v' : user pressed (default) - " | + 't' : user pressed (default) - " | + 'x' : user used the console dialog (default) and - " | chose "e[x]ternal". - " | - " +- a:line : The selected line. - - endfunction -< -Note: does not apply when opening multiple files with and . - -Example: open HTML files in the default web browser when is pressed and -in Vim otherwise > - function! HTMLOpenFunc(action, line) - if a:action =~ '^[tx]$' && fnamemodify(a:line, ':e') =~? '^html\?$' - - " Get the filename - let filename = fnameescape(fnamemodify(a:line, ':p')) - - " Close CtrlP - call ctrlp#exit() - - " Open the file - silent! execute '!xdg-open' filename - - elseif a:action == 'x' && fnamemodify(a:line, ':e') !~? '^html\?$' - - " Not a HTML file, simulate pressing again and wait for new input - call feedkeys("\") - - else - - " Use CtrlP's default file opening function - call call('ctrlp#acceptfile', [a:action, a:line]) - - endif - endfunction - - let g:ctrlp_open_func = { 'files': 'HTMLOpenFunc' } -< - - *'g:ctrlp_status_func'* -Use this to customize the statuslines for the CtrlP window: > - let g:ctrlp_status_func = {} -< -Example: > - let g:ctrlp_status_func = { - \ 'main': 'Function_Name_1', - \ 'prog': 'Function_Name_2', - \ } -< -Structure of the functions: > - " Main statusline - function! Function_Name_1(focus, byfname, regex, prev, item, next, marked) - " Arguments: - " | - " +- a:focus : The focus of the prompt: "prt" or "win". - " | - " +- a:byfname : In filename mode or in full path mode: "file" or "path". - " | - " +- a:regex : In regex mode: 1 or 0. - " | - " +- a:prev : The previous search mode. - " | - " +- a:item : The current search mode. - " | - " +- a:next : The next search mode. - " | - " +- a:marked : The number of marked files, or a comma separated list of - " the marked filenames. - - return full_statusline - endfunction - - " Progress statusline - function! Function_Name_2(str) - " a:str : Either the number of files scanned so far, or a string indicating - " the current directory is being scanned with a user_command. - - return full_statusline - endfunction -< -See https://gist.github.com/1610859 for a working example. - - *'g:ctrlp_buffer_func'* -Specify the functions that will be called after entering and before exiting the -CtrlP buffer: > - let g:ctrlp_buffer_func = {} -< -Example: > - let g:ctrlp_buffer_func = { - \ 'enter': 'Function_Name_1', - \ 'exit': 'Function_Name_2', - \ } -< - - *'g:ctrlp_match_func'* -Set an external fuzzy matching function for CtrlP to use: > - let g:ctrlp_match_func = {} -< -Example: > - let g:ctrlp_match_func = { 'match': 'Function_Name' } -< -Structure of the function: > - function! Function_Name(items, str, limit, mmode, ispath, crfile, regex) - " Arguments: - " | - " +- a:items : The full list of items to search in. - " | - " +- a:str : The string entered by the user. - " | - " +- a:limit : The max height of the match window. Can be used to limit - " | the number of items to return. - " | - " +- a:mmode : The match mode. Can be one of these strings: - " | + "full-line": match the entire line. - " | + "filename-only": match only the filename. - " | + "first-non-tab": match until the first tab char. - " | + "until-last-tab": match until the last tab char. - " | - " +- a:ispath : Is 1 when searching in file, buffer, mru, mixed, dir, and - " | rtscript modes. Is 0 otherwise. - " | - " +- a:crfile : The file in the current window. Should be excluded from the - " | results when a:ispath == 1. - " | - " +- a:regex : In regex mode: 1 or 0. - - return list_of_matched_items - endfunction -< - -Note: you can extend any of the above options with { 'arg_type': 'dict' } to -enable passing all the function arguments in a single Dictionary argument. Use -the existing argument names as keys in this Dictionary. - -Example: > - let g:ctrlp_status_func = { - \ 'arg_type' : 'dict', - \ 'enter': 'Function_Name_1', - \ 'exit': 'Function_Name_2', - \ } - - function! Function_Name_1(dict) - " where dict == { - " \ 'focus': value, - " \ 'byfname': value, - " \ 'regex': value, - " \ ... - " } - endfunction -< - -=============================================================================== -COMMANDS *ctrlp-commands* - - *:CtrlP* -:CtrlP [starting-directory] - Open CtrlP in find file mode. - - If no argument is given, the value of |g:ctrlp_working_path_mode| will be - used to determine the starting directory. - - You can use to auto-complete the [starting-directory] when typing it. - - *:CtrlPBuffer* -:CtrlPBuffer - Open CtrlP in find buffer mode. - - *:CtrlPMRU* -:CtrlPMRU - Open CtrlP in find Most-Recently-Used file mode. - - *:CtrlPLastMode* -:CtrlPLastMode [--dir] - Open CtrlP in the last mode used. When having the "--dir" argument, also - reuse the last working directory. - - *:CtrlPRoot* -:CtrlPRoot - This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'r' and ignores - the variable's current value. - - *:CtrlPClearCache* -:CtrlPClearCache - Flush the cache for the current working directory. The same as pressing - inside CtrlP. - To enable or disable caching, use the |g:ctrlp_use_caching| option. - - *:CtrlPClearAllCaches* -:CtrlPClearAllCaches - Delete all the cache files saved in |g:ctrlp_cache_dir| location. - -------------------------------------------------------------------------------- -For commands provided by bundled extensions, see |ctrlp-extensions|. - -=============================================================================== -MAPPINGS *ctrlp-mappings* - - *'ctrlp-'* - - Default |Normal| mode mapping to open the CtrlP prompt in find file mode. - ----------------------------------------- -Once inside the prompt:~ - - - Toggle between full-path search and filename only search. - Note: in filename mode, the prompt's base is '>d>' instead of '>>>' - - *'ctrlp-fullregexp'* - Toggle between the string mode and full regexp mode. - Note: in full regexp mode, the prompt's base is 'r>>' instead of '>>>' - - See also: |input-formats| (guide) and |g:ctrlp_regexp_search| (option). - - , 'forward' - - Scroll to the 'next' search mode in the sequence. - - , 'backward' - - Scroll to the 'previous' search mode in the sequence. - - *'ctrlp-autocompletion'* - Auto-complete directory names under the current working directory inside - the prompt. - - - Toggle the focus between the match window and the prompt. - - , - - Exit CtrlP. - -Moving:~ - - , - - Move selection down. - - , - - Move selection up. - - - Move the cursor to the 'start' of the prompt. - - - Move the cursor to the 'end' of the prompt. - - , - , - - Move the cursor one character to the 'left'. - - , - - Move the cursor one character to the 'right'. - -Editing:~ - - , - - Delete the preceding character. - - - Delete the current character. - - - Delete a preceding inner word. - - - Clear the input field. - -Browsing input history:~ - - - Next string in the prompt's history. - - - Previous string in the prompt's history. - -Opening/Creating a file:~ - - - Open the selected file in the 'current' window if possible. - - - Open the selected file in a new 'tab'. - - - Open the selected file in a 'vertical' split. - - , - , - - Open the selected file in a 'horizontal' split. - - - Create a new file and its parent directories. - -Opening multiple files:~ - - - - Mark/unmark a file to be opened with . - - Mark/unmark a file to create a new file in its directory using . - - - - Open files marked by . - - When no file has been marked by , open a console dialog with the - following options: - - Open the selected file: - t - in a tab page. - v - in a vertical split. - h - in a horizontal split. - r - in the current window. - i - as a hidden buffer. - x - (optional) with the function defined in |g:ctrlp_open_func|. - - Other options (not shown): - a - mark all files in the match window. - d - change CtrlP's local working directory to the selected file's - directory and switch to find file mode. - -Function keys:~ - - - - Refresh the match window and purge the cache for the current directory. - - Remove deleted files from the MRU list. - - - - Wipe the MRU list. - - Delete MRU entries marked by . - -Pasting:~ - - , *'ctrlp-pasting'* - - Paste the clipboard content into the prompt. - - - Open a console dialog to paste , , the content of the search - register, the last visual selection, the clipboard or any register into the - prompt. - -Choose your own mappings with |g:ctrlp_prompt_mappings|. - ----------------------------------------- -When inside the match window (press to switch):~ - - a-z - 0-9 - ~^-=;`',.+!@#$%&_(){}[] - Cycle through the lines which have the matching first character. - -=============================================================================== -INPUT FORMATS *ctrlp-input-formats* - -Formats for inputting in the prompt:~ - -a) Simple string. - - E.g. 'abc' is understood internally as 'a[^a]\{-}b[^b]\{-}c' - -b) When in regexp mode, the input string's treated as a Vim's regexp |pattern| - without any modification. - - E.g. 'abc\d*efg' will be read as 'abc\d*efg'. - - See |ctrlp-fullregexp| (keymap) and |g:ctrlp_regexp_search| (option) for - how to enable regexp mode. - -c) End the string with a colon ':' followed by a Vim command to execute that - command after opening the file. If you need to use ':' literally, escape it - with a backslash: '\:'. When opening multiple files, the command will be - executed on each opening file. - - E.g. Use ':45' to jump to line 45. - - Use ':/any\:string' to jump to the first instance of 'any:string'. - - Use ':+setf\ myfiletype|50' to set the filetype to 'myfiletype', then - jump to line 50. - - Use ':diffthis' when opening multiple files to run |:diffthis| on the - first 4 files. - - See also: Vim's |++opt| and |+cmd|. - -d) Submit two dots '..' to go upward the directory tree by 1 level. To go up - multiple levels, use one extra dot for each extra level: -> - Raw input Interpreted as - .. ../ - ... ../../ - .... ../../../ -< - Note: if the parent directories are large and uncached, this can be slow. - - You can also use '@cd path/' to change CtrlP's local working directory. - Use '@cd %:h' to change to the directory of the current file. - -e) Similarly, submit '/' or '\' to find and go to the project's root. - - If the project is large, using a VCS listing command to look for files - might help speeding up the intial scan (see |g:ctrlp_user_command| for more - details). - - Note: d) and e) only work in file, directory and mixed modes. - -f) Type the name of a non-existent file and press to create it. Mark a - file with to create the new file in the same directory as the marked - file. - - E.g. Using 'newdir/newfile.txt' will create a directory named 'newdir' as - well as a file named 'newfile.txt'. - - If an entry 'some/old/dirs/oldfile.txt' is marked with , then - 'newdir' and 'newfile.txt' will be created under 'some/old/dirs'. The - final path will then be 'some/old/dirs/newdir/newfile.txt'. - - Note: use '\' in place of '/' on Windows (if |'shellslash'| is not set). - -g) In filename mode (toggle with ), you can use one primary pattern and - one refining pattern separated by a semicolon. Both patterns work like (a), - or (b) when in regexp mode. - -h) Submit ? to open this help file. - -=============================================================================== -EXTENSIONS *ctrlp-extensions* - -Extensions are optional. To enable an extension, add its name to the variable -g:ctrlp_extensions: > - let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript', - \ 'undo', 'line', 'changes', 'mixed', 'bookmarkdir'] -< -The order of the items will be the order they appear on the statusline and when -using , . - -Available extensions:~ - - *:CtrlPTag* - * Tag mode:~ - - Name: 'tag' - - Command: ":CtrlPTag" - - Search for a tag within a generated central tags file, and jump to the - definition. Use the Vim's option |'tags'| to specify the names and the - locations of the tags file(s). - E.g. set tags+=doc/tags - - *:CtrlPBufTag* - *:CtrlPBufTagAll* - * Buffer Tag mode:~ - - Name: 'buffertag' - - Commands: ":CtrlPBufTag [buffer]", - ":CtrlPBufTagAll". - - Search for a tag within the current buffer or all listed buffers and jump - to the definition. Requires |exuberant_ctags| or compatible programs. - - *:CtrlPQuickfix* - * Quickfix mode:~ - - Name: 'quickfix' - - Command: ":CtrlPQuickfix" - - Search for an entry in the current quickfix errors and jump to it. - - *:CtrlPDir* - * Directory mode:~ - - Name: 'dir' - - Command: ":CtrlPDir [starting-directory]" - - Search for a directory and change the working directory to it. - - Mappings: - + change the local working directory for CtrlP and keep it open. - + change the global working directory (exit). - + change the local working directory for the current window (exit). - + change the global working directory to CtrlP's current local - working directory (exit). - - *:CtrlPRTS* - * Runtime script mode:~ - - Name: 'rtscript' - - Command: ":CtrlPRTS" - - Search for files (vimscripts, docs, snippets...) in runtimepath. - - *:CtrlPUndo* - * Undo mode:~ - - Name: 'undo' - - Command: ":CtrlPUndo" - - Browse undo history. - - *:CtrlPLine* - * Line mode:~ - - Name: 'line' - - Command: ":CtrlPLine [buffer]" - - Search for a line in all listed buffers or in the specified [buffer]. - - *:CtrlPChange* - *:CtrlPChangeAll* - * Change list mode:~ - - Name: 'changes' - - Commands: ":CtrlPChange [buffer]", - ":CtrlPChangeAll". - - Search for and jump to a recent change in the current buffer or in all - listed buffers. - - *:CtrlPMixed* - * Mixed mode:~ - - Name: 'mixed' - - Command: ":CtrlPMixed" - - Search in files, buffers and MRU files at the same time. - - *:CtrlPBookmarkDir* - *:CtrlPBookmarkDirAdd* - * BookmarkDir mode:~ - - Name: 'bookmarkdir' - - Commands: ":CtrlPBookmarkDir", - ":CtrlPBookmarkDirAdd [directory]". - - Search for a bookmarked directory and change the working directory to it. - - Mappings: - + change the local working directory for CtrlP, keep it open and - switch to find file mode. - + change the global working directory (exit). - + change the local working directory for the current window (exit). - + - - Wipe bookmark list. - - Delete entries marked by . - ----------------------------------------- -Buffer Tag mode options:~ - - *'g:ctrlp_buftag_ctags_bin'* -If ctags isn't in your $PATH, use this to set its location: > - let g:ctrlp_buftag_ctags_bin = '' -< - - *'g:ctrlp_buftag_systemenc'* -Match this with your OS's encoding (not Vim's). The default value mirrors Vim's -global |'encoding'| option: > - let g:ctrlp_buftag_systemenc = &encoding -< - - *'g:ctrlp_buftag_types'* -Use this to set the arguments for ctags, jsctags... for a given filetype: > - let g:ctrlp_buftag_types = '' -< -Examples: > - let g:ctrlp_buftag_types = { - \ 'erlang' : '--language-force=erlang --erlang-types=drmf', - \ 'javascript' : { - \ 'bin': 'jsctags', - \ 'args': '-f -', - \ }, - \ } -< - -=============================================================================== -CUSTOMIZATION *ctrlp-customization* - -Highlighting:~ - * For the CtrlP buffer: - CtrlPNoEntries : the message when no match is found (Error) - CtrlPMatch : the matched pattern (Identifier) - CtrlPLinePre : the line prefix '>' in the match window - CtrlPPrtBase : the prompt's base (Comment) - CtrlPPrtText : the prompt's text (|hl-Normal|) - CtrlPPrtCursor : the prompt's cursor when moving over the text (Constant) - - * In extensions: - CtrlPTabExtra : the part of each line that's not matched against (Comment) - CtrlPBufName : the buffer name an entry belongs to (|hl-Directory|) - CtrlPTagKind : the kind of the tag in buffer-tag mode (|hl-Title|) - CtrlPqfLineCol : the line and column numbers in quickfix mode (Comment) - CtrlPUndoT : the elapsed time in undo mode (|hl-Directory|) - CtrlPUndoBr : the square brackets [] in undo mode (Comment) - CtrlPUndoNr : the undo number inside [] in undo mode (String) - CtrlPUndoSv : the point where the file was saved (Comment) - CtrlPUndoPo : the current position in the undo tree (|hl-Title|) - CtrlPBookmark : the name of the bookmark (Identifier) - -Statuslines:~ - * Highlight groups: - CtrlPMode1 : 'file' or 'path' or 'line', and the current mode (Character) - CtrlPMode2 : 'prt' or 'win', 'regex', the working directory (|hl-LineNr|) - CtrlPStats : the scanning status (Function) - - For rebuilding the statuslines, see |g:ctrlp_status_func|. - -=============================================================================== -MISCELLANEOUS CONFIGS *ctrlp-miscellaneous-configs* - -* Using |wildignore| for |g:ctrlp_user_command|: -> - function! s:wig2cmd() - " Change wildignore into space or | separated groups - " e.g. .aux .out .toc .jpg .bmp .gif - " or .aux$\|.out$\|.toc$\|.jpg$\|.bmp$\|.gif$ - let pats = ['[*\/]*\([?_.0-9A-Za-z]\+\)\([*\/]*\)\(\\\@) - -* A standalone function to set the working directory to the project's root, or - to the parent directory of the current file if a root can't be found: -> - function! s:setcwd() - let cph = expand('%:p:h', 1) - if cph =~ '^.\+://' | retu | en - for mkr in ['.git/', '.hg/', '.svn/', '.bzr/', '_darcs/', '.vimprojects'] - let wd = call('find'.(mkr =~ '/$' ? 'dir' : 'file'), [mkr, cph.';']) - if wd != '' | let &acd = 0 | brea | en - endfo - exe 'lc!' fnameescape(wd == '' ? cph : substitute(wd, mkr.'$', '.', '')) - endfunction - - autocmd BufEnter * call s:setcwd() -< -(requires Vim 7.1.299+) - -* Using a |count| to invoke different commands using the same mapping: -> - let g:ctrlp_cmd = 'exe "CtrlP".get(["", "Buffer", "MRU"], v:count)' -< - -=============================================================================== -CREDITS *ctrlp-credits* - -Developed by Kien Nguyen . Distributed under Vim's |license|. - -Project's homepage: http://kien.github.com/ctrlp.vim -Git repository: https://github.com/kien/ctrlp.vim -Mercurial repository: https://bitbucket.org/kien/ctrlp.vim - -------------------------------------------------------------------------------- -Thanks to everyone that has submitted ideas, bug reports or helped debugging on -gibhub, bitbucket, and through email. - -Special thanks:~ - - * Woojong Koh - * Simon Ruderich - * Yasuhiro Matsumoto - * Ken Earley - * Kyo Nagashima - * Zak Johnson - * Diego Viola - * Piet Delport - * Thibault Duplessis - * Kent Sibilev - * Tacahiroy - * Luca Pette - * Seth Fowler - * Lowe Thiderman - * Christopher Fredén - * Zahary Karadjov - * Jo De Boeck - * Rudi Grinberg - * Timothy Mellor - -=============================================================================== -CHANGELOG *ctrlp-changelog* - - + Combine *g:ctrlp_match_window_bottom* *g:ctrlp_match_window_reversed* and - *g:ctrlp_max_height* into |g:ctrlp_match_window|. - + New option: |g:ctrlp_match_window|. - -Before 2012/11/30~ - - + New options: |g:ctrlp_abbrev|, - |g:ctrlp_key_loop|, - |g:ctrlp_open_func|, - |g:ctrlp_tabpage_position|, - |g:ctrlp_mruf_save_on_update| - + Rename: - *g:ctrlp_dotfiles* -> |g:ctrlp_show_hidden|. - + Change |g:ctrlp_switch_buffer|'s and |g:ctrlp_working_path_mode|'s type - (old values still work). - + New key for |g:ctrlp_user_command| when it's a Dictionary: 'ignore'. - -Before 2012/06/15~ - - + New value for |g:ctrlp_follow_symlinks|: 2. - + New value for |g:ctrlp_open_multiple_files|: 'j'. - + Allow using , , to open files marked by . - + Extend '..' (|ctrlp-input-formats| (d)) - + New input format: '@cd' (|ctrlp-input-formats| (d)) - -Before 2012/04/30~ - - + New option: |g:ctrlp_mruf_default_order| - + New feature: Bookmarked directories extension. - + New commands: |:CtrlPBookmarkDir| - |:CtrlPBookmarkDirAdd| - -Before 2012/04/15~ - - + New option: |g:ctrlp_buffer_func|, callback functions for CtrlP buffer. - + Remove: g:ctrlp_mruf_last_entered, make it a default for MRU mode. - + New commands: |:CtrlPLastMode|, open CtrlP in the last mode used. - |:CtrlPMixed|, search in files, buffers and MRU files. - -Before 2012/03/31~ - - + New options: |g:ctrlp_default_input|, default input when entering CtrlP. - |g:ctrlp_match_func|, allow using a custom fuzzy matcher. - + Rename: - *ClearCtrlPCache* -> |CtrlPClearCache| - *ClearAllCtrlPCaches* -> |CtrlPClearAllCaches| - *ResetCtrlP* -> |CtrlPReload| - -Before 2012/03/02~ - - + Rename: - *g:ctrlp_regexp_search* -> |g:ctrlp_regexp|, - *g:ctrlp_dont_split* -> |g:ctrlp_reuse_window|, - *g:ctrlp_jump_to_buffer* -> |g:ctrlp_switch_buffer|. - + Rename and tweak: - *g:ctrlp_open_multi* -> |g:ctrlp_open_multiple_files|. - + Deprecate *g:ctrlp_highlight_match* - + Extend |g:ctrlp_user_command| to support multiple commands. - + New option: |g:ctrlp_mruf_last_entered| change MRU to Recently-Entered. - -Before 2012/01/15~ - - + New mapping: Switch and . is now used for completion - of directory names under the current working directory. - + New options: |g:ctrlp_arg_map| for , to accept an argument. - |g:ctrlp_status_func| custom statusline. - |g:ctrlp_mruf_relative| show only MRU files inside cwd. - + Extend g:ctrlp_open_multi with new optional values: tr, hr, vr. - + Extend |g:ctrlp_custom_ignore| to specifically filter dir, file and link. - -Before 2012/01/05~ - - + New feature: Buffer Tag extension. - + New commands: |:CtrlPBufTag|, |:CtrlPBufTagAll|. - + New options: |g:ctrlp_cmd|, - |g:ctrlp_custom_ignore| - -Before 2011/11/30~ - - + New features: Tag, Quickfix and Directory extensions. - + New commands: |:CtrlPTag|, |:CtrlPQuickfix|, |:CtrlPDir|. - + New options: |g:ctrlp_use_migemo|, - |g:ctrlp_lazy_update|, - |g:ctrlp_follow_symlinks| - -Before 2011/11/13~ - - + New special input: '/' and '\' find root (|ctrlp-input-formats| (e)) - + Remove ctrlp#SetWorkingPath(). - + Remove *g:ctrlp_mru_files* and make MRU mode permanent. - + Extend g:ctrlp_open_multi, add new ways to open files. - + New option: g:ctrlp_dont_split, - |g:ctrlp_mruf_case_sensitive| - -Before 2011/10/30~ - - + New feature: Support for custom extensions. - also removes non-existent files from MRU list. - + New option: g:ctrlp_jump_to_buffer - -Before 2011/10/12~ - - + New features: Open multiple files. - Pass Vim's |++opt| and |+cmd| to the opening file - (|ctrlp-input-formats| (c)) - Auto-complete each dir for |:CtrlP| [starting-directory] - + New mappings: mark/unmark a file to be opened with . - open all marked files. - + New option: g:ctrlp_open_multi - + Remove *g:ctrlp_persistent_input* *g:ctrlp_live_update* and . - -Before 2011/09/29~ - - + New mappings: , next/prev string in the input history. - create a new file and its parent dirs. - + New options: |g:ctrlp_open_new_file|, - |g:ctrlp_max_history| - + Added a new open-in-horizontal-split mapping: - -Before 2011/09/19~ - - + New command: ResetCtrlP - + New options: |g:ctrlp_max_files|, - |g:ctrlp_max_depth|, - g:ctrlp_live_update - + New mapping: - -Before 2011/09/12~ - - + Ability to cycle through matched lines in the match window. - + Extend the behavior of g:ctrlp_persistent_input - + Extend the behavior of |:CtrlP| - + New options: |g:ctrlp_dotfiles|, - |g:ctrlp_clear_cache_on_exit|, - g:ctrlp_highlight_match, - |g:ctrlp_user_command| - + New special input: '..' (|ctrlp-input-formats| (d)) - + New mapping: . - + New commands: |:CtrlPCurWD|, - |:CtrlPCurFile|, - |:CtrlPRoot| - - + New feature: Search in most recently used (MRU) files - + New mapping: . - + Extended the behavior of . - + New options: g:ctrlp_mru_files, - |g:ctrlp_mruf_max|, - |g:ctrlp_mruf_exclude|, - |g:ctrlp_mruf_include| - + New command: |:CtrlPMRU| - -First public release: 2011/09/06~ - -=============================================================================== -vim:ft=help:et:ts=2:sw=2:sts=2:norl diff --git a/vim-bundle/ctrlp.vim/plugin/ctrlp.vim b/vim-bundle/ctrlp.vim/plugin/ctrlp.vim deleted file mode 100644 index c7b8fa3..0000000 --- a/vim-bundle/ctrlp.vim/plugin/ctrlp.vim +++ /dev/null @@ -1,68 +0,0 @@ -" ============================================================================= -" File: plugin/ctrlp.vim -" Description: Fuzzy file, buffer, mru, tag, etc finder. -" Author: Kien Nguyen -" ============================================================================= -" GetLatestVimScripts: 3736 1 :AutoInstall: ctrlp.zip - -if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp - fini -en -let g:loaded_ctrlp = 1 - -let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs, - \ g:ctrlp_allmixes, g:ctrlp_buftags, g:ctrlp_ext_vars, g:ctrlp_builtins] - \ = [[], [], [], [], {}, {}, [], 2] - -if !exists('g:ctrlp_map') | let g:ctrlp_map = '' | en -if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en - -com! -n=? -com=dir CtrlP cal ctrlp#init(0, { 'dir': }) -com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init(2, { 'dir': }) - -com! -bar CtrlPBuffer cal ctrlp#init(1) -com! -n=? CtrlPLastMode cal ctrlp#init(-1, { 'args': }) - -com! -bar CtrlPClearCache cal ctrlp#clr() -com! -bar CtrlPClearAllCaches cal ctrlp#clra() - -com! -bar ClearCtrlPCache cal ctrlp#clr() -com! -bar ClearAllCtrlPCaches cal ctrlp#clra() - -com! -bar CtrlPCurWD cal ctrlp#init(0, { 'mode': '' }) -com! -bar CtrlPCurFile cal ctrlp#init(0, { 'mode': 'c' }) -com! -bar CtrlPRoot cal ctrlp#init(0, { 'mode': 'r' }) - -if g:ctrlp_map != '' && !hasmapto(':'.g:ctrlp_cmd.'', 'n') - exe 'nn ' g:ctrlp_map ':'.g:ctrlp_cmd.'' -en - -cal ctrlp#mrufiles#init() - -com! -bar CtrlPTag cal ctrlp#init(ctrlp#tag#id()) -com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id()) - -com! -n=? -com=dir CtrlPDir - \ cal ctrlp#init(ctrlp#dir#id(), { 'dir': }) - -com! -n=? -com=buffer CtrlPBufTag - \ cal ctrlp#init(ctrlp#buffertag#cmd(0, )) - -com! -bar CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1)) -com! -bar CtrlPRTS cal ctrlp#init(ctrlp#rtscript#id()) -com! -bar CtrlPUndo cal ctrlp#init(ctrlp#undo#id()) - -com! -n=? -com=buffer CtrlPLine - \ cal ctrlp#init(ctrlp#line#cmd(1, )) - -com! -n=? -com=buffer CtrlPChange - \ cal ctrlp#init(ctrlp#changes#cmd(0, )) - -com! -bar CtrlPChangeAll cal ctrlp#init(ctrlp#changes#cmd(1)) -com! -bar CtrlPMixed cal ctrlp#init(ctrlp#mixed#id()) -com! -bar CtrlPBookmarkDir cal ctrlp#init(ctrlp#bookmarkdir#id()) - -com! -n=? -com=dir CtrlPBookmarkDirAdd - \ cal ctrlp#call('ctrlp#bookmarkdir#add', ) - -" vim:ts=2:sw=2:sts=2 diff --git a/vim-bundle/ctrlp.vim/readme.md b/vim-bundle/ctrlp.vim/readme.md deleted file mode 100644 index bcd07c7..0000000 --- a/vim-bundle/ctrlp.vim/readme.md +++ /dev/null @@ -1,88 +0,0 @@ -# ctrlp.vim -Full path fuzzy __file__, __buffer__, __mru__, __tag__, __...__ finder for Vim. - -* Written in pure Vimscript for MacVim, gVim and Vim 7.0+. -* Full support for Vim's regexp as search patterns. -* Built-in Most Recently Used (MRU) files monitoring. -* Built-in project's root finder. -* Open multiple files at once. -* Create new files and directories. -* [Extensible][2]. - -![ctrlp][1] - -## Basic Usage -* Run `:CtrlP` or `:CtrlP [starting-directory]` to invoke CtrlP in find file mode. -* Run `:CtrlPBuffer` or `:CtrlPMRU` to invoke CtrlP in find buffer or find MRU file mode. -* Run `:CtrlPMixed` to search in Files, Buffers and MRU files at the same time. - -Check `:help ctrlp-commands` and `:help ctrlp-extensions` for other commands. - -##### Once CtrlP is open: -* Press `` to purge the cache for the current directory to get new files, remove deleted files and apply new ignore options. -* Press `` and `` to cycle between modes. -* Press `` to switch to filename only search instead of full path. -* Press `` to switch to regexp mode. -* Use ``, `` or the arrow keys to navigate the result list. -* Use `` or ``, `` to open the selected entry in a new tab or in a new split. -* Use ``, `` to select the next/previous string in the prompt's history. -* Use `` to create a new file and its parent directories. -* Use `` to mark/unmark multiple files and `` to open them. - -Run `:help ctrlp-mappings` or submit `?` in CtrlP for more mapping help. - -* Submit two or more dots `..` to go up the directory tree by one or multiple levels. -* End the input string with a colon `:` followed by a command to execute it on the opening file(s): -Use `:25` to jump to line 25. -Use `:diffthis` when opening multiple files to run `:diffthis` on the first 4 files. - -## Basic Options -* Change the default mapping and the default command to invoke CtrlP: - - ```vim - let g:ctrlp_map = '' - let g:ctrlp_cmd = 'CtrlP' - ``` - -* When invoked, unless a starting directory is specified, CtrlP will set its local working directory according to this variable: - - ```vim - let g:ctrlp_working_path_mode = 'ra' - ``` - - `'c'` - the directory of the current file. - `'r'` - the nearest ancestor that contains one of these directories or files: `.git` `.hg` `.svn` `.bzr` `_darcs` - `'a'` - like c, but only if the current working directory outside of CtrlP is not a direct ancestor of the directory of the current file. - `0` or `''` (empty string) - disable this feature. - - Define additional root markers with the `g:ctrlp_root_markers` option. - -* Exclude files and directories using Vim's `wildignore` and CtrlP's own `g:ctrlp_custom_ignore`: - - ```vim - set wildignore+=*/tmp/*,*.so,*.swp,*.zip " MacOSX/Linux - set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe " Windows - - let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$' - let g:ctrlp_custom_ignore = { - \ 'dir': '\v[\/]\.(git|hg|svn)$', - \ 'file': '\v\.(exe|so|dll)$', - \ 'link': 'some_bad_symbolic_links', - \ } - ``` - -* Use a custom file listing command: - - ```vim - let g:ctrlp_user_command = 'find %s -type f' " MacOSX/Linux - let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows - ``` - -Check `:help ctrlp-options` for other options. - -## Installation -Use your favorite method or check the homepage for a [quick installation guide][3]. - -[1]: http://i.imgur.com/yIynr.png -[2]: https://github.com/kien/ctrlp.vim/tree/extensions -[3]: http://kien.github.com/ctrlp.vim#installation diff --git a/vim-bundle/supertab b/vim-bundle/supertab deleted file mode 160000 index 6651177..0000000 --- a/vim-bundle/supertab +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66511772a430a5eaad7f7d03dbb02e8f33c4a641 diff --git a/vim-bundle/syntastic/.gitignore b/vim-bundle/syntastic/.gitignore deleted file mode 100644 index cc07c93..0000000 --- a/vim-bundle/syntastic/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*~ -*.swp -tags -.DS_Store diff --git a/vim-bundle/syntastic/CONTRIBUTING.md b/vim-bundle/syntastic/CONTRIBUTING.md deleted file mode 100644 index 44eb13f..0000000 --- a/vim-bundle/syntastic/CONTRIBUTING.md +++ /dev/null @@ -1,105 +0,0 @@ -# CONTRIBUTING -- - - -1\. [Bug reports / GitHub issues](#bugreps) -2\. [Submitting a patch](#patches) -3\. [General style notes](#generalstyle) -4\. [Syntax checker notes](#checkerstyle) -- - - - - - -## 1. Bug reports / GitHub issues - -Please note that the preferred channel for posting bug reports is the -[issue tracker at GitHub][bug_tracker]. Reports posted elsewhere are less likely -to be seen by the core team. - -When reporting a bug make sure you search the existing GitHub issues -for the same/similar issues. If you find one, feel free to add a `+1` -comment with any additional information that may help us solve the -issue. - -When creating a new issue be sure to state the following: - -* steps to reproduce the bug; -* the version of Vim you are using (run `:ver` to find out); -* the version of syntastic you are using (see `:SyntasticInfo`). - -For syntax checker bugs also state the version of the checker executable -that you are using. Adding debugging information is typically useful -too: - -* open a file handled by your checker; -* set `g:syntastic_debug` to 1 or 3; -* run the checker; -* copy the output of `:mes`. - - - -## 2. Submitting a patch - -Before you consider adding features to syntastic, _please_ spend a few minutes -(re-)reading the latest version of the [manual][manual]. Syntastic is changing -rapidly at times, and it's possible that some features you want to add exist -already. - -To submit a patch: - -* fork the [repo][github] on GitHub; -* make a [topic branch][branches] and start hacking; -* submit a pull request based off your topic branch. - -Small, focused patches are preferred. - -Large changes to the code should be discussed with the core team first. -Create an issue and explain your plan and see what we say. - -Also, make sure to update the manual whenever applicable. Nobody can use -features that aren't documented. - - - -## 3. General style notes - -Follow the coding conventions/styles used in the syntastic core: - -* use 4 space indents; -* don't use abbreviated keywords - e.g. use `endfunction`, not `endfun` -(there's always room for more fun!); -* don't use `l:` prefixes for variables unless actually required (i.e. -almost never); -* code for maintainability; we would rather a function be a couple of -lines longer and have (for example) some [explaining variables][variables] to -aid readability. - - - -## 4. Syntax checker notes - -Make sure to read the [guide][guide] if you plan to add new syntax checkers. - -Use the existing checkers as templates, rather than writing everything -from scratch. - -The preferred style for error format strings is one "clause" per line. -E.g. (from the `coffee` checker): - -```vim -let errorformat = - \ '%E%f:%l:%c: %trror: %m,' . - \ 'Syntax%trror: In %f\, %m on line %l,' . - \ '%EError: In %f\, Parse error on line %l: %m,' . - \ '%EError: In %f\, %m on line %l,' . - \ '%W%f(%l): lint warning: %m,' . - \ '%W%f(%l): warning: %m,' . - \ '%E%f(%l): SyntaxError: %m,' . - \ '%-Z%p^,' . - \ '%-G%.%#' -``` - -[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues -[manual]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic.txt -[github]: https://github.com/vim-syntastic/syntastic -[branches]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches -[variables]: http://www.refactoring.com/catalog/extractVariable.html -[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide diff --git a/vim-bundle/syntastic/LICENCE b/vim-bundle/syntastic/LICENCE deleted file mode 100644 index 8b1a9d8..0000000 --- a/vim-bundle/syntastic/LICENCE +++ /dev/null @@ -1,13 +0,0 @@ - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - Version 2, December 2004 - -Copyright (C) 2004 Sam Hocevar - -Everyone is permitted to copy and distribute verbatim or modified -copies of this license document, and changing it is allowed as long -as the name is changed. - - DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/vim-bundle/syntastic/README.markdown b/vim-bundle/syntastic/README.markdown deleted file mode 100644 index 346123e..0000000 --- a/vim-bundle/syntastic/README.markdown +++ /dev/null @@ -1,545 +0,0 @@ - , - / \,,_ .'| - ,{{| /}}}}/_.' _____________________________________________ - }}}}` '{{' '. / \ - {{{{{ _ ;, \ / Ladies and Gentlemen, \ - ,}}}}}} /o`\ ` ;) | | - {{{{{{ / ( | this is ... | - }}}}}} | \ | | - {{{{{{{{ \ \ | | - }}}}}}}}} '.__ _ | | _____ __ __ _ | - {{{{{{{{ /`._ (_\ / | / ___/__ ______ / /_____ ______/ /_(_)____ | - }}}}}}' | //___/ --=: \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ | - jgs `{{{{` | '--' | ___/ / /_/ / / / / /_/ /_/ (__ ) /_/ / /__ | - }}}` | /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/ | - | /____/ | - | / - \_____________________________________________/ - - -- - - -1. [Introduction](#introduction) -2. [Installation](#installation) -2.1. [Requirements](#requirements) -2.2. [Installing syntastic with Pathogen](#installpathogen) -3. [Recommended settings](#settings) -4. [FAQ](#faq) -4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo) -4.2. [Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?](#faqcheckers) -4.3. [How can I run checkers for "foreign" filetypes against the current file?](#faqforeign) -4.4. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) -4.5. [How can I pass additional arguments to a checker?](#faqargs) -4.6. [I run a checker and the location list is not updated...](#faqloclist) -4.6. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) -4.7. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) -4.8. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete) -4.9. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig) -4.10. [What is the difference between syntax checkers and style checkers?](#faqstyle) -4.11. [How can I check scripts written for different versions of Python?](#faqpython) -4.12. [How can I check scripts written for different versions of Ruby?](#faqruby) -4.13. [The `perl` checker has stopped working...](#faqperl) -4.14. [What happened to the `rustc` checker?](#faqrust) -4.15. [What happened to the `tsc` checker?](#faqtsc) -4.16. [What happened to the `xcrun` checker?](#faqxcrun) -5. [Resources](#otherresources) - -- - - - - - -## 1\. Introduction - -Syntastic is a syntax checking plugin for [Vim][vim] created by -[Martin Grenfell][scrooloose]. It runs files through external syntax checkers -and displays any resulting errors to the user. This can be done on demand, or -automatically as files are saved. If syntax errors are detected, the user is -notified and is happy because they didn't have to compile their code or execute -their script to find them. - -At the time of this writing, syntastic has checking plugins for ACPI -Source Language, ActionScript, Ada, Ansible configurations, API Blueprint, -AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, C++, -C#, Cabal, Chef, CMake, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, -DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, -GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, -JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, -MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl -6, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug -(formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax -NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, -Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, -Vim help, VimL, Vue.js, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, -z80, Zope page templates, and Zsh. See the [manual][checkers] for details about -the corresponding supported checkers (`:help syntastic-checkers` in Vim). - -A number of third-party Vim plugins also provide checkers for syntastic, for -example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust], -[syntastic-extras][myint], [syntastic-more][roktas], [tsuquyomi][tsuquyomi], -[vim-crystal][crystal], [vim-eastwood][eastwood], and [vim-swift][swift]. - -Below is a screenshot showing the methods that Syntastic uses to display syntax -errors. Note that, in practise, you will only have a subset of these methods -enabled. - -![Screenshot 1][screenshot] - -1. Errors are loaded into the location list for the corresponding window. -2. When the cursor is on a line containing an error, the error message is echoed in the command window. -3. Signs are placed beside lines with errors - note that warnings are displayed in a different color. -4. There is a configurable statusline flag you can include in your statusline config. -5. Hover the mouse over a line containing an error and the error message is displayed as a balloon. -6. (not shown) Highlighting errors with syntax highlighting. Erroneous parts of lines can be highlighted. - - - -## 2\. Installation - - - -### 2.1\. Requirements - -Syntastic itself has rather relaxed requirements: it doesn't have any external -dependencies, and it needs a version of [Vim][vim] compiled with a few common -features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`, -`reltime`, `statusline`, and `user_commands`. Not all possible combinations of -features that include the ones above make equal sense on all operating systems, -but Vim version 7 or later with the "normal", "big", or "huge" feature sets -should be fine. - -Syntastic should work with any modern plugin managers for Vim, such as -[NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam], -[Vim-Plug][plug], or [Vundle][vundle]. Instructions for installing syntastic -with [Pathogen][pathogen] are included below for completeness. - -Starting with Vim version 7.4.1486 you can also load syntastic using the -standard mechanism of packages, without the help of third-party plugin managers -(see `:help packages` in Vim for details). Beware however that, while support -for packages has been added in Vim 7.4.1384, the functionality needed by -syntastic is present only in versions 7.4.1486 and later. - -Last but not least: syntastic doesn't know how to do any syntax checks by -itself. In order to get meaningful results you need to install external -checkers corresponding to the types of files you use. Please consult the -[manual][checkers] (`:help syntastic-checkers` in Vim) for a list of supported -checkers. - - - -### 2.2\. Installing syntastic with Pathogen - -If you already have [Pathogen][pathogen] working then skip [Step 1](#step1) and go to -[Step 2](#step2). - - - -#### 2.2.1\. Step 1: Install pathogen.vim - -First I'll show you how to install Tim Pope's [Pathogen][pathogen] so that it's easy to -install syntastic. Do this in your terminal so that you get the `pathogen.vim` -file and the directories it needs: -```sh -mkdir -p ~/.vim/autoload ~/.vim/bundle && \ -curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim -``` -Next you *need* to add this to your `~/.vimrc`: -```vim -execute pathogen#infect() -``` - - - -#### 2.2.2\. Step 2: Install syntastic as a Pathogen bundle - -You now have pathogen installed and can put syntastic into `~/.vim/bundle` like -this: -```sh -cd ~/.vim/bundle && \ -git clone --depth=1 https://github.com/vim-syntastic/syntastic.git -``` -Quit vim and start it back up to reload it, then type: -```vim -:Helptags -``` -If you get an error when you do this, then you probably didn't install -[Pathogen][pathogen] right. Go back to [Step 1](#step1) and make sure you did the -following: - -1. Created both the `~/.vim/autoload` and `~/.vim/bundle` directories. -2. Added the `execute pathogen#infect()` line to your `~/.vimrc` file -3. Did the `git clone` of syntastic inside `~/.vim/bundle` -4. Have permissions to access all of these directories. - - - -## 3\. Recommended settings - -Syntastic has numerous options that can be configured, and the defaults -are not particularly well suitable for new users. It is recommended -that you start by adding the following lines to your `vimrc` file, and -return to them after reading the manual (see `:help syntastic` in Vim): -```vim -set statusline+=%#warningmsg# -set statusline+=%{SyntasticStatuslineFlag()} -set statusline+=%* - -let g:syntastic_always_populate_loc_list = 1 -let g:syntastic_auto_loc_list = 1 -let g:syntastic_check_on_open = 1 -let g:syntastic_check_on_wq = 0 -``` - - - -## 4\. FAQ - - - -__4.1. Q. I installed syntastic but it isn't reporting any errors...__ - -A. The most likely reason is that none of the syntax checkers that it requires -are installed. For example: by default, python requires either `flake8` or -`pylint` to be installed and in your `$PATH`. Read the [manual][checkers] -(`:help syntastic-checkers` in Vim) to find out what executables are -supported. Note that aliases do not work; the actual executables must be -available in your `$PATH`. Symbolic links are okay though. You can see -syntastic's idea of available checkers by running `:SyntasticInfo`. - -A second probable reason is that none of the available checkers are -enabled. Syntastic comes preconfigured with a default list of enabled checkers -per filetype, but this list is kept short in order to prevent slowing down Vim -or trying to run conflicting checks. The command `:SyntasticInfo` will show you -which checkers are enabled. You can tell syntastic which checkers (among the -available ones) you want to run by setting `g:syntastic__checkers` in -your `vimrc` (see [below](#faqcheckers)). - -A third possible reason is that the `$PATH` seen by syntastic might not be same -as the `$PATH` in your login shell. Syntastic runs checkers using the shell -pointed to by Vim's `shell` (or by `g:syntastic_shell`, if set), and that's the -shell you need to configure to set the proper `$PATH` and environment variables -for your checkers. You can see syntastic's idea of `$PATH` by running -```vim -:echo syntastic#util#system('echo "$PATH"') -``` -on UNIX and Mac OS-X systems, or -```vim -:echo syntastic#util#system('echo %PATH%') -``` -on Windows. - -Finally, another reason it could fail is that either the command line options -or the error output for a syntax checker may have changed. In this case, make -sure you have the latest version of the syntax checker installed. If it still -fails then post an [issue][bug_tracker] - or better yet, create a pull request. - - - -__4.2. Q. Syntastic supports several checkers for my filetype, how do I tell it -which one(s) to use?__ - -A. Add a line like this to your `vimrc`: -```vim -let g:syntastic__checkers = [''] -``` - -To see the list of supported checkers for your filetype read the -[manual][checkers] (`:help syntastic-checkers` in Vim). - -For example, Python has the following checkers, among others: `flake8`, -`pyflakes`, `pylint` and a native `python` checker. To tell syntastic to use -`pylint`, you would use this setting: -```vim -let g:syntastic_python_checkers = ['pylint'] -``` - -Checkers can be chained together like this: -```vim -let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd'] -``` - -This is telling syntastic to run the `php` checker first, and if no errors are -found, run `phpcs`, and then `phpmd`. - -You can also run checkers explicitly by calling `:SyntasticCheck `. -For example to run `phpcs` and `phpmd`: -```vim -:SyntasticCheck phpcs phpmd -``` - -This works for any checkers available for the current filetype, even if they -aren't listed in `g:syntastic__checkers`. - - - -__4.3. Q. How can I run checkers for "foreign" filetypes against the current -file?__ - -A. You need to qualify the name of the "foreign" checker with the name -of its filetype. For example to check `tex` files with the checker -`language_check` (which normally acts only on files of type `text`), you can -add `text/language_check` to the list fo checkers for `tex`: -```vim -let g:syntastic_tex_checkers = ['lacheck', 'text/language_check'] -``` - -This also works with `:SyntasticCheck`, e.g. the following command runs -`text/language_check` against the current file regardless of the current -filetype: -```vim -:SyntasticCheck text/language_check -``` - -Of course, the checkers specified this way need to be known to syntastic, and -they need to be shown as available when you run `:SyntasticInfo`. You can't -just make up a combination of a filetype and a program name and expect it to -work as a checker. - - - -__4.4. Q. I have enabled multiple checkers for the current filetype. How can I -display all errors from all checkers together?__ - -A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`: -```vim -let g:syntastic_aggregate_errors = 1 -``` - -See `:help syntastic-aggregating-errors` for more details. - - - -__4.5. Q. How can I pass additional arguments to a checker?__ - -A. In most cases a command line is constructed using an internal function -named `makeprgBuild()`, which provides a number of options that allow you to -customise every part of the command that gets run. You can set these options -using global variables. - -The general form of the global `args` variable is -`syntastic___args`. Thus if you wanted to pass -`--my --args --here` to the Ruby `mri` checker you would add this line to your -`vimrc`: -```vim -let g:syntastic_ruby_mri_args = "--my --args --here" -``` - -See `:help syntastic-checker-options` for more information. - -A number of checkers don't use the `makeprgBuild()` function mentioned above, -or have additional options that can be configured. For these checkers the exact -list of options should be included in the [manual][checkers] -(`:help syntastic-checkers` in Vim). - - - -__4.6. Q. I run a checker and the location list is not updated...__ -__4.6. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ - -A. By default the location list is changed only when you run the `:Errors` -command, in order to minimise conflicts with other plugins. If you want the -location list to always be updated when you run the checkers, add this line to -your `vimrc`: -```vim -let g:syntastic_always_populate_loc_list = 1 -``` - - - -__4.7. Q. How can I jump between the different errors without using the location -list at the bottom of the window?__ - -A. Vim provides several built-in commands for this. See `:help :lnext` and -`:help :lprevious`. - -If you use these commands a lot then you may want to add shortcut mappings to -your `vimrc`, or install something like [unimpaired][unimpaired], which provides such -mappings (among other things). - - - -__4.8. Q. The error window is closed automatically when I `:quit` the current buffer -but not when I `:bdelete` it?__ - -A. There is no safe way to handle that situation automatically, but you can -work around it: -```vim -nnoremap :lclose:bdelete -cabbrev bd =(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd') -``` - - - -__4.9. My favourite checker needs to load a configuration file from the -project's root rather than the current directory...__ - -A. You can set up an `autocmd` to search for the configuration file in the -current directory and upwards, and add it to the checker's options when found. -For example for `jscs`: - -```vim -function! FindConfig(prefix, what, where) - let cfg = findfile(a:what, escape(a:where, ' ') . ';') - return cfg !=# '' ? ' ' . a:prefix . ' ' . shellescape(cfg) : '' -endfunction - -autocmd FileType javascript let b:syntastic_javascript_jscs_args = - \ get(g:, 'syntastic_javascript_jscs_args', '') . - \ FindConfig('-c', '.jscsrc', expand(':p:h', 1)) -``` - - - -__4.10. Q. What is the difference between syntax checkers and style checkers?__ - -A. The errors and warnings they produce are highlighted differently and can -be filtered by different rules, but otherwise the distinction is pretty much -arbitrary. There is an ongoing effort to keep things consistent, so you can -_generally_ expect messages produced by syntax checkers to be _mostly_ related -to syntax, and messages produced by style checkers to be _mostly_ about style. -But there can be no formal guarantee that, say, a style checker that runs into -a syntax error wouldn't die with a fatal message, nor that a syntax checker -wouldn't give you warnings against using some constructs as being bad practice. -There is also no guarantee that messages marked as `style` are less severe than -the ones marked as `syntax` (whatever that might mean). And there are even a -few Frankenstein checkers (for example `flake8` and `pylama`) that, by their -nature, produce both kinds of messages. Syntastic is not smart enough to be -able to sort out these things by itself. - -Generally it's more useful to look at this from the perspective of filtering -unwanted messages, rather than as an indicator of severity levels. The -distinction between syntax and style is orthogonal to the distinction between -errors and warnings, and thus you can turn off messages based on level, on -type, or both. - -e.g. To disable all style messages: -```vim -let g:syntastic_quiet_messages = { "type": "style" } -``` -See `:help syntastic_quiet_messages` for more information. - - - -__4.11. Q. How can I check scripts written for different versions of Python?__ - -A. Install a Python version manager such as [virtualenv][virtualenv] -or [pyenv][pyenv], activate the environment for the relevant version -of Python, and install in it the checkers you want to use. Set -`g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim] -from the virtual environment. - -If you're starting Vim from a desktop manager rather than from a terminal you -might need to write wrapper scripts around your checkers, to activate the -virtual environment before running the actual checks. Then you'll need to -point the relevant `g:syntastic_python__exec` variables to the wrapper -scripts. - - - -__4.12. Q. How can I check scripts written for different versions of Ruby?__ - -A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv], -activate the relevant version of Ruby, and install in it the checkers you want -to use. Set `g:syntastic_ruby_checkers` accordingly in your `vimrc`, and run -[Vim][vim] under the relevant Ruby version. - -If you're starting Vim from a desktop manager rather than from a terminal -and depending on the version manager you use you might need to write wrapper -scripts around your checkers, to activate the relevant version of Ruby -before running the actual checks. Then you'll need to point the relevant -`g:syntastic_ruby__exec` variables to the wrapper scripts. - - - -__4.13. Q. The `perl` checker has stopped working...__ - -A. The `perl` checker runs `perl -c` against your file, which in turn -__executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` -statements in your file (cf. [perlrun][perlrun]). This is probably fine if you -wrote the file yourself, but it's a security problem if you're checking -third-party files. Since there is currently no way to disable this behaviour -while still producing useful results, the checker is now disabled by default. -To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes -`perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`: -```vim -let g:syntastic_enable_perl_checker = 1 -``` - - - -__4.14. Q. What happened to the `rustc` checker?__ - -A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the -checker should be picked up automatically by syntastic. - - - -__4.15. Q. What happened to the `tsc` checker?__ - -A. It didn't meet people's expectations and it has been removed. The plugin -[tsuquyomi][tsuquyomi] comes packaged with a checker for TypeScript. If you -install this plugin the checker should be picked up automatically by syntastic. - - - -__4.16. Q. What happened to the `xcrun` checker?__ - -A. The `xcrun` checker used to have a security problem and it has been removed. -A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you -install this plugin the checker should be picked up automatically by syntastic. - - - -## 5\. Resources - -The preferred place for posting suggestions, reporting bugs, and general -discussions related to syntastic is the [issue tracker at GitHub][bug_tracker]. -A guide for writing syntax checkers can be found in the [wiki][guide]. -There are also a dedicated [google group][google_group], and a -[syntastic tag at StackOverflow][stack_overflow]. - -Syntastic aims to provide a common interface to syntax checkers for as many -languages as possible. For particular languages, there are, of course, other -plugins that provide more functionality than syntastic. You might want to take -a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or -[YouCompleteMe][ycm]. - -[scrooloose]: https://github.com/scrooloose -[screenshot]: https://github.com/vim-syntastic/syntastic/raw/master/_assets/screenshot_1.png - -[bug_tracker]: https://github.com/vim-syntastic/syntastic/issues -[checkers]: https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt -[crystal]: https://github.com/rhysd/vim-crystal -[eastwood]: https://github.com/venantius/vim-eastwood -[ghcmod]: https://github.com/eagletmt/ghcmod-vim -[google_group]: https://groups.google.com/group/vim-syntastic -[guide]: https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide -[jedi]: https://github.com/davidhalter/jedi-vim -[merlin]: https://github.com/the-lambda-church/merlin -[myint]: https://github.com/myint/syntastic-extras -[neobundle]: https://github.com/Shougo/neobundle.vim -[omnisharp]: https://github.com/OmniSharp/omnisharp-vim -[pathogen]: https://github.com/tpope/vim-pathogen -[perlrun]: http://perldoc.perl.org/perlrun.html#*-c* -[plug]: https://github.com/junegunn/vim-plug/ -[pyenv]: https://github.com/yyuu/pyenv -[python_mode]: https://github.com/klen/python-mode -[rbenv]: https://github.com/rbenv/rbenv -[roktas]: https://github.com/roktas/syntastic-more -[rust]: https://github.com/rust-lang/rust.vim -[rvm]: https://rvm.io/ -[stack_overflow]: http://stackoverflow.com/questions/tagged/syntastic -[swift]: https://github.com/kballard/vim-swift -[tsuquyomi]: https://github.com/Quramy/tsuquyomi/ -[unimpaired]: https://github.com/tpope/vim-unimpaired -[vam]: https://github.com/MarcWeber/vim-addon-manager -[vim]: http://www.vim.org/ -[vimgo]: https://github.com/fatih/vim-go -[virtualenv]: https://virtualenv.pypa.io/en/stable/ -[vnu]: http://about.validator.nu/ -[vnu_jar]: https://github.com/validator/validator/releases/latest -[vnu_server]: http://validator.github.io/validator/#standalone -[vundle]: https://github.com/gmarik/Vundle.vim -[ycm]: http://valloric.github.io/YouCompleteMe/ - - diff --git a/vim-bundle/syntastic/_assets/screenshot_1.png b/vim-bundle/syntastic/_assets/screenshot_1.png deleted file mode 100644 index c1b69f4..0000000 Binary files a/vim-bundle/syntastic/_assets/screenshot_1.png and /dev/null differ diff --git a/vim-bundle/syntastic/autoload/syntastic/c.vim b/vim-bundle/syntastic/autoload/syntastic/c.vim deleted file mode 100644 index e49a29a..0000000 --- a/vim-bundle/syntastic/autoload/syntastic/c.vim +++ /dev/null @@ -1,341 +0,0 @@ -if exists('g:loaded_syntastic_c_autoload') || !exists('g:loaded_syntastic_plugin') - finish -endif -let g:loaded_syntastic_c_autoload = 1 - -let s:save_cpo = &cpo -set cpo&vim - -" Public functions {{{1 - -" convenience function to determine the 'null device' parameter -" based on the current operating system -function! syntastic#c#NullOutput() abort " {{{2 - let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows() - return known_os ? '-o ' . syntastic#util#DevNull() : '' -endfunction " }}}2 - -" read additional compiler flags from the given configuration file -" the file format and its parsing mechanism is inspired by clang_complete -function! syntastic#c#ReadConfig(file) abort " {{{2 - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file) - - " search upwards from the current file's directory - let config = syntastic#util#findFileInParent(a:file, expand('%:p:h', 1)) - if config ==# '' - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found') - return '' - endif - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config) - if !filereadable(config) - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable') - return '' - endif - - " convert filename into absolute path - let filepath = fnamemodify(config, ':p:h') - - " try to read config file - try - let lines = readfile(config) - catch /\m^Vim\%((\a\+)\)\=:E48[45]/ - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file') - return '' - endtry - - " filter out empty lines and comments - call filter(lines, 'v:val !~# ''\v^(\s*#|$)''') - - " remove leading and trailing spaces - call map(lines, 'substitute(v:val, ''\m^\s\+'', "", "")') - call map(lines, 'substitute(v:val, ''\m\s\+$'', "", "")') - - let parameters = [] - for line in lines - let matches = matchstr(line, '\m\C^\s*-I\s*\zs.\+') - if matches !=# '' - " this one looks like an absolute path - if match(matches, '\m^\%(/\|\a:\)') != -1 - call add(parameters, '-I' . matches) - else - call add(parameters, '-I' . filepath . syntastic#util#Slash() . matches) - endif - else - call add(parameters, line) - endif - endfor - - return join(map(parameters, 'syntastic#util#shescape(v:val)')) -endfunction " }}}2 - -" GetLocList() for C-like compilers -function! syntastic#c#GetLocList(filetype, subchecker, options) abort " {{{2 - try - let flags = s:_get_cflags(a:filetype, a:subchecker, a:options) - catch /\m\C^Syntastic: skip checks$/ - return [] - endtry - - let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) . - \ ' ' . flags . ' ' . syntastic#util#shexpand('%') - - let errorformat = s:_get_checker_var('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat']) - - let postprocess = s:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ? - \ ['filterForeignErrors'] : [] - - " process makeprg - return SyntasticMake({ - \ 'makeprg': makeprg, - \ 'errorformat': errorformat, - \ 'postprocess': postprocess }) -endfunction " }}}2 - -" }}}1 - -" Private functions {{{1 - -" initialize c/cpp syntax checker handlers -function! s:_init() abort " {{{2 - let s:handlers = [] - let s:cflags = {} - - call s:_registerHandler('\m\', 's:_checkPhp', []) - call s:_registerHandler('\m\', 's:_checkPython', []) - call s:_registerHandler('\m\' - echohl ErrorMsg - echomsg 'syntastic: error: ' . a:msg - echohl None -endfunction " }}}2 - -function! syntastic#log#oneTimeWarn(msg) abort " {{{2 - if index(s:one_time_notices_issued, a:msg) >= 0 - return - endif - - call add(s:one_time_notices_issued, a:msg) - call syntastic#log#warn(a:msg) -endfunction " }}}2 - -" @vimlint(EVL102, 1, l:OLD_VAR) -function! syntastic#log#deprecationWarn(old, new, ...) abort " {{{2 - if exists('g:syntastic_' . a:old) && !exists('g:syntastic_' . a:new) - let msg = 'variable g:syntastic_' . a:old . ' is deprecated, please use ' - - if a:0 - let OLD_VAR = g:syntastic_{a:old} - try - let NEW_VAR = eval(a:1) - let msg .= 'in its stead: let g:syntastic_' . a:new . ' = ' . string(NEW_VAR) - let g:syntastic_{a:new} = NEW_VAR - catch - let msg .= 'g:syntastic_' . a:new . ' instead' - endtry - else - let msg .= 'g:syntastic_' . a:new . ' instead' - let g:syntastic_{a:new} = g:syntastic_{a:old} - endif - - call syntastic#log#oneTimeWarn(msg) - endif -endfunction " }}}2 -" @vimlint(EVL102, 0, l:OLD_VAR) - -function! syntastic#log#debug(level, msg, ...) abort " {{{2 - if !s:_isDebugEnabled(a:level) - return - endif - - let leader = s:_log_timestamp() - call s:_logRedirect(1) - - if a:0 - " filter out dictionary functions - echomsg leader . a:msg . ' ' . - \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ? - \ filter(copy(a:1), 'type(v:val) != type(function("tr"))') : a:1)) - else - echomsg leader . a:msg - endif - - call s:_logRedirect(0) -endfunction " }}}2 - -function! syntastic#log#debugShowOptions(level, names) abort " {{{2 - if !s:_isDebugEnabled(a:level) - return - endif - - let leader = s:_log_timestamp() - call s:_logRedirect(1) - - let vlist = copy(type(a:names) == type('') ? [a:names] : a:names) - let add_shell = index(vlist, 'shell') >= 0 && &shell !=# syntastic#util#var('shell') - if !empty(vlist) - call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val))) . (s:_is_modified(v:val) ? ' (!)' : '')") - if add_shell - call add(vlist, 'u:shell = ' . strtrans(string(syntastic#util#var('shell'))) . ' (!)') - endif - echomsg leader . join(vlist, ', ') - endif - call s:_logRedirect(0) -endfunction " }}}2 - -function! syntastic#log#debugShowVariables(level, names) abort " {{{2 - if !s:_isDebugEnabled(a:level) - return - endif - - let leader = s:_log_timestamp() - call s:_logRedirect(1) - - let vlist = type(a:names) == type('') ? [a:names] : a:names - for name in vlist - let msg = s:_format_variable(name) - if msg !=# '' - echomsg leader . msg - endif - endfor - - call s:_logRedirect(0) -endfunction " }}}2 - -function! syntastic#log#debugDump(level) abort " {{{2 - if !s:_isDebugEnabled(a:level) - return - endif - - call syntastic#log#debugShowVariables( a:level, sort(keys(g:_SYNTASTIC_DEFAULTS)) ) -endfunction " }}}2 - -function! syntastic#log#ndebug(level, title, messages) abort " {{{2 - if s:_isDebugEnabled(a:level) - return - endif - - call syntastic#log#error(a:title) - if type(a:messages) == type([]) - for msg in a:messages - echomsg msg - endfor - else - echomsg a:messages - endif -endfunction " }}}2 - -" }}}1 - -" Private functions {{{1 - -function! s:_isDebugEnabled_smart(level) abort " {{{2 - return and(g:syntastic_debug, a:level) -endfunction " }}}2 - -function! s:_isDebugEnabled_dumb(level) abort " {{{2 - " poor man's bit test for bit N, assuming a:level == 2**N - return (g:syntastic_debug / a:level) % 2 -endfunction " }}}2 - -let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb') -lockvar s:_isDebugEnabled - -function! s:_logRedirect(on) abort " {{{2 - if exists('g:syntastic_debug_file') - if a:on - try - execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1)) - catch /\m^Vim\%((\a\+)\)\=:/ - silent! redir END - unlet g:syntastic_debug_file - endtry - else - silent! redir END - endif - endif -endfunction " }}}2 - -" }}}1 - -" Utilities {{{1 - -function! s:_log_timestamp_smart() abort " {{{2 - return printf('syntastic: %f: ', reltimefloat(reltime(g:_SYNTASTIC_START))) -endfunction " }}}2 - -function! s:_log_timestamp_dumb() abort " {{{2 - return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': ' -endfunction " }}}2 - -let s:_log_timestamp = function(has('float') && exists('*reltimefloat') ? 's:_log_timestamp_smart' : 's:_log_timestamp_dumb') -lockvar s:_log_timestamp - -function! s:_format_variable(name) abort " {{{2 - let vals = [] - if exists('g:syntastic_' . a:name) - call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) - endif - if exists('b:syntastic_' . a:name) - call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name}))) - endif - - return join(vals, ', ') -endfunction " }}}2 - -function! s:_is_modified(name) abort " {{{2 - if !exists('s:option_defaults') - let s:option_defaults = {} - endif - if !has_key(s:option_defaults, a:name) - let opt_save = eval('&' . a:name) - execute 'set ' . a:name . '&' - let s:option_defaults[a:name] = eval('&' . a:name) - execute 'let &' . a:name . ' = ' . string(opt_save) - endif - - return s:option_defaults[a:name] !=# eval('&' . a:name) -endfunction " }}}2 - -" }}}1 - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim-bundle/syntastic/autoload/syntastic/postprocess.vim b/vim-bundle/syntastic/autoload/syntastic/postprocess.vim deleted file mode 100644 index c69f397..0000000 --- a/vim-bundle/syntastic/autoload/syntastic/postprocess.vim +++ /dev/null @@ -1,84 +0,0 @@ -if exists('g:loaded_syntastic_postprocess_autoload') || !exists('g:loaded_syntastic_plugin') - finish -endif -let g:loaded_syntastic_postprocess_autoload = 1 - -let s:save_cpo = &cpo -set cpo&vim - -" Public functions {{{1 - -" merge consecutive blanks -function! syntastic#postprocess#compressWhitespace(errors) abort " {{{2 - for e in a:errors - let e['text'] = substitute(e['text'], "\001", '', 'g') - let e['text'] = substitute(e['text'], '\n', ' ', 'g') - let e['text'] = substitute(e['text'], '\m\s\{2,}', ' ', 'g') - let e['text'] = substitute(e['text'], '\m^\s\+', '', '') - let e['text'] = substitute(e['text'], '\m\s\+$', '', '') - endfor - - return a:errors -endfunction " }}}2 - -" remove spurious CR under Cygwin -function! syntastic#postprocess#cygwinRemoveCR(errors) abort " {{{2 - if has('win32unix') - for e in a:errors - let e['text'] = substitute(e['text'], '\r', '', 'g') - endfor - endif - - return a:errors -endfunction " }}}2 - -" decode XML entities -function! syntastic#postprocess#decodeXMLEntities(errors) abort " {{{2 - for e in a:errors - let e['text'] = syntastic#util#decodeXMLEntities(e['text']) - endfor - - return a:errors -endfunction " }}}2 - -" filter out errors referencing other files -function! syntastic#postprocess#filterForeignErrors(errors) abort " {{{2 - return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr('')) -endfunction " }}}2 - -" make sure line numbers are not past end of buffers -" XXX: this loads all referenced buffers in memory -function! syntastic#postprocess#guards(errors) abort " {{{2 - let buffers = syntastic#util#unique(map(filter(copy(a:errors), 'v:val["valid"]'), 'str2nr(v:val["bufnr"])')) - - let guards = {} - for b in buffers - let guards[b] = len(getbufline(b, 1, '$')) - endfor - - for e in a:errors - if e['valid'] && e['lnum'] > guards[e['bufnr']] - let e['lnum'] = guards[e['bufnr']] - endif - endfor - - return a:errors -endfunction " }}}2 - -" convert error messages from UTF-8 to the current encoding -function! syntastic#postprocess#iconv(errors) abort " {{{2 - if has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' - for e in a:errors - let e['text'] = iconv(e['text'], "utf-8", &encoding) - endfor - endif - - return a:errors -endfunction " }}}2 - -" }}}1 - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim-bundle/syntastic/autoload/syntastic/preprocess.vim b/vim-bundle/syntastic/autoload/syntastic/preprocess.vim deleted file mode 100644 index 79e4fac..0000000 --- a/vim-bundle/syntastic/autoload/syntastic/preprocess.vim +++ /dev/null @@ -1,718 +0,0 @@ -if exists('g:loaded_syntastic_preprocess_autoload') || !exists('g:loaded_syntastic_plugin') - finish -endif -let g:loaded_syntastic_preprocess_autoload = 1 - -let s:save_cpo = &cpo -set cpo&vim - -" Public functions {{{1 - -function! syntastic#preprocess#bandit(errors) abort " {{{2 - let out = [] - let json = s:_decode_JSON(join(a:errors, '')) - - if type(json) == type({}) && has_key(json, 'results') && type(json['results']) == type([]) - for issue in json['results'] - if type(issue) == type({}) - try - call add(out, - \ issue['filename'] . ':' . - \ issue['line_number'] . ':' . - \ { 'LOW': 'I', 'MEDIUM': 'W', 'HIGH': 'E' }[issue['issue_severity']] . ':' . - \ issue['test_id'][1:] . ':' . - \ issue['issue_text'] . - \ ' [' . issue['test_name'] . '] (confidence: ' . issue['issue_confidence'] . ')') - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) - let out = [] - break - endtry - else - call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue)) - endif - endfor - else - call syntastic#log#warn('checker python/bandit: unrecognized error format (crashed checker?)') - endif - - return out -endfunction " }}}2 - -function! syntastic#preprocess#cabal(errors) abort " {{{2 - let out = [] - let star = 0 - for err in a:errors - if star - if err ==# '' - let star = 0 - else - let out[-1] .= ' ' . err - endif - else - call add(out, err) - if err =~# '\m^*\s' - let star = 1 - endif - endif - endfor - return out -endfunction " }}}2 - -function! syntastic#preprocess#checkstyle(errors) abort " {{{2 - let out = [] - let fname = expand('%', 1) - for err in a:errors - if match(err, '\m') > -1 - let line = str2nr(matchstr(err, '\m\ \[[^]]+\])+\ze:'', "", "")') -endfunction " }}}2 - -function! syntastic#preprocess#dockerfile_lint(errors) abort " {{{2 - let out = [] - let json = s:_decode_JSON(join(a:errors, '')) - - if type(json) == type({}) - try - let data = json['error']['data'] + json['warn']['data'] + json['info']['data'] - for e in data - let type = toupper(e['level'][0]) - if type ==# 'I' - let type = 'W' - let style = 1 - else - let style = 0 - endif - - let line = get(e, 'line', 1) - let message = e['message'] - if has_key(e, 'description') && e['description'] !=# 'None' - let message = message . '. ' . e['description'] - endif - - let msg = - \ type . ':' . - \ style . ':' . - \ line . ':' . - \ message - call add(out, msg) - endfor - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') - let out = [] - endtry - else - call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)') - endif - return out -endfunction " }}}2 - -function! syntastic#preprocess#dscanner(errors) abort " {{{2 - let idx = 0 - while idx < len(a:errors) && a:errors[idx][0] !=# '{' - let idx += 1 - endwhile - let errs = s:_decode_JSON(join(a:errors[idx :], '')) - - let out = [] - if type(errs) == type({}) && has_key(errs, 'issues') && type(errs['issues']) == type([]) - for issue in errs['issues'] - try - call add(out, - \ issue['fileName'] . ':' . - \ issue['line'] . ':' . - \ issue['column'] . ':' . - \ issue['message'] . ' [' . issue['key'] . ']') - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker d/dscanner: unrecognized error item ' . string(issue)) - let out = [] - break - endtry - endfor - else - call syntastic#log#warn('checker d/dscanner: unrecognized error format (crashed checker?)') - endif - - return out -endfunction " }}}2 - -function! syntastic#preprocess#flow(errors) abort " {{{2 - let idx = 0 - while idx < len(a:errors) && a:errors[idx][0] !=# '{' - let idx += 1 - endwhile - let errs = s:_decode_JSON(join(a:errors[idx :], '')) - - let out = [] - if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([]) - for e in errs['errors'] - if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message']) - let m = e['message'][0] - let t = e['message'][1:] - - try - let msg = - \ m['path'] . ':' . - \ m['line'] . ':' . - \ m['start'] . ':' . - \ (m['line'] ==# m['endline'] && str2nr(m['end']) > 0 ? m['end'] . ':' : '') . - \ ' ' . m['descr'] - - if len(t) - let msg .= ' ' . join(map(t, - \ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' . - \ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' . - \ 'v:val["end"] . ")"')) - endif - - let msg = substitute(msg, '\r', '', 'g') - let msg = substitute(msg, '\n', ' ', 'g') - - call add(out, msg) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') - let out = [] - break - endtry - else - call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') - let out = [] - break - endif - endfor - else - call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)') - endif - - return out -endfunction " }}}2 - -function! syntastic#preprocess#iconv(errors) abort " {{{2 - return - \ has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' ? - \ map(a:errors, 'iconv(v:val, "utf-8", &encoding)') : - \ a:errors -endfunction " }}}2 - -function! syntastic#preprocess#jscs(errors) abort " {{{2 - let errs = join(a:errors, '') - if errs ==# '' - return [] - endif - - let json = s:_decode_JSON(errs) - - let out = [] - if type(json) == type({}) - for fname in keys(json) - if type(json[fname]) == type([]) - for e in json[fname] - try - let e['message'] = substitute(e['message'], "\n", ' ', 'g') - cal add(out, fname . ':' . e['line'] . ':' . e['column'] . ':' . e['message']) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker javascript/jscs: unrecognized error item ' . string(e)) - let out = [] - endtry - endfor - else - call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') - endif - endfor - else - call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)') - endif - return out -endfunction " }}}2 - -function! syntastic#preprocess#killEmpty(errors) abort " {{{2 - return filter(copy(a:errors), 'v:val !=# ""') -endfunction " }}}2 - -function! syntastic#preprocess#perl(errors) abort " {{{2 - let out = [] - - for e in a:errors - let parts = matchlist(e, '\v^(.*)\sat\s(.{-})\sline\s(\d+)(.*)$') - if !empty(parts) - call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4]) - endif - endfor - - return syntastic#util#unique(out) -endfunction " }}}2 - -function! syntastic#preprocess#perl6(errors) abort " {{{2 - if a:errors[0] ==# 'Syntax OK' - return [] - endif - - let errs = s:_decode_JSON(join(a:errors, '')) - - let out = [] - if type(errs) == type({}) - try - for val in values(errs) - let line = get(val, 'line', 0) - let pos = get(val, 'pos', 0) - if pos && has('byte_offset') - let line_pos = byte2line(pos + 1) - let column = line_pos > 0 ? pos - line2byte(line_pos) + 2 : 0 - else - let column = 0 - endif - - call add(out, join([ - \ get(val, 'filename', ''), - \ line, - \ column, - \ get(val, 'message', '') ], ':')) - endfor - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker perl6/perl6: unrecognized error item ' . string(val)) - let out = [] - endtry - else - call syntastic#log#warn('checker perl6/perl6: unrecognized error format') - endif - - return out -endfunction " }}}2 - -function! syntastic#preprocess#prospector(errors) abort " {{{2 - let errs = join(a:errors, '') - if errs ==# '' - return [] - endif - - let json = s:_decode_JSON(errs) - - let out = [] - if type(json) == type({}) && has_key(json, 'messages') - if type(json['messages']) == type([]) - for e in json['messages'] - if type(e) == type({}) - try - if e['source'] ==# 'pylint' - let e['location']['character'] += 1 - endif - - let msg = - \ e['location']['path'] . ':' . - \ e['location']['line'] . ':' . - \ e['location']['character'] . ': ' . - \ e['code'] . ' ' . - \ e['message'] . ' ' . - \ '[' . e['source'] . ']' - - call add(out, msg) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e)) - let out = [] - break - endtry - else - call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e)) - let out = [] - break - endif - endfor - else - call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)') - endif - else - call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)') - endif - - return out -endfunction " }}}2 - -function! syntastic#preprocess#rparse(errors) abort " {{{2 - let errlist = copy(a:errors) - - " remove uninteresting lines and handle continuations - let i = 0 - while i < len(errlist) - if i > 0 && errlist[i][:1] ==# ' ' && errlist[i] !~# '\m\s\+\^$' - let errlist[i-1] .= errlist[i][1:] - call remove(errlist, i) - elseif errlist[i] !~# '\m^\(Lint:\|Lint checking:\|Error in\) ' - call remove(errlist, i) - else - let i += 1 - endif - endwhile - - let out = [] - let fname = '' - for e in errlist - if match(e, '\m^Lint: ') == 0 - let parts = matchlist(e, '\m^Lint: \(.*\): found on lines \([0-9, ]\+\)\(+\(\d\+\) more\)\=') - if len(parts) >= 3 - for line in split(parts[2], '\m,\s*') - call add(out, 'E:' . fname . ':' . line . ': ' . parts[1]) - endfor - endif - if len(parts) >= 5 && parts[4] !=# '' - call add(out, 'E:' . fname . ':0: ' . parts[1] . ' - ' . parts[4] . ' messages not shown') - endif - elseif match(e, '\m^Lint checking: ') == 0 - let fname = matchstr(e, '\m^Lint checking: \zs.*') - elseif match(e, '\m^Error in ') == 0 - call add(out, substitute(e, '\m^Error in .\+ : .\+\ze:\d\+:\d\+: ', 'E:' . fname, '')) - endif - endfor - - return out -endfunction " }}}2 - -function! syntastic#preprocess#scss_lint(errors) abort " {{{2 - let errs = join(a:errors, '') - if errs ==# '' - return [] - endif - - let json = s:_decode_JSON(errs) - - let out = [] - if type(json) == type({}) - for fname in keys(json) - if type(json[fname]) == type([]) - for e in json[fname] - try - cal add(out, fname . ':' . - \ e['severity'][0] . ':' . - \ e['line'] . ':' . - \ e['column'] . ':' . - \ e['length'] . ':' . - \ ( has_key(e, 'linter') ? e['linter'] . ': ' : '' ) . - \ e['reason']) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker scss/scss_lint: unrecognized error item ' . string(e)) - let out = [] - endtry - endfor - else - call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') - endif - endfor - else - call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)') - endif - return out -endfunction " }}}2 - -function! syntastic#preprocess#stylelint(errors) abort " {{{2 - let out = [] - - " CssSyntaxError: /path/to/file.css:2:11: Missed semicolon - let parts = matchlist(a:errors[0], '\v^CssSyntaxError: (.{-1,}):(\d+):(\d+): (.+)') - if len(parts) > 4 - call add(out, 'E:' . join(parts[1:4], ':')) - else - let errs = s:_decode_JSON(join(a:errors, '')) - - let out = [] - if type(errs) == type([]) && len(errs) == 1 && type(errs[0]) == type({}) && - \ has_key(errs[0], 'source') && has_key(errs[0], 'warnings') && type(errs[0]['warnings']) == type([]) - - for e in errs[0]['warnings'] - try - let severity = type(e['severity']) == type(0) ? ['W', 'E'][e['severity']-1] : e['severity'][0] - let msg = - \ severity . ':' . - \ errs[0]['source'] . ':' . - \ e['line'] . ':' . - \ e['column'] . ':' . - \ e['text'] - call add(out, msg) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker css/stylelint: unrecognized error item ' . string(e)) - let out = [] - break - endtry - endfor - else - call syntastic#log#warn('checker css/stylelint: unrecognized error format (crashed checker?)') - endif - endif - return out -endfunction " }}}2 - -function! syntastic#preprocess#tern_lint(errors) abort " {{{2 - let errs = join(a:errors, '') - let json = s:_decode_JSON(errs) - -echomsg string(json) - let out = [] - if type(json) == type({}) && has_key(json, 'messages') && type(json['messages']) == type([]) - for e in json['messages'] - try - let line_from = byte2line(e['from'] + 1) - if line_from > 0 - let line = line_from - let column = e['from'] - line2byte(line_from) + 2 - let line_to = byte2line(e['from'] + 1) - let hl = line_to == line ? e['to'] - line2byte(line_to) + 1 : 0 - else - let line = 0 - let column = 0 - let hl = 0 - endif - - if column < 0 - let column = 0 - endif - if hl < 0 - let hl = 0 - endif - - call add(out, - \ e['file'] . ':' . - \ e['severity'][0] . ':' . - \ line . ':' . - \ column . ':' . - \ hl . ':' . - \ e['message']) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker javascript/tern_lint: unrecognized error item ' . string(e)) - let out = [] - endtry - endfor - else - call syntastic#log#warn('checker javascript/tern_lint: unrecognized error format (crashed checker?)') - endif - -echomsg string(out) - return out -endfunction " }}}2 - -function! syntastic#preprocess#tslint(errors) abort " {{{2 - return map(copy(a:errors), 'substitute(v:val, ''\v^((ERROR|WARNING): )?\zs(\([^)]+\))\s(.+)$'', ''\4 \3'', "")') -endfunction " }}}2 - -function! syntastic#preprocess#validator(errors) abort " {{{2 - let out = [] - for e in a:errors - let parts = matchlist(e, '\v^"([^"]+)"(.+)') - if len(parts) >= 3 - " URL decode, except leave alone any "+" - let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') - let parts[1] = substitute(parts[1], '\m\\"', '"', 'g') - let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g') - call add(out, '"' . parts[1] . '"' . parts[2]) - endif - endfor - return out -endfunction " }}}2 - -function! syntastic#preprocess#vint(errors) abort " {{{2 - let errs = s:_decode_JSON(join(a:errors, '')) - - let out = [] - if type(errs) == type([]) - for e in errs - if type(e) == type({}) - try - let msg = - \ e['file_path'] . ':' . - \ e['line_number'] . ':' . - \ e['column_number'] . ':' . - \ e['severity'][0] . ': ' . - \ e['description'] . ' (' . - \ e['policy_name'] . ')' - - call add(out, msg) - catch /\m^Vim\%((\a\+)\)\=:E716/ - call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e)) - let out = [] - break - endtry - else - call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e)) - let out = [] - break - endif - endfor - else - call syntastic#log#warn('checker vim/vint: unrecognized error format (crashed checker?)') - endif - - return out -endfunction " }}}2 - -" }}}1 - -" Workarounds {{{1 - -" In errorformat, \ or % following %f make it depend on isfname. The default -" setting of isfname is crafted to work with completion, rather than general -" filename matching. The result for syntastic is that filenames containing -" spaces (or a few other special characters) can't be matched. -" -" Fixing isfname to address this problem would depend on the set of legal -" characters for filenames on the filesystem the project's files lives on. -" Inferring the kind of filesystem a file lives on, in advance to parsing the -" file's name, is an interesting problem (think f.i. a file loaded from a VFAT -" partition, mounted on Linux). A problem syntastic is not prepared to solve. -" -" As a result, the functions below exist for the only reason to avoid using -" things like %f\, in errorformat. -" -" References: -" https://groups.google.com/forum/#!topic/vim_dev/pTKmZmouhio -" https://vimhelp.appspot.com/quickfix.txt.html#error-file-format - -function! syntastic#preprocess#basex(errors) abort " {{{2 - let out = [] - let idx = 0 - while idx < len(a:errors) - let parts = matchlist(a:errors[idx], '\v^\[\S+\] Stopped at (.+), (\d+)/(\d+):') - if len(parts) > 3 - let err = parts[1] . ':' . parts[2] . ':' . parts[3] . ':' - let parts = matchlist(a:errors[idx+1], '\v^\[(.)\D+(\d+)\] (.+)') - if len(parts) > 3 - let err .= (parts[1] ==? 'W' || parts[1] ==? 'E' ? parts[1] : 'E') . ':' . parts[2] . ':' . parts[3] - call add(out, err) - let idx +=1 - endif - elseif a:errors[idx] =~# '\m^\[' - " unparseable errors - call add(out, a:errors[idx]) - endif - let idx +=1 - endwhile - return out -endfunction " }}}2 - -function! syntastic#preprocess#bro(errors) abort " {{{2 - let out = [] - for e in a:errors - let parts = matchlist(e, '\v^%(fatal )?(error|warning) in (.{-1,}), line (\d+): (.+)') - if len(parts) > 4 - let parts[1] = parts[1][0] - call add(out, join(parts[1:4], ':')) - endif - endfor - return out -endfunction " }}}2 - -function! syntastic#preprocess#coffeelint(errors) abort " {{{2 - let out = [] - for e in a:errors - let parts = matchlist(e, '\v^(.{-1,}),(\d+)%(,\d*)?,(error|warn),(.+)') - if len(parts) > 4 - let parts[3] = parts[3][0] - call add(out, join(parts[1:4], ':')) - endif - endfor - return out -endfunction " }}}2 - -function! syntastic#preprocess#mypy(errors) abort " {{{2 - let out = [] - for e in a:errors - " new format - let parts = matchlist(e, '\v^(.{-1,}):(\d+): error: (.+)') - if len(parts) > 3 - call add(out, join(parts[1:3], ':')) - continue - endif - - " old format - let parts = matchlist(e, '\v^(.{-1,}), line (\d+): (.+)') - if len(parts) > 3 - call add(out, join(parts[1:3], ':')) - endif - endfor - return out -endfunction " }}}2 - -function! syntastic#preprocess#nix(errors) abort " {{{2 - let out = [] - for e in a:errors - let parts = matchlist(e, '\v^(.{-1,}), at (.{-1,}):(\d+):(\d+)$') - if len(parts) > 4 - call add(out, join(parts[2:4], ':') . ':' . parts[1]) - continue - endif - - let parts = matchlist(e, '\v^(.{-1,}) at (.{-1,}), line (\d+):') - if len(parts) > 3 - call add(out, parts[2] . ':' . parts[3] . ':' . parts[1]) - continue - endif - - let parts = matchlist(e, '\v^error: (.{-1,}), in (.{-1,})$') - if len(parts) > 2 - call add(out, parts[2] . ':' . parts[1]) - endif - endfor - return out -endfunction " }}}2 - -" }}}1 - -" Private functions {{{1 - -" @vimlint(EVL102, 1, l:true) -" @vimlint(EVL102, 1, l:false) -" @vimlint(EVL102, 1, l:null) -function! s:_decode_JSON(json) abort " {{{2 - if a:json ==# '' - return [] - endif - - " The following is inspired by https://github.com/MarcWeber/vim-addon-manager and - " http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763 - " A hat tip to Marc Weber for this trick - if substitute(a:json, '\v\"%(\\.|[^"\\])*\"|true|false|null|[+-]?\d+%(\.\d+%([Ee][+-]?\d+)?)?', '', 'g') !~# "[^,:{}[\\] \t]" - " JSON artifacts - let true = 1 - let false = 0 - let null = '' - - try - let object = eval(a:json) - catch - " malformed JSON - let object = '' - endtry - else - let object = '' - endif - - return object -endfunction " }}}2 -" @vimlint(EVL102, 0, l:true) -" @vimlint(EVL102, 0, l:false) -" @vimlint(EVL102, 0, l:null) - -" }}}1 - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim-bundle/syntastic/autoload/syntastic/util.vim b/vim-bundle/syntastic/autoload/syntastic/util.vim deleted file mode 100644 index 8a17fe6..0000000 --- a/vim-bundle/syntastic/autoload/syntastic/util.vim +++ /dev/null @@ -1,635 +0,0 @@ -if exists('g:loaded_syntastic_util_autoload') || !exists('g:loaded_syntastic_plugin') - finish -endif -let g:loaded_syntastic_util_autoload = 1 - -let s:save_cpo = &cpo -set cpo&vim - -" Public functions {{{1 - -function! syntastic#util#isRunningWindows() abort " {{{2 - return has('win16') || has('win32') || has('win64') -endfunction " }}}2 - -function! syntastic#util#DevNull() abort " {{{2 - if syntastic#util#isRunningWindows() - return 'NUL' - endif - return '/dev/null' -endfunction " }}}2 - -" Get directory separator -function! syntastic#util#Slash() abort " {{{2 - return (!exists('+shellslash') || &shellslash) ? '/' : '\' -endfunction " }}}2 - -function! syntastic#util#CygwinPath(path) abort " {{{2 - return substitute(syntastic#util#system('cygpath -m ' . syntastic#util#shescape(a:path)), "\n", '', 'g') -endfunction " }}}2 - -function! syntastic#util#system(command) abort " {{{2 - let old_shell = &shell - let old_lc_messages = $LC_MESSAGES - let old_lc_all = $LC_ALL - - let &shell = syntastic#util#var('shell') - let $LC_MESSAGES = 'C' - let $LC_ALL = '' - - let crashed = 0 - let cmd_start = reltime() - try - let out = system(a:command) - catch - let crashed = 1 - call syntastic#log#error('exception running system(' . string(a:command) . '): ' . v:exception) - if syntastic#util#isRunningWindows() - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP)) - else - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM)) - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR)) - endif - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '$PATH = ' . string($PATH)) - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd())) - call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS) - let out = '' - endtry - let cmd_time = split(reltimestr(reltime(cmd_start)))[0] - - let $LC_ALL = old_lc_all - let $LC_MESSAGES = old_lc_messages - - let &shell = old_shell - - if !crashed && exists('g:_SYNTASTIC_DEBUG_TRACE') - call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's') - endif - - return out -endfunction " }}}2 - -" Create a temporary directory -function! syntastic#util#tmpdir() abort " {{{2 - let tempdir = '' - - if (has('unix') || has('mac')) && executable('mktemp') && !has('win32unix') - " TODO: option "-t" to mktemp(1) is not portable - let tmp = $TMPDIR !=# '' ? $TMPDIR : $TMP !=# '' ? $TMP : '/tmp' - let out = split(syntastic#util#system('mktemp -q -d ' . tmp . '/vim-syntastic-' . s:_fuzz() . '-XXXXXXXX'), "\n") - if v:shell_error == 0 && len(out) == 1 - let tempdir = out[0] - endif - endif - - if tempdir ==# '' - if has('win32') || has('win64') - let tempdir = $TEMP . syntastic#util#Slash() . 'vim-syntastic-' . s:_fuzz() - elseif has('win32unix') - let tempdir = syntastic#util#CygwinPath('/tmp/vim-syntastic-' . s:_fuzz()) - elseif $TMPDIR !=# '' - let tempdir = $TMPDIR . '/vim-syntastic-' . s:_fuzz() - else - let tempdir = '/tmp/vim-syntastic-' . s:_fuzz() - endif - - try - call mkdir(tempdir, 'p', 0700) - catch /\m^Vim\%((\a\+)\)\=:E739/ - call syntastic#log#error(v:exception) - let tempdir = '.' - endtry - endif - - return tempdir -endfunction " }}}2 - -" Recursively remove a directory -function! syntastic#util#rmrf(what) abort " {{{2 - " try to make sure we don't delete directories we didn't create - if a:what !~? 'vim-syntastic-' - return - endif - - if getftype(a:what) ==# 'dir' - call s:_delete(a:what, 'rf') - else - silent! call delete(a:what) - endif -endfunction " }}}2 - -function! syntastic#util#getbufvar(buf, name, ...) abort " {{{2 - return a:0 ? s:_getbufvar(a:buf, a:name, a:1) : getbufvar(a:buf, a:name) -endfunction " }}}2 - -" Search the first 5 lines of the file for a magic number and return a map -" containing the args and the executable -" -" e.g. -" -" #!/usr/bin/perl -f -bar -" -" returns -" -" {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} -function! syntastic#util#parseShebang(buf) abort " {{{2 - for lnum in range(1, 5) - let line = get(getbufline(a:buf, lnum), 0, '') - if line =~# '^#!' - let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '') - let exe = matchstr(line, '\m^\S*\ze') - let args = split(matchstr(line, '\m^\S*\zs.*')) - return { 'exe': exe, 'args': args } - endif - endfor - - return { 'exe': '', 'args': [] } -endfunction " }}}2 - -" Get the value of a Vim variable. Allow buffer variables to override global ones. -function! syntastic#util#bufRawVar(buf, name, ...) abort " {{{2 - return s:_getbufvar(a:buf, a:name, get(g:, a:name, a:0 ? a:1 : '')) -endfunction "}}}2 - -" Get the value of a syntastic variable. Allow buffer variables to override global ones. -function! syntastic#util#bufVar(buf, name, ...) abort " {{{2 - return call('syntastic#util#bufRawVar', [a:buf, 'syntastic_' . a:name] + a:000) -endfunction "}}}2 - -" Get the value of a Vim variable. Allow local variables to override global ones. -function! syntastic#util#rawVar(name, ...) abort " {{{2 - return get(b:, a:name, get(g:, a:name, a:0 ? a:1 : '')) -endfunction " }}}2 - -" Get the value of a syntastic variable. Allow local variables to override global ones. -function! syntastic#util#var(name, ...) abort " {{{2 - return call('syntastic#util#rawVar', ['syntastic_' . a:name] + a:000) -endfunction " }}}2 - -" Parse a version string. Return an array of version components. -function! syntastic#util#parseVersion(version, ...) abort " {{{2 - return map(split(matchstr( a:version, a:0 ? a:1 : '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.'), 'str2nr(v:val)') -endfunction " }}}2 - -" Verify that the 'installed' version is at least the 'required' version. -" -" 'installed' and 'required' must be arrays. If they have different lengths, -" the "missing" elements will be assumed to be 0 for the purposes of checking. -" -" See http://semver.org for info about version numbers. -function! syntastic#util#versionIsAtLeast(installed, required) abort " {{{2 - return syntastic#util#compareLexi(a:installed, a:required) >= 0 -endfunction " }}}2 - -" Almost lexicographic comparison of two lists of integers. :) If lists -" have different lengths, the "missing" elements are assumed to be 0. -function! syntastic#util#compareLexi(a, b) abort " {{{2 - for idx in range(max([len(a:a), len(a:b)])) - let a_element = str2nr(get(a:a, idx, 0)) - let b_element = str2nr(get(a:b, idx, 0)) - if a_element != b_element - return a_element > b_element ? 1 : -1 - endif - endfor - " still here, thus everything matched - return 0 -endfunction " }}}2 - -function! syntastic#util#screenWidth(str, tabstop) abort " {{{2 - let chunks = split(a:str, "\t", 1) - let width = s:_width(chunks[-1]) - for c in chunks[:-2] - let cwidth = s:_width(c) - let width += cwidth + a:tabstop - cwidth % a:tabstop - endfor - return width -endfunction " }}}2 - -" Print as much of a:msg as possible without "Press Enter" prompt appearing -function! syntastic#util#wideMsg(msg) abort " {{{2 - let old_ruler = &ruler - let old_showcmd = &showcmd - - "This is here because it is possible for some error messages to - "begin with \n which will cause a "press enter" prompt. - let msg = substitute(a:msg, "\n", '', 'g') - - "convert tabs to spaces so that the tabs count towards the window - "width as the proper amount of characters - let chunks = split(msg, "\t", 1) - let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1] - let msg = strpart(msg, 0, &columns - 1) - - set noruler noshowcmd - call syntastic#util#redraw(0) - - echo msg - - let &ruler = old_ruler - let &showcmd = old_showcmd -endfunction " }}}2 - -" Check whether a buffer is loaded, listed, and not hidden -function! syntastic#util#bufIsActive(buffer) abort " {{{2 - " convert to number, or hell breaks loose - let buf = str2nr(a:buffer) - - if !bufloaded(buf) || !buflisted(buf) - return 0 - endif - - " get rid of hidden buffers - for tab in range(1, tabpagenr('$')) - if index(tabpagebuflist(tab), buf) >= 0 - return 1 - endif - endfor - - return 0 -endfunction " }}}2 - -" Start in directory a:where and walk up the parent folders until it finds a -" file named a:what; return path to that file -function! syntastic#util#findFileInParent(what, where) abort " {{{2 - let old_suffixesadd = &suffixesadd - let &suffixesadd = '' - let file = findfile(a:what, escape(a:where, ' ,') . ';') - let &suffixesadd = old_suffixesadd - return file -endfunction " }}}2 - -" Start in directory a:where and walk up the parent folders until it finds a -" file matching a:what; return path to that file -function! syntastic#util#findGlobInParent(what, where) abort " {{{2 - let here = fnamemodify(a:where, ':p') - - let root = syntastic#util#Slash() - if syntastic#util#isRunningWindows() && here[1] ==# ':' - " The drive letter is an ever-green source of fun. That's because - " we don't care about running syntastic on Amiga these days. ;) - let root = fnamemodify(root, ':p') - let root = here[0] . root[1:] - endif - - let old = '' - while here !=# '' - try - " Vim 7.4.279 and later - let p = globpath(here, a:what, 1, 1) - catch /\m^Vim\%((\a\+)\)\=:E118/ - let p = split(globpath(here, a:what, 1), "\n") - endtry - - if !empty(p) - return fnamemodify(p[0], ':p') - elseif here ==? root || here ==? old - break - endif - - let old = here - - " we use ':h:h' rather than ':h' since ':p' adds a trailing '/' - " if 'here' is a directory - let here = fnamemodify(here, ':p:h:h') - endwhile - - return '' -endfunction " }}}2 - -" Returns the buffer number of a filename -" @vimlint(EVL104, 1, l:old_shellslash) -function! syntastic#util#fname2buf(fname) abort " {{{2 - if exists('+shellslash') - " bufnr() can't cope with backslashes - let old_shellslash = &shellslash - let &shellslash = 1 - endif - - " this is a best-effort attempt to escape file patterns (cf. :h file-pattern) - " XXX it fails for filenames containing something like \{2,3} - let buf = -1 - for md in [':~:.', ':~', ':p'] - try - " Older versions of Vim can throw E94 here - let buf = bufnr('^' . escape(fnamemodify(a:fname, md), '\*?,{}[') . '$') - catch - " catch everything - endtry - if buf != -1 - break - endif - endfor - if buf == -1 - " XXX definitely wrong, but hope is the last thing to die :) - let buf = bufnr(fnamemodify(a:fname, ':p')) - endif - - if exists('+shellslash') - let &shellslash = old_shellslash - endif - - return buf -endfunction " }}}2 -" @vimlint(EVL104, 0, l:old_shellslash) - -" Returns unique elements in a list -function! syntastic#util#unique(list) abort " {{{2 - let seen = {} - let uniques = [] - for e in a:list - let k = string(e) - if !has_key(seen, k) - let seen[k] = 1 - call add(uniques, e) - endif - endfor - return uniques -endfunction " }}}2 - -" A less noisy shellescape() -function! syntastic#util#shescape(string) abort " {{{2 - return a:string =~# '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string) -endfunction " }}}2 - -" A less noisy shellescape(expand()) -function! syntastic#util#shexpand(string, ...) abort " {{{2 - return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1)) -endfunction " }}}2 - -" Escape arguments -function! syntastic#util#argsescape(opt) abort " {{{2 - if type(a:opt) == type('') && a:opt !=# '' - return [a:opt] - elseif type(a:opt) == type([]) - return map(copy(a:opt), 'syntastic#util#shescape(v:val)') - endif - - return [] -endfunction " }}}2 - -" Decode XML entities -function! syntastic#util#decodeXMLEntities(string) abort " {{{2 - let str = a:string - let str = substitute(str, '\m<', '<', 'g') - let str = substitute(str, '\m>', '>', 'g') - let str = substitute(str, '\m"', '"', 'g') - let str = substitute(str, '\m'', "'", 'g') - let str = substitute(str, '\m&', '\&', 'g') - return str -endfunction " }}}2 - -function! syntastic#util#redraw(full) abort " {{{2 - if a:full - redraw! - else - redraw - endif -endfunction " }}}2 - -function! syntastic#util#dictFilter(errors, filter) abort " {{{2 - let rules = s:_translateFilter(a:filter) - " call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, "applying filter:", rules) - try - call filter(a:errors, rules) - catch /\m^Vim\%((\a\+)\)\=:E/ - let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') - call syntastic#log#error('quiet_messages: ' . msg) - endtry -endfunction " }}}2 - -" Return a [seconds, fractions] list of strings, representing the -" (hopefully high resolution) time since program start -function! syntastic#util#stamp() abort " {{{2 - return split( split(reltimestr(reltime(g:_SYNTASTIC_START)))[0], '\.' ) -endfunction " }}}2 - -function! syntastic#util#setLastTick(buf) abort " {{{2 - call setbufvar(a:buf, 'syntastic_lasttick', getbufvar(a:buf, 'changedtick')) -endfunction " }}}2 - -" Add unique IDs to windows -function! syntastic#util#setWids() abort " {{{2 - for tab in range(1, tabpagenr('$')) - for win in range(1, tabpagewinnr(tab, '$')) - if gettabwinvar(tab, win, 'syntastic_wid') ==# '' - call settabwinvar(tab, win, 'syntastic_wid', s:_wid_base . s:_wid_pool) - let s:_wid_pool += 1 - endif - endfor - endfor -endfunction " }}}2 - -function! syntastic#util#str2float(val) abort " {{{2 - return s:_str2float(a:val) -endfunction " }}}2 - -function! syntastic#util#float2str(val) abort " {{{2 - return s:_float2str(a:val) -endfunction " }}}2 - -" Crude printf()-like width formatter. Handles wide characters. -function! syntastic#util#wformat(format, str) abort " {{{2 - if a:format ==# '' - return a:str - endif - - echomsg string(a:format) . ', ' . string(a:str) - let specs = matchlist(a:format, '\v^(-?)(0?)(%([1-9]\d*))?%(\.(\d+))?$') - if len(specs) < 5 - return a:str - endif - - let flushleft = specs[1] ==# '-' - let lpad = specs[2] ==# '0' ? '0' : ' ' - let minlen = str2nr(specs[3]) - let maxlen = str2nr(specs[4]) - let out = substitute(a:str, "\t", ' ', 'g') - - if maxlen && s:_width(out) > maxlen - let chars = filter(split(out, '\zs\ze', 1), 'v:val !=# ""') - let out = '' - - if flushleft - for c in chars - if s:_width(out . c) < maxlen - let out .= c - else - let out .= &encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '>' - break - endif - endfor - else - call reverse(chars) - for c in chars - if s:_width(c . out) < maxlen - let out = c . out - else - let out = (&encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '<') . out - break - endif - endfor - endif - endif - - if minlen && s:_width(out) < minlen - if flushleft - let out .= repeat(' ', minlen - s:_width(out)) - else - let out = repeat(lpad, minlen - s:_width(out)) . out - endif - endif - - return out -endfunction " }}}2 - -" }}}1 - -" Private functions {{{1 - -function! s:_translateFilter(filters) abort " {{{2 - let conditions = [] - for k in keys(a:filters) - if type(a:filters[k]) == type([]) - call extend(conditions, map(copy(a:filters[k]), 's:_translateElement(k, v:val)')) - else - call add(conditions, s:_translateElement(k, a:filters[k])) - endif - endfor - - if conditions == [] - let conditions = ['1'] - endif - return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') -endfunction " }}}2 - -function! s:_translateElement(key, term) abort " {{{2 - let fkey = a:key - if fkey[0] ==# '!' - let fkey = fkey[1:] - let not = 1 - else - let not = 0 - endif - - if fkey ==? 'level' - let op = not ? ' ==? ' : ' !=? ' - let ret = 'v:val["type"]' . op . string(a:term[0]) - elseif fkey ==? 'type' - if a:term ==? 'style' - let op = not ? ' ==? ' : ' !=? ' - let ret = 'get(v:val, "subtype", "")' . op . '"style"' - else - let op = not ? '!' : '' - let ret = op . 'has_key(v:val, "subtype")' - endif - elseif fkey ==? 'regex' - let op = not ? ' =~? ' : ' !~? ' - let ret = 'v:val["text"]' . op . string(a:term) - elseif fkey ==? 'file' || fkey[:4] ==? 'file:' - let op = not ? ' =~# ' : ' !~# ' - let ret = 'bufname(str2nr(v:val["bufnr"]))' - let mod = fkey[4:] - if mod !=# '' - let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')' - endif - let ret .= op . string(a:term) - else - call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey))) - let ret = '1' - endif - return ret -endfunction " }}}2 - -" strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() -" and hope for the best :) -let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen') -lockvar s:_width - -" @vimlint(EVL103, 1, a:flags) -function! s:_delete_dumb(what, flags) abort " {{{2 - if !exists('s:rmrf') - let s:rmrf = - \ has('unix') || has('mac') ? 'rm -rf' : - \ has('win32') || has('win64') ? 'rmdir /S /Q' : - \ has('win16') || has('win95') || has('dos16') || has('dos32') ? 'deltree /Y' : '' - endif - - if s:rmrf !=# '' - silent! call syntastic#util#system(s:rmrf . ' ' . syntastic#util#shescape(a:what)) - else - call s:_rmrf(a:what) - endif -endfunction " }}}2 -" @vimlint(EVL103, 0, a:flags) - -" delete(dir, 'rf') was added in Vim 7.4.1107, but it didn't become usable until 7.4.1128 -let s:_delete = function(v:version > 704 || (v:version == 704 && has('patch1128')) ? 'delete' : 's:_delete_dumb') -lockvar s:_delete - -function! s:_rmrf(what) abort " {{{2 - if !exists('s:rmdir') - let s:rmdir = syntastic#util#shescape(get(g:, 'netrw_localrmdir', 'rmdir')) - endif - - if getftype(a:what) ==# 'dir' - if filewritable(a:what) != 2 - return - endif - - try - " Vim 7.4.279 and later - let entries = globpath(a:what, '*', 1, 1) - catch /\m^Vim\%((\a\+)\)\=:E118/ - let entries = split(globpath(a:what, '*', 1), "\n") - endtry - for f in entries - call s:_rmrf(f) - endfor - silent! call syntastic#util#system(s:rmdir . ' ' . syntastic#util#shescape(a:what)) - else - silent! call delete(a:what) - endif -endfunction " }}}2 - -let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr') -lockvar s:_str2float - -function! s:_float2str_smart(val) abort " {{{2 - return printf('%.1f', a:val) -endfunction " }}}2 - -function! s:_float2str_dumb(val) abort " {{{2 - return a:val -endfunction " }}}2 - -let s:_float2str = function(has('float') ? 's:_float2str_smart' : 's:_float2str_dumb') -lockvar s:_float2str - -function! s:_getbufvar_dumb(buf, name, ...) abort " {{{2 - let ret = getbufvar(a:buf, a:name) - if a:0 && type(ret) == type('') && ret ==# '' - unlet! ret - let ret = a:1 - endif - return ret -endfunction "}}}2 - -let s:_getbufvar = function(v:version > 703 || (v:version == 703 && has('patch831')) ? 'getbufvar' : 's:_getbufvar_dumb') -lockvar s:_getbufvar - -function! s:_fuzz_dumb() abort " {{{2 - return 'tmp' -endfunction " }}}2 - -let s:_fuzz = function(exists('*getpid') ? 'getpid' : 's:_fuzz_dumb') -lockvar s:_fuzz - -" }}}1 - -let s:_wid_base = 'syntastic_' . s:_fuzz() . '_' . reltimestr(g:_SYNTASTIC_START) . '_' -let s:_wid_pool = 0 - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set sw=4 sts=4 et fdm=marker: diff --git a/vim-bundle/syntastic/doc/syntastic.txt b/vim-bundle/syntastic/doc/syntastic.txt deleted file mode 100644 index f854ef5..0000000 --- a/vim-bundle/syntastic/doc/syntastic.txt +++ /dev/null @@ -1,1214 +0,0 @@ -*syntastic.txt* Syntax checking on the fly has never been so pimp. -*syntastic* - - - It's a bird! It's a plane! ZOMG It's ... ~ - - _____ __ __ _ ~ - / ___/__ ______ / /_____ ______/ /_(_)____ ~ - \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ ~ - ___/ / /_/ / / / / /_/ /_/ (__ ) /_/ / /__ ~ - /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/ ~ - /____/ ~ - - - - Reference Manual~ - - -============================================================================== -CONTENTS *syntastic-contents* - - 1.Intro........................................|syntastic-intro| - 1.1.Quick start............................|syntastic-quickstart| - 1.2.Recommended settings...................|syntastic-recommended| - 2.Functionality provided.......................|syntastic-functionality| - 2.1.The statusline flag....................|syntastic-statusline-flag| - 2.2.Error signs............................|syntastic-error-signs| - 2.3.Error window...........................|syntastic-error-window| - 2.4.Error highlighting.....................|syntastic-highlighting| - 2.5.Aggregating errors.....................|syntastic-aggregating-errors| - 2.6.Filtering errors.......................|syntastic-filtering-errors| - 3.Commands.....................................|syntastic-commands| - 4.Global Options...............................|syntastic-global-options| - 5.Checker Options..............................|syntastic-checker-options| - 5.1.Choosing which checkers to use.........|syntastic-filetype-checkers| - 5.2.Choosing the executable................|syntastic-config-exec| - 5.3.Configuring specific checkers..........|syntastic-config-makeprg| - 5.4.Sorting errors.........................|syntastic-config-sort| - 5.5.Filtering errors.......................|syntastic-config-filtering| - 5.6.Debugging..............................|syntastic-config-debug| - 5.7.Profiling..............................|syntastic-profiling| - 6.Notes........................................|syntastic-notes| - 6.1.Handling of composite filetypes........|syntastic-composite| - 6.2.Editing files over network.............|syntastic-netrw| - 6.3.The 'shellslash' option................|syntastic-shellslash| - 6.4.Saving Vim sessions....................|syntastic-sessions| - 6.5.The location list callback.............|syntastic-loclist-callback| - 7.Compatibility with other software............|syntastic-compatibility| - 7.1.airline................................|syntastic-airline| - 7.2.The csh and tcsh shells................|syntastic-csh| - 7.3.EasyGrep...............................|syntastic-easygrep| - 7.4.Eclim..................................|syntastic-eclim| - 7.5.ferret.................................|syntastic-ferret| - 7.6.The fish shell.........................|syntastic-fish| - 7.7.The fizsh shell........................|syntastic-fizsh| - 7.8.flagship...............................|syntastic-flagship| - 7.9.powerline..............................|syntastic-powerline| - 7.10.The PowerShell shell..................|syntastic-powershell| - 7.11.python-mode...........................|syntastic-pymode| - 7.12.vim-auto-save.........................|syntastic-vim-auto-save| - 7.13.vim-go................................|syntastic-vim-go| - 7.14.vim-virtualenv........................|syntastic-vim-virtualenv| - 7.15.YouCompleteMe.........................|syntastic-ycm| - 7.16.The zsh shell and MacVim..............|syntastic-zsh| - 8.About........................................|syntastic-about| - 9.License......................................|syntastic-license| - - -============================================================================== -1. Intro *syntastic-intro* - -Syntastic is a syntax checking plugin that runs files through external syntax -linters. This can be done on demand, or automatically as files are saved -and opened. If syntax errors are detected, the user is notified and is happy -because they didn't have to compile their code or execute their script to find -them. - -Syntastic comes in two parts: the syntax checker plugins, and the core. The -syntax checker plugins are defined on a per-filetype basis where each one wraps -up an external syntax checking program. The core script delegates off to these -plugins and uses their output to provide the syntastic functionality. - -Take a look at the list of supported filetypes and checkers: |syntastic-checkers|. - -Note: This doc only deals with using syntastic. To learn how to write syntax -checker integrations see the guide on the GitHub wiki: - - https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide - ------------------------------------------------------------------------------- -1.1. Quick start *syntastic-quickstart* - -Syntastic comes preconfigured with a default list of enabled checkers per -|filetype|. This list is kept reasonably short to prevent slowing down Vim or -trying to use conflicting checkers. - -You can see the list of checkers available for the current filetype with the -`:SyntasticInfo` command. - -You probably want to override the configured list of checkers for the -filetypes you use, and also change the arguments passed to specific linters -to suit your needs. See |syntastic-checker-options| below for details. - -Use `:SyntasticCheck` to manually check right now. Use `:Errors` to open the -|location-list| window, and `:lclose` to close it. You can clear the error -list with `:SyntasticReset`, and you can use `:SyntasticToggleMode` to switch -between active (checking on writing the buffer) and passive (manual) checking. - -You don't have to switch focus to the |location-list| window to jump to the -different errors. Vim provides several built-in commands for this, for -example `:lnext` and `:lprevious`. You may want to add shortcut mappings for -these commands, or perhaps install a plugin such as Tim Pope's "unimpaired" -(see https://github.com/tpope/vim-unimpaired) that provides such mappings. - ------------------------------------------------------------------------------- -1.2. Recommended settings *syntastic-recommended* - -Syntastic has numerous options that can be configured, and the defaults are -not particularly well suitable for new users. It is recommended that you start -by adding the following lines to your vimrc, and return to them later as -needed: > - set statusline+=%#warningmsg# - set statusline+=%{SyntasticStatuslineFlag()} - set statusline+=%* - - let g:syntastic_always_populate_loc_list = 1 - let g:syntastic_auto_loc_list = 1 - let g:syntastic_check_on_open = 1 - let g:syntastic_check_on_wq = 0 -< -============================================================================== -2. Functionality provided *syntastic-functionality* - -Syntax checking can be done automatically or on demand (see -|'syntastic_mode_map'| and `:SyntasticToggleMode` for configuring this). - -When syntax checking is done, the features below can be used to notify the -user of errors. See |syntastic-global-options| for how to configure and -activate/deactivate these features. - - * A statusline flag - * Signs beside lines with errors - * The |location-list| can be populated with the errors for the associated - buffer - * Erroneous parts of lines can be highlighted (this functionality is only - provided by some checkers) - * Balloons (if the |+balloon_eval| feature is compiled in) can be used to - display error messages for erroneous lines when hovering the mouse over - them - * Error messages from multiple checkers can be aggregated in a single list - ------------------------------------------------------------------------------- -2.1. The statusline flag *syntastic-statusline-flag* - -To use the statusline flag, this must appear in your |'statusline'| setting > - %{SyntasticStatuslineFlag()} -< -Something like this could be more useful: > - set statusline+=%#warningmsg# - set statusline+=%{SyntasticStatuslineFlag()} - set statusline+=%* -< -When syntax errors are detected a flag will be shown. The content of the flag -is derived from the |'syntastic_stl_format'| option. - -Please note that these settings might conflict with other Vim plugins that -change the way 'statusline' works. Refer to the |syntastic-compatibility| notes -below and to the respective plugins' documentation for possible solutions. - -In particular see |syntastic-airline| below if you're using the "airline" Vim -plugin (https://github.com/vim-airline/vim-airline). See |syntastic-flagship| -if you're using "flagship" (https://github.com/tpope/vim-flagship). See also -|syntastic-powerline| if you're using the "powerline" Vim plugin -(https://github.com/powerline/powerline). - ------------------------------------------------------------------------------- -2.2. Error signs *syntastic-error-signs* - -Syntastic uses the `:sign` commands (provided that the |+signs| feature is -compiled in) to mark lines with errors and warnings in the sign column. To -enable this feature, use the |'syntastic_enable_signs'| option. - -Signs are colored using the Error and Todo syntax highlight groups by default -(see |group-name|). If you wish to customize the colors for the signs, you -can use the following groups: - SyntasticErrorSign - For syntax errors, links to "error" by default - SyntasticWarningSign - For syntax warnings, links to "todo" by default - SyntasticStyleErrorSign - For style errors, links to "SyntasticErrorSign" - by default - SyntasticStyleWarningSign - For style warnings, links to - "SyntasticWarningSign" by default - -Example: > - highlight SyntasticErrorSign guifg=white guibg=red -< -To set up highlighting for the line where a sign resides, you can use the -following highlight groups: - SyntasticErrorLine - SyntasticWarningLine - SyntasticStyleErrorLine - Links to "SyntasticErrorLine" by default - SyntasticStyleWarningLine - Links to "SyntasticWarningLine" by default - -Example: > - highlight SyntasticErrorLine guibg=#2f0000 -< -With Vim 8.0 or later you can ask Vim not to turn off the sign column when no -errors are found, by setting 'signcolumn' to "yes": > - set signcolumn=yes -< ------------------------------------------------------------------------------- -2.3. The error window *syntastic-error-window* - -You can use the `:Errors` command to display the errors for the current buffer -in the |location-list|. - -By default syntastic doesn't fill the |location-list| with the errors found by -the checkers, in order to reduce clashes with other plugins. Consequently, if -you run `:lopen` or `:lwindow` rather than `:Errors` to open the error window -you wouldn't see syntastic's list of errors. If you insist on using `:lopen` -or `:lwindow` you should either run `:SyntasticSetLoclist` after running the -checks, or set |'syntastic_always_populate_loc_list'| which tells syntastic to -update the |location-list| automatically. - ------------------------------------------------------------------------------- -2.4. Error highlighting *syntastic-highlighting* - -Some linters provide enough information for syntastic to be able to highlight -errors. By default the SpellBad syntax highlight group is used to color errors, -and the SpellCap group is used for warnings. If you wish to customize the -colors for highlighting you can use the following groups: - SyntasticError - Links to "SpellBad" by default (see |hl-SpellBad|) - SyntasticWarning - Links to "SpellCap" by default (see |hl-SpellCap|) - SyntasticStyleError - Links to "SyntasticError" by default - SyntasticStyleWarning - Links to "SyntasticWarning" by default - -Example: > - highlight SyntasticError guibg=#2f0000 -< ------------------------------------------------------------------------------- -2.5. Aggregating errors *syntastic-aggregating-errors* - -By default, namely if |'syntastic_aggregate_errors'| is unset, syntastic runs -in turn the checkers corresponding to the filetype of the current file (see -|syntastic-filetype-checkers|), and stops as soon as a checker reports any -errors. It then notifies you of the errors using the notification mechanisms -above. In this mode error lists are always produced by a single checker, and, -if you open the error window, the name of the checker that generated the errors -is shown on the statusline of the error window. - -If |'syntastic_aggregate_errors'| is set, syntastic runs all checkers that -apply (still cf. |syntastic-filetype-checkers|), then aggregates errors found -by all checkers in a single list, and notifies you. In this mode each error -message is labeled with the name of the checker that generated it, but you can -disable generation of these labels by turning off |'syntastic_id_checkers'|. - -If |'syntastic_sort_aggregated_errors'| is set (which is the default), messages -in the aggregated list are grouped by file, then sorted by line number, then -type, then column number. Otherwise messages produced by the same checker are -grouped together, and sorting within each group is decided by the variables -|'syntastic___sort'|. - ------------------------------------------------------------------------------- -2.6. Filtering errors *syntastic-filtering-errors* - -You can selectively disable some of the errors found by checkers either -using |'syntastic_quiet_messages'|, or by specifying a list of patterns in -|'syntastic_ignore_files'|. - -See also: |'syntastic___quiet_messages'| and -|'b:syntastic_skip_checks'|. - -============================================================================== -3. Commands *syntastic-commands* - -:Errors *:Errors* - -When errors have been detected, use this command to pop up the |location-list| -and display the error messages. - -Please note that the `:Errors` command overwrites the current location list with -syntastic's own location list. - -:SyntasticToggleMode *:SyntasticToggleMode* - -Toggles syntastic between active and passive mode. See |'syntastic_mode_map'| -for more info. - -:SyntasticCheck *:SyntasticCheck* - -Manually cause a syntax check to be done. By default the checkers in the -|'g:syntastic__checkers'| or |'b:syntastic_checkers'| lists are run, -cf. |syntastic-filetype-checkers|. If |'syntastic_aggregate_errors'| is unset -(which is the default), checking stops the first time a checker reports any -errors; if |'syntastic_aggregate_errors'| is set, all checkers that apply are -run in turn, and all errors found are aggregated in a single list. - -The command may be followed by a (space separated) list of checkers. In this -case |'g:syntastic__checkers'| and |'b:syntastic_checkers'| are -ignored, and the checkers named by the command's arguments are run instead, in -the order specified. The set by |'syntastic_aggregate_errors'| still apply. - -Example: > - :SyntasticCheck flake8 pylint -< -You can also run checkers for filetypes different from the current filetype -by qualifying their names with their respective filetypes, like this: -"/". - -Example: > - :SyntasticCheck lacheck text/language_check -< -:SyntasticInfo *:SyntasticInfo* - -The command takes an optional argument, and outputs information about the -checkers available for the filetype named by said argument, or for the current -filetype if no argument was provided. - -Example: > - :SyntasticInfo python -< -:SyntasticReset *:SyntasticReset* - -Resets the list of errors and turns off all error notifiers. - -:SyntasticSetLoclist *:SyntasticSetLoclist* - -If |'syntastic_always_populate_loc_list'| is not set, the |location-list| is -not filled in automatically with the list of errors detected by the checkers. -This is useful if you run syntastic along with other plugins that use location -lists. The `:SyntasticSetLoclist` command allows you to stick the errors into -the location list explicitly. - -============================================================================== -4. Global Options *syntastic-global-options* - - *'syntastic_check_on_open'* -Type: boolean -Default: 0 -If this variable is enabled, syntastic in active mode will run syntax checks -when buffers are first loaded, as well as on saving: > - let g:syntastic_check_on_open = 1 -< - *'syntastic_check_on_wq'* -Type: boolean -Default: 1 -In active mode syntax checks are normally run whenever buffers are written to -disk, even when the writes happen just before quitting Vim. If you want to -skip checks when you issue `:wq`, `:x`, and `:ZZ`, set this variable to 0: > - let g:syntastic_check_on_wq = 0 -< - *'syntastic_aggregate_errors'* -Type: boolean -Default: 0 -When enabled, syntastic runs all checkers that apply to the current filetype, -then aggregates errors found by all checkers and displays them. When disabled, -syntastic runs each checker in turn, and stops to display the results the first -time a checker finds any errors. > - let g:syntastic_aggregate_errors = 1 -< - *'syntastic_id_checkers'* -Type: boolean -Default: 1 -When results from multiple checkers are aggregated in a single error list -(that is either when |'syntastic_aggregate_errors'| is enabled, or when -checking a file with a composite filetype, cf. |syntastic-composite|), it -might not be immediately obvious which checker has produced a given error -message. This variable instructs syntastic to label error messages with the -names of the checkers that created them. > - let g:syntastic_id_checkers = 0 -< - *'syntastic_sort_aggregated_errors'* -Type: boolean -Default: 1 -By default, when results from multiple checkers are aggregated in a single -error list (that is either when |'syntastic_aggregate_errors'| is enabled, or -when checking a file with a composite filetype, cf. |syntastic-composite|), -errors are grouped by file, then sorted by line number, then grouped by type -(namely errors take precedence over warnings), then they are sorted by column -number. If you want to leave messages grouped by checker output, set this -variable to 0: > - let g:syntastic_sort_aggregated_errors = 0 -< - *'syntastic_echo_current_error'* -Type: boolean -Default: 1 -If enabled, syntastic will echo current error to the command window. If -multiple errors are found on the same line, |'syntastic_cursor_columns'| is -used to decide which one is shown. > - let g:syntastic_echo_current_error = 1 -< - *'syntastic_cursor_columns'* -Type: boolean -Default: 1 -This option controls which errors are echoed to the command window if -|'syntastic_echo_current_error'| is set and multiple errors are found on the -same line. When the option is enabled, the first error corresponding to the -current column is shown. Otherwise, the first error on the current line is -echoed, regardless of the cursor position on the current line. - -When dealing with very large lists of errors, disabling this option can speed -up navigation significantly: > - let g:syntastic_cursor_column = 0 -< - *'syntastic_enable_signs'* -Type: boolean -Default: 1 -Use this option to tell syntastic whether to use the `:sign` interface to mark -syntax errors: > - let g:syntastic_enable_signs = 1 -< - *'syntastic_error_symbol'* *'syntastic_style_error_symbol'* - *'syntastic_warning_symbol'* *'syntastic_style_warning_symbol'* -Type: string -Use these options to control what the syntastic `:sign` text contains. Several -error symbols can be customized: - syntastic_error_symbol - For syntax errors, defaults to ">>" - syntastic_style_error_symbol - For style errors, defaults to "S>" - syntastic_warning_symbol - For syntax warnings, defaults to ">>" - syntastic_style_warning_symbol - For style warnings, defaults to "S>" - -Example: > - let g:syntastic_error_symbol = "\u2717" - let g:syntastic_warning_symbol = "\u26A0" -< - *'syntastic_enable_balloons'* -Type: boolean -Default: 1 -Use this option to tell syntastic whether to display error messages in balloons -when the mouse is hovered over erroneous lines: > - let g:syntastic_enable_balloons = 1 -< -Note that Vim must be compiled with |+balloon_eval|. - - *'syntastic_enable_highlighting'* -Type: boolean -Default: 1 -Use this option to tell syntastic whether to use syntax highlighting to mark -errors (where possible). Highlighting can be turned off with the following > - let g:syntastic_enable_highlighting = 0 -< - *'syntastic_always_populate_loc_list'* -Type: boolean -Default: 0 -By default syntastic doesn't fill the |location-list| with the errors found -by the checkers, in order to reduce clashes with other plugins. Enable this -option to tell syntastic to always stick any detected errors into the -|location-list|: > - let g:syntastic_always_populate_loc_list = 1 -< -Please note that if |'syntastic_auto_jump'| is set to a non-zero value the -location list is overwritten with Syntastic's own list when taking a jump, -regardless of the value of |'syntastic_always_populate_loc_list'|. The -location list is also overwritten when running the `:Errors` command. - - *'syntastic_auto_jump'* -Type: integer -Default: 0 -Enable this option if you want the cursor to jump to the first detected issue -when saving or opening a file. - -When set to 0 the cursor won't jump automatically. > - let g:syntastic_auto_jump = 0 -< -When set to 1 the cursor will always jump to the first issue detected, -regardless of type. > - let g:syntastic_auto_jump = 1 -< -When set to 2 the cursor will jump to the first issue detected, but only if -this issue is an error. > - let g:syntastic_auto_jump = 2 -< -When set to 3 the cursor will jump to the first error detected, if any. If -all issues detected are warnings, the cursor won't jump. > - let g:syntastic_auto_jump = 3 -< -Please note that in either situation taking the jump also has the side effect -of the location list being overwritten with Syntastic's own location list, -regardless of the value of |'syntastic_always_populate_loc_list'|. - - *'syntastic_auto_loc_list'* -Type: integer -Default: 2 -Use this option to tell syntastic to automatically open and/or close the -|location-list| (see |syntastic-error-window|). - -When set to 0 the error window will be neither opened nor closed -automatically. > - let g:syntastic_auto_loc_list = 0 -< -When set to 1 the error window will be automatically opened when errors are -detected, and closed when none are detected. > - let g:syntastic_auto_loc_list = 1 -< -When set to 2 the error window will be automatically closed when no errors are -detected, but not opened automatically. > - let g:syntastic_auto_loc_list = 2 -< -When set to 3 the error window will be automatically opened when errors are -detected, but not closed automatically. > - let g:syntastic_auto_loc_list = 3 -< - *'syntastic_loc_list_height'* -Type: integer -Default: 10 -Use this option to specify the height of the location lists that syntastic -opens. > - let g:syntastic_loc_list_height = 5 -< - *'syntastic_ignore_files'* -Type: list of strings -Default: [] -Use this option to specify files that syntastic should never check. It's a -list of |regular-expression| patterns. The full paths of files (see |::p|) are -matched against these patterns, and the matches are case-sensitive. Use |\c| -to specify case-insensitive patterns. Example: > - let g:syntastic_ignore_files = ['\m^/usr/include/', '\m\c\.h$'] -< - *'syntastic_filetype_map'* -Type: dictionary -Default: {} -Use this option to map non-standard filetypes to standard ones. Corresponding -checkers are mapped accordingly, which allows syntastic to check files with -non-standard filetypes: > - let g:syntastic_filetype_map = { - \ "plaintex": "tex", - \ "gentoo-metadata": "xml" } -< -Composite filetypes (cf. |syntastic-composite|) can also be mapped to simple -types, which disables the default behaviour of running both checkers against -the input file: > - let g:syntastic_filetype_map = { "handlebars.html": "handlebars" } -< - *'syntastic_mode_map'* -Type: dictionary -Default: { "mode": "active", - "active_filetypes": [], - "passive_filetypes": [] } -Use this option to fine tune when automatic syntax checking is done (or not -done). - -The option should be set to something like: > - let g:syntastic_mode_map = { - \ "mode": "active", - \ "active_filetypes": ["ruby", "php"], - \ "passive_filetypes": ["puppet"] } -< -"mode" can be mapped to one of two values - "active" or "passive". When set -to "active", syntastic does automatic checking whenever a buffer is saved or -initially opened. When set to "passive" syntastic only checks when the user -calls `:SyntasticCheck`. - -The exceptions to these rules are defined with "active_filetypes" and -"passive_filetypes". In passive mode, automatic checks are still done for -filetypes in the "active_filetypes" array (and "passive_filetypes" is -ignored). In active mode, automatic checks are not done for any filetypes in -the "passive_filetypes" array ("active_filetypes" is ignored). - -If any of "mode", "active_filetypes", or "passive_filetypes" are left -unspecified, they default to values above. - -If local variable |'b:syntastic_mode'| is defined its value takes precedence -over all calculations involving |'syntastic_mode_map'| for the corresponding -buffer. - -At runtime, the `:SyntasticToggleMode` command can be used to switch between -active and passive modes. - - *'b:syntastic_mode'* -Type: string -Default: unset -Only the local form |'b:syntastic_mode'| is used. When set to either "active" -or "passive", it takes precedence over |'syntastic_mode_map'| when deciding -whether the corresponding buffer should be checked automatically. - - *'syntastic_quiet_messages'* -Type: dictionary -Default: {} -Use this option to filter out some of the messages produced by checkers. The -option should be set to something like: > - let g:syntastic_quiet_messages = { - \ "!level": "errors", - \ "type": "style", - \ "regex": '\m\[C03\d\d\]', - \ "file:p": ['\m^/usr/include/', '\m\c\.h$'] } -< -Each element turns off messages matching the patterns specified by the -corresponding value. Values are lists, but if a list consists of a single -element you may omit the brackets (e.g. you may write "style" instead of -["style"]). Elements with values [] or "" are ignored (this is useful for -overriding filters, cf. |filter-overrides|). - - "level" - takes one of two values, "warnings" or "errors" - "type" - can be either "syntax" or "style" - "regex" - each item in list is matched against the messages' text as a - case-insensitive |regular-expression| - "file" - each item in list is matched against the filenames the messages - refer to, as a case-sensitive |regular-expression|. - -If a key is prefixed by an exclamation mark "!", the corresponding filter is -negated (i.e. the above example silences all messages that are NOT errors). - -The "file" key may be followed by one or more filename modifiers (see -|filename-modifiers|). The modifiers are applied to the filenames the messages -refer to before matching against the value (i.e. in the above example the full -path of the issues are matched against '\m^/usr/include/' and '\m\c\.h$'). - -If |'syntastic_id_checkers'| is set, filters are applied before error messages -are labeled with the names of the checkers that created them. - -There are also checker-specific variants of this option, providing finer -control. They are named |'syntastic___quiet_messages'|. - -For a particular checker, if both a |'syntastic_quiet_messages'| filter and -a checker-specific filter are present, they are both applied to the list of -errors produced by the said checker. In case of conflicting values for the -same keys, the values of the checker-specific filters take precedence. - - *filter-overrides* -Since filter elements with values [] or "" are ignored, you can disable global -filters for particular checkers, by setting the values of the corresponding -elements in |'syntastic___quiet_messages'| to [] or "". For -example, the following setting will silence all warnings, except for the -ones produced by "pylint": > - let g:syntastic_quiet_messages = { "level": "warnings" } - let g:syntastic_python_pylint_quiet_messages = { "level" : [] } -< - *'syntastic_stl_format'* -Type: string -Default: "[Syntax: line:%F (%t)]" -Use this option to control what the syntastic statusline text contains. Several -magic flags are available to insert information: - %e - number of errors - %w - number of warnings - %t - total number of warnings and errors - %ne - filename of file containing first error - %nw - filename of file containing first warning - %N - filename of file containing first warning or error - %pe - filename with path of file containing first error - %pw - filename with path of file containing first warning - %P - filename with path of file containing first warning or error - %fe - line number of first error - %fw - line number of first warning - %F - line number of first warning or error - -These flags accept width and alignment controls similar to the ones used by -|'statusline'| flags: - %-0{minwid}.{maxwid}{flag} - -All fields except {flag} are optional. A single percent sign can be given as -"%%". - -Several additional flags are available to hide text under certain conditions: - %E{...} - hide the text in the brackets unless there are errors - %W{...} - hide the text in the brackets unless there are warnings - %B{...} - hide the text in the brackets unless there are both warnings AND - errors -These flags can't be nested. - -Example: > - let g:syntastic_stl_format = "[%E{Err: %fe #%e}%B{, }%W{Warn: %fw #%w}]" -< -If this format is used and the current buffer has 5 errors and 1 warning -starting on lines 20 and 10 respectively then this would appear on the -statusline: > - [Err: 20 #5, Warn: 10 #1] -< -If the buffer had 2 warnings, starting on line 5 then this would appear: > - [Warn: 5 #2] -< - *'b:syntastic_skip_checks'* -Type: boolean -Default: unset -Only the local form |'b:syntastic_skip_checks'| is used. When set to a true -value, no checks are run against the corresponding buffer. Example: > - let b:syntastic_skip_checks = 1 -< - *'syntastic_full_redraws'* -Type: boolean -Default: 0 in GUI Vim and MacVim, 1 otherwise -Controls whether syntastic calls `:redraw` or `:redraw!` for screen redraws. -Changing it can in principle make screen redraws smoother, but it can also -cause screen to flicker, or cause ghost characters. Leaving it to the default -should be safe. - - *'syntastic_exit_checks'* -Type: boolean -Default: 0 when running under "cmd.exe" on Windows, 1 otherwise -Syntastic attempts to catch abnormal termination conditions from linters by -looking at their exit codes. The "cmd.exe" shell on Windows make these checks -meaningless, by returning 1 to Vim when the linters exit with non-zero codes. -The above variable can be used to disable exit code checks in syntastic. - - *'syntastic_shell'* -Type: string -Default: Vim's 'shell' -This is the (full path to) the shell syntastic will use to run the linters. -On UNIX and Mac OS-X this shell must accept Bourne-compatible syntax for -file "stdout" and "stderr" redirections ">file" and "2>file". Examples of -compatible shells are "zsh", "bash", "ksh", and of course the original Bourne -"sh". - -This shell is independent of Vim's 'shell', and it isn't used for interactive -operations. It must take care to initialize all environment variables needed -by the linters you're using. Example: > - let g:syntastic_shell = "/bin/sh" -< - *'syntastic_nested_autocommands'* -Type: boolean -Default: 0 -Controls whether syntastic's autocommands |BufReadPost| and |BufWritePost| -are called from other |BufReadPost| and |BufWritePost| autocommands (see -|autocmd-nested|). This is known to trigger interoperability problems with -other plugins, so only enable it if you actually need that functionality. - - *'syntastic_debug'* -Type: integer -Default: 0 -Set this to the sum of one or more of the following flags to enable -debugging: - - 1 - trace general workflow - 2 - dump location lists - 4 - trace notifiers - 8 - trace autocommands - 16 - dump options - 32 - trace running of specific checkers - -Example: > - let g:syntastic_debug = 1 -< -Syntastic will then add debugging messages to Vim's |message-history|. You can -examine these messages with `:mes`. - - *'syntastic_debug_file'* -Type: string -Default: unset -When set, debugging messages are written to the file named by its value, in -addition to being added to Vim's |message-history|: > - let g:syntastic_debug_file = "~/syntastic.log" -< - *'syntastic_extra_filetypes'* -Type: list of strings -Default: [] -List of filetypes handled by checkers external to syntastic. If you have a Vim -plugin that adds a checker for syntastic, and if the said checker deals with a -filetype that is unknown to syntastic, you might consider adding that filetype -to this list: > - let g:syntastic_extra_filetypes = [ "make", "gitcommit" ] -< -This will allow `:SyntasticInfo` to do proper tab completion for the new -filetypes. - -============================================================================== -5. Checker Options *syntastic-checker-options* - ------------------------------------------------------------------------------- -5.1. Choosing which checkers to use *syntastic-filetype-checkers* - - *'g:syntastic__checkers'* -You can tell syntastic which checkers to run for a given filetype by setting a -variable 'g:syntastic__checkers' to a list of checkers, e.g. > - let g:syntastic_php_checkers = ["php", "phpcs", "phpmd"] -< - *'b:syntastic_checkers'* -There is also a per-buffer version of this setting, |'b:syntastic_checkers'|. -When set, it takes precedence over |'g:syntastic__checkers'|. You can -use this in an autocmd to configure specific checkers for particular paths: > - autocmd FileType python if stridx(expand("%:p"), "/some/path/") == 0 | - \ let b:syntastic_checkers = ["pylint"] | endif -< -If neither |'g:syntastic__checkers'| nor |'b:syntastic_checkers'| -is set a default list of checkers is used. Beware however that this list is -deliberately kept minimal, for performance reasons. - -You can specify checkers for other filetypes anywhere in these lists, by -qualifying their names with their respective filetypes: > - let g:syntastic_tex_checkers = ["lacheck", "text/language_check"] -< -Take a look elsewhere in this manual to find out what checkers and filetypes -are supported by syntastic: |syntastic-checkers|. - -Use `:SyntasticInfo` to see which checkers are available for a given filetype. - ------------------------------------------------------------------------------- -5.2. Choosing the executable *syntastic-config-exec* - - *'syntastic___exec'* -The executable run by a checker is normally defined automatically, when the -checker is registered. You can however override it, by setting the variable -'g:syntastic___exec': > - let g:syntastic_ruby_mri_exec = "~/bin/ruby2" -< -This variable has a local version, 'b:syntastic___exec', -which takes precedence over the global one in the corresponding buffer. - - *'b:syntastic__exec'* -There is also a local variable named 'b:syntastic__exec', which -takes precedence over both 'b:syntastic___exec' and -'g:syntastic___exec' in the buffers where it is defined. - ------------------------------------------------------------------------------- -5.3. Configuring specific checkers *syntastic-config-makeprg* - -Linters are run by constructing a command line and by passing it to a shell -(see |'shell'| and |'syntastic_shell'|). In most cases this command line is -built using an internal function named "makeprgBuild()", which provides a -number of options that allow you to customise every part of the command that -gets called. - - *'syntastic___