summaryrefslogtreecommitdiffstats
path: root/.vim/bundle/ctrlp.vim/autoload/ctrlp
diff options
context:
space:
mode:
Diffstat (limited to '.vim/bundle/ctrlp.vim/autoload/ctrlp')
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim140
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/buffertag.vim261
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/changes.vim95
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/dir.vim93
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/line.vim62
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/mixed.vim83
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/mrufiles.vim148
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/quickfix.vim59
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/rtscript.vim59
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/tag.vim128
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/undo.vim154
-rw-r--r--.vim/bundle/ctrlp.vim/autoload/ctrlp/utils.vim120
12 files changed, 1402 insertions, 0 deletions
diff --git a/.vim/bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim b/.vim/bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim
new file mode 100644
index 0000000..7d955b5
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim
@@ -0,0 +1,140 @@
+" =============================================================================
+" File: autoload/ctrlp/bookmarkdir.vim
+" Description: Bookmarked directories extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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 = 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
new file mode 100644
index 0000000..2af1fe0
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/buffertag.vim
@@ -0,0 +1,261 @@
+" =============================================================================
+" File: autoload/ctrlp/buffertag.vim
+" Description: Buffer Tag extension
+" Maintainer: Kien Nguyen <github.com/kien>
+" 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',
+ \ '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, bufname(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:bufname = fnamemodify(a:1, ':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
new file mode 100644
index 0000000..c391aad
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/changes.vim
@@ -0,0 +1,95 @@
+" =============================================================================
+" File: autoload/ctrlp/changes.vim
+" Description: Change list extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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 fnamet = fnamemodify(bufname(each), ':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, bufname(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:bufnr = bufnr('^'.fnamemodify(a:1, ':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
new file mode 100644
index 0000000..2589a0b
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/dir.vim
@@ -0,0 +1,93 @@
+" =============================================================================
+" File: autoload/ctrlp/dir.vim
+" Description: Directory extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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, []]
+ cal s:globdirs(ctrlp#utils#fnesc(s:cwd, 'g', ','), 0)
+ 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#utils#lash().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
new file mode 100644
index 0000000..a2e0dde
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/line.vim
@@ -0,0 +1,62 @@
+" =============================================================================
+" File: autoload/ctrlp/line.vim
+" Description: Line extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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()',
+ \ '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()
+ let [bufs, lines] = [ctrlp#buffers('id'), []]
+ for bufnr in bufs
+ let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)]
+ let lfb = lfb == [] ? ctrlp#utils#readfile(fnamemodify(bufn, ':p')) : lfb
+ cal map(lfb, 'tr(v:val, '' '', '' '')')
+ let [linenr, len_lfb, buft] = [1, len(lfb), 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, bufname(bufnr), get(info, 2))
+ en
+endf
+
+fu! ctrlp#line#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/mixed.vim b/.vim/bundle/ctrlp.vim/autoload/ctrlp/mixed.vim
new file mode 100644
index 0000000..cf01d10
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/mixed.vim
@@ -0,0 +1,83 @@
+" =============================================================================
+" File: autoload/ctrlp/mixed.vim
+" Description: Mixing Files + MRU + Buffers
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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 bufs = map(ctrlp#buffers('id'), 'fnamemodify(bufname(v:val), ":p")')
+ 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
+ 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
new file mode 100644
index 0000000..908052f
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/mrufiles.vim
@@ -0,0 +1,148 @@
+" =============================================================================
+" File: autoload/ctrlp/mrufiles.vim
+" Description: Most Recently Used Files extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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
+ 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:mergelists() : 0 : s:reformat(s:mergelists())
+endf
+
+fu! ctrlp#mrufiles#bufs()
+ retu s:mrbs
+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('<abuf>', 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
new file mode 100644
index 0000000..03ab921
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/quickfix.vim
@@ -0,0 +1,59 @@
+" =============================================================================
+" File: autoload/ctrlp/quickfix.vim
+" Description: Quickfix extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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
new file mode 100644
index 0000000..eed21c6
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/rtscript.vim
@@ -0,0 +1,59 @@
+" =============================================================================
+" File: autoload/ctrlp/rtscript.vim
+" Description: Runtime scripts extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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
new file mode 100644
index 0000000..cd4d909
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/tag.vim
@@ -0,0 +1,128 @@
+" =============================================================================
+" File: autoload/ctrlp/tag.vim
+" Description: Tag file extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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, fname] = split(a:str, '\t\+\ze[^\t]\+$')
+ let tgs = taglist('^'.tg.'$')
+ if len(tgs) < 2
+ retu [1, 1]
+ en
+ let bname = fnamemodify(bufname('%'), ':p')
+ let fname = expand(fnamemodify(simplify(fname), ':s?^[.\/]\+??:p:.'), 1)
+ let [fnd, ct, pos, idx] = [0, 0, 0, 0]
+ wh idx < len(tgs)
+ if bname == fnamemodify(tgs[idx]["filename"], ':p')
+ cal insert(tgs, remove(tgs, idx))
+ brea
+ en
+ let idx += 1
+ endw
+ for each in tgs
+ let ct += 1
+ let fulname = fnamemodify(each["filename"], ':p')
+ if stridx(fulname, fname) >= 0
+ \ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
+ let fnd += 1
+ let pos = ct
+ en
+ if fnd > 1 | brea | en
+ endfo
+ retu [fnd, pos]
+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, fnd] = [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 cmd = fnd[0] == 1 ? 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 fnd[0] == 1
+ if cmd != ''
+ exe cmd
+ en
+ let save_cst = &cst
+ set cst&
+ cal feedkeys(":".fnd[1]."ta ".tg."\r", 'nt')
+ let &cst = save_cst
+ el
+ cal feedkeys(":".cmd." ".tg."\r", '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
new file mode 100644
index 0000000..dee705e
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/undo.vim
@@ -0,0 +1,154 @@
+" =============================================================================
+" File: autoload/ctrlp/undo.vim
+" Description: Undo extension
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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
new file mode 100644
index 0000000..d54fd38
--- /dev/null
+++ b/.vim/bundle/ctrlp.vim/autoload/ctrlp/utils.vim
@@ -0,0 +1,120 @@
+" =============================================================================
+" File: autoload/ctrlp/utils.vim
+" Description: Utilities
+" Author: Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" 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
+
+fu! ctrlp#utils#dircompl(...)
+ let [hsl, str] = [match(a:1, '[\/]'), '']
+ let par = substitute(a:1, '[^\/]*$', '', '')
+ let path = !hsl ? par : hsl > 0 ? getcwd().s:lash().par : getcwd()
+ for dir in split(globpath(ctrlp#utils#fnesc(path, 'g', ','), '*/'), '\n')
+ let str .= par.split(dir, '[\/]')[-1]."\n"
+ endfo
+ retu str
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2