utils 0.0.57 → 0.0.58

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,83 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/mixed.vim
3
+ " Description: Mixing Files + MRU + Buffers
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Init {{{1
8
+ if exists('g:loaded_ctrlp_mixed') && g:loaded_ctrlp_mixed
9
+ fini
10
+ en
11
+ let [g:loaded_ctrlp_mixed, g:ctrlp_newmix] = [1, 0]
12
+
13
+ cal add(g:ctrlp_ext_vars, {
14
+ \ 'init': 'ctrlp#mixed#init(s:compare_lim)',
15
+ \ 'accept': 'ctrlp#acceptfile',
16
+ \ 'lname': 'fil + mru + buf',
17
+ \ 'sname': 'mix',
18
+ \ 'type': 'path',
19
+ \ 'opmul': 1,
20
+ \ 'specinput': 1,
21
+ \ })
22
+
23
+ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
24
+ " Utilities {{{1
25
+ fu! s:newcache(cwd)
26
+ if g:ctrlp_newmix || !has_key(g:ctrlp_allmixes, 'data') | retu 1 | en
27
+ retu g:ctrlp_allmixes['cwd'] != a:cwd
28
+ \ || g:ctrlp_allmixes['filtime'] < getftime(ctrlp#utils#cachefile())
29
+ \ || g:ctrlp_allmixes['mrutime'] < getftime(ctrlp#mrufiles#cachefile())
30
+ \ || g:ctrlp_allmixes['bufs'] < len(ctrlp#mrufiles#bufs())
31
+ endf
32
+
33
+ fu! s:getnewmix(cwd, clim)
34
+ if g:ctrlp_newmix
35
+ cal ctrlp#mrufiles#refresh('raw')
36
+ let g:ctrlp_newcache = 1
37
+ en
38
+ let g:ctrlp_lines = copy(ctrlp#files())
39
+ cal ctrlp#progress('Mixing...')
40
+ let mrufs = copy(ctrlp#mrufiles#list('raw'))
41
+ if exists('+ssl') && &ssl
42
+ cal map(mrufs, 'tr(v:val, "\\", "/")')
43
+ en
44
+ let bufs = map(ctrlp#buffers('id'), 'fnamemodify(bufname(v:val), ":p")')
45
+ let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0')
46
+ if len(mrufs) > len(g:ctrlp_lines)
47
+ cal filter(mrufs, 'stridx(v:val, a:cwd)')
48
+ el
49
+ let cwd_mrufs = filter(copy(mrufs), '!stridx(v:val, a:cwd)')
50
+ let cwd_mrufs = ctrlp#rmbasedir(cwd_mrufs)
51
+ for each in cwd_mrufs
52
+ let id = index(g:ctrlp_lines, each)
53
+ if id >= 0 | cal remove(g:ctrlp_lines, id) | en
54
+ endfo
55
+ en
56
+ cal map(mrufs, 'fnamemodify(v:val, ":.")')
57
+ let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines)
58
+ \ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines
59
+ if len(g:ctrlp_lines) <= a:clim
60
+ cal sort(g:ctrlp_lines, 'ctrlp#complen')
61
+ en
62
+ let g:ctrlp_allmixes = { 'filtime': getftime(ctrlp#utils#cachefile()),
63
+ \ 'mrutime': getftime(ctrlp#mrufiles#cachefile()), 'cwd': a:cwd,
64
+ \ 'bufs': len(ctrlp#mrufiles#bufs()), 'data': g:ctrlp_lines }
65
+ endf
66
+ " Public {{{1
67
+ fu! ctrlp#mixed#init(clim)
68
+ let cwd = getcwd()
69
+ if s:newcache(cwd)
70
+ cal s:getnewmix(cwd, a:clim)
71
+ el
72
+ let g:ctrlp_lines = g:ctrlp_allmixes['data']
73
+ en
74
+ let g:ctrlp_newmix = 0
75
+ retu g:ctrlp_lines
76
+ endf
77
+
78
+ fu! ctrlp#mixed#id()
79
+ retu s:id
80
+ endf
81
+ "}}}
82
+
83
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,119 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/mrufiles.vim
3
+ " Description: Most Recently Used Files extension
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Static variables {{{1
8
+ let [s:mrbs, s:mrufs] = [[], []]
9
+
10
+ fu! ctrlp#mrufiles#opts()
11
+ let [pref, opts] = ['g:ctrlp_mruf_', {
12
+ \ 'max': ['s:max', 250],
13
+ \ 'include': ['s:in', ''],
14
+ \ 'exclude': ['s:ex', ''],
15
+ \ 'case_sensitive': ['s:cseno', 1],
16
+ \ 'relative': ['s:re', 0],
17
+ \ }]
18
+ for [ke, va] in items(opts)
19
+ let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]]
20
+ endfo
21
+ endf
22
+ cal ctrlp#mrufiles#opts()
23
+ " Utilities {{{1
24
+ fu! s:excl(fn)
25
+ retu !empty({s:ex}) && a:fn =~# {s:ex}
26
+ endf
27
+
28
+ fu! s:mergelists()
29
+ let diskmrufs = ctrlp#utils#readfile(ctrlp#mrufiles#cachefile())
30
+ cal filter(diskmrufs, 'index(s:mrufs, v:val) < 0')
31
+ let mrufs = s:mrufs + diskmrufs
32
+ retu s:chop(mrufs)
33
+ endf
34
+
35
+ fu! s:chop(mrufs)
36
+ if len(a:mrufs) > {s:max} | cal remove(a:mrufs, {s:max}, -1) | en
37
+ retu a:mrufs
38
+ endf
39
+
40
+ fu! s:reformat(mrufs)
41
+ if {s:re}
42
+ let cwd = exists('+ssl') ? tr(getcwd(), '/', '\') : getcwd()
43
+ cal filter(a:mrufs, '!stridx(v:val, cwd)')
44
+ en
45
+ retu map(a:mrufs, 'fnamemodify(v:val, ":.")')
46
+ endf
47
+
48
+ fu! s:record(bufnr)
49
+ if s:locked | retu | en
50
+ let bufnr = a:bufnr + 0
51
+ if bufnr <= 0 | retu | en
52
+ let bufname = bufname(bufnr)
53
+ if empty(bufname) | retu | en
54
+ let fn = fnamemodify(bufname, ':p')
55
+ let fn = exists('+ssl') ? tr(fn, '/', '\') : fn
56
+ cal filter(s:mrbs, 'v:val != bufnr')
57
+ cal insert(s:mrbs, bufnr)
58
+ if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} )
59
+ \ || !empty(&bt) || !filereadable(fn) | retu
60
+ en
61
+ cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn')
62
+ cal insert(s:mrufs, fn)
63
+ endf
64
+
65
+ fu! s:savetofile(mrufs)
66
+ cal ctrlp#utils#writecache(a:mrufs, s:cadir, s:cafile)
67
+ endf
68
+ " Public {{{1
69
+ fu! ctrlp#mrufiles#refresh(...)
70
+ let s:mrufs = s:mergelists()
71
+ cal filter(s:mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)')
72
+ if exists('+ssl')
73
+ cal map(s:mrufs, 'tr(v:val, "/", "\\")')
74
+ cal filter(s:mrufs, 'count(s:mrufs, v:val) == 1')
75
+ en
76
+ cal s:savetofile(s:mrufs)
77
+ retu a:0 && a:1 == 'raw' ? [] : s:reformat(copy(s:mrufs))
78
+ endf
79
+
80
+ fu! ctrlp#mrufiles#remove(files)
81
+ let s:mrufs = []
82
+ if a:files != []
83
+ let s:mrufs = s:mergelists()
84
+ cal filter(s:mrufs, 'index(a:files, v:val, 0, '.(!{s:cseno}).') < 0')
85
+ en
86
+ cal s:savetofile(s:mrufs)
87
+ retu s:reformat(copy(s:mrufs))
88
+ endf
89
+
90
+ fu! ctrlp#mrufiles#list(...)
91
+ retu a:0 ? a:1 == 'raw' ? s:mergelists() : 0 : s:reformat(s:mergelists())
92
+ endf
93
+
94
+ fu! ctrlp#mrufiles#bufs()
95
+ retu s:mrbs
96
+ endf
97
+
98
+ fu! ctrlp#mrufiles#cachefile()
99
+ if !exists('s:cadir') || !exists('s:cafile')
100
+ let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'mru'
101
+ let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
102
+ en
103
+ retu s:cafile
104
+ endf
105
+
106
+ fu! ctrlp#mrufiles#init()
107
+ if !has('autocmd') | retu | en
108
+ let s:locked = 0
109
+ aug CtrlPMRUF
110
+ au!
111
+ au BufAdd,BufEnter,BufLeave,BufUnload * cal s:record(expand('<abuf>', 1))
112
+ au QuickFixCmdPre *vimgrep* let s:locked = 1
113
+ au QuickFixCmdPost *vimgrep* let s:locked = 0
114
+ au VimLeavePre * cal s:savetofile(s:mergelists())
115
+ aug END
116
+ endf
117
+ "}}}
118
+
119
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,62 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/quickfix.vim
3
+ " Description: Quickfix extension
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Init {{{1
8
+ if exists('g:loaded_ctrlp_quickfix') && g:loaded_ctrlp_quickfix
9
+ fini
10
+ en
11
+ let g:loaded_ctrlp_quickfix = 1
12
+
13
+ cal add(g:ctrlp_ext_vars, {
14
+ \ 'init': 'ctrlp#quickfix#init()',
15
+ \ 'accept': 'ctrlp#quickfix#accept',
16
+ \ 'lname': 'quickfix',
17
+ \ 'sname': 'qfx',
18
+ \ 'type': 'line',
19
+ \ 'sort': 0,
20
+ \ 'nolim': 1,
21
+ \ })
22
+
23
+ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
24
+
25
+ fu! s:lineout(dict)
26
+ retu printf('%s|%d:%d| %s', bufname(a:dict['bufnr']), a:dict['lnum'],
27
+ \ a:dict['col'], matchstr(a:dict['text'], '\s*\zs.*\S'))
28
+ endf
29
+ " Utilities {{{1
30
+ fu! s:syntax()
31
+ if !ctrlp#nosy()
32
+ cal ctrlp#hicheck('CtrlPqfLineCol', 'Search')
33
+ sy match CtrlPqfLineCol '|\zs\d\+:\d\+\ze|'
34
+ en
35
+ endf
36
+ " Public {{{1
37
+ fu! ctrlp#quickfix#init()
38
+ cal s:syntax()
39
+ retu map(getqflist(), 's:lineout(v:val)')
40
+ endf
41
+
42
+ fu! ctrlp#quickfix#accept(mode, str)
43
+ let items = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|')
44
+ if items == [] | retu | en
45
+ let [md, filpath] = [a:mode, fnamemodify(items[1], ':p')]
46
+ if empty(filpath) | retu | en
47
+ cal ctrlp#exit()
48
+ let cmd = md == 't' ? 'tabe' : md == 'h' ? 'new' : md == 'v' ? 'vne'
49
+ \ : ctrlp#normcmd('e')
50
+ let cmd = cmd == 'e' && &modified ? 'hid e' : cmd
51
+ exe cmd ctrlp#fnesc(filpath)
52
+ cal cursor(items[2], items[3])
53
+ sil! norm! zvzz
54
+ cal ctrlp#setlcdir()
55
+ endf
56
+
57
+ fu! ctrlp#quickfix#id()
58
+ retu s:id
59
+ endf
60
+ "}}}
61
+
62
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,49 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/rtscript.vim
3
+ " Description: Runtime scripts extension
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Init {{{1
8
+ if exists('g:loaded_ctrlp_rtscript') && g:loaded_ctrlp_rtscript
9
+ fini
10
+ en
11
+ let [g:loaded_ctrlp_rtscript, g:ctrlp_newrts] = [1, 0]
12
+
13
+ cal add(g:ctrlp_ext_vars, {
14
+ \ 'init': 'ctrlp#rtscript#init()',
15
+ \ 'accept': 'ctrlp#acceptfile',
16
+ \ 'lname': 'runtime scripts',
17
+ \ 'sname': 'rts',
18
+ \ 'type': 'path',
19
+ \ 'opmul': 1,
20
+ \ })
21
+
22
+ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
23
+ " Public {{{1
24
+ fu! ctrlp#rtscript#init()
25
+ if g:ctrlp_newrts
26
+ \ || !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp )
27
+ sil! cal ctrlp#progress('Indexing...')
28
+ let entries = split(globpath(&rtp, '**/*.*'), "\n")
29
+ cal filter(entries, 'count(entries, v:val) == 1')
30
+ let [entries, echoed] = [ctrlp#dirnfile(entries)[1], 1]
31
+ el
32
+ let [entries, results] = g:ctrlp_rtscache[2:3]
33
+ en
34
+ let cwd = getcwd()
35
+ if g:ctrlp_newrts
36
+ \ || !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, cwd] )
37
+ if !exists('echoed') | sil! cal ctrlp#progress('Processing...') | en
38
+ let results = map(copy(entries), 'fnamemodify(v:val, '':.'')')
39
+ en
40
+ let [g:ctrlp_rtscache, g:ctrlp_newrts] = [[&rtp, cwd, entries, results], 0]
41
+ retu results
42
+ endf
43
+
44
+ fu! ctrlp#rtscript#id()
45
+ retu s:id
46
+ endf
47
+ "}}}
48
+
49
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,112 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/tag.vim
3
+ " Description: Tag file extension
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Init {{{1
8
+ if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
9
+ fini
10
+ en
11
+ let g:loaded_ctrlp_tag = 1
12
+
13
+ cal add(g:ctrlp_ext_vars, {
14
+ \ 'init': 'ctrlp#tag#init()',
15
+ \ 'accept': 'ctrlp#tag#accept',
16
+ \ 'lname': 'tags',
17
+ \ 'sname': 'tag',
18
+ \ 'enter': 'ctrlp#tag#enter()',
19
+ \ 'type': 'tabs',
20
+ \ })
21
+
22
+ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
23
+ " Utilities {{{1
24
+ fu! s:findcount(str)
25
+ let [tg, fname] = split(a:str, '\t\+\ze[^\t]\+$')
26
+ let [fname, tgs] = [expand(fname, 1), taglist('^'.tg.'$')]
27
+ if empty(tgs) | retu [1, 1] | en
28
+ let [fnd, ct, pos] = [0, 0, 0]
29
+ for each in tgs
30
+ let ct += 1
31
+ let fulname = fnamemodify(each["filename"], ':p')
32
+ if stridx(fulname, fname) >= 0
33
+ \ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
34
+ let fnd += 1
35
+ let pos = ct
36
+ en
37
+ if fnd > 1 | brea | en
38
+ endfo
39
+ retu [fnd, pos]
40
+ endf
41
+
42
+ fu! s:filter(tags)
43
+ let [nr, alltags] = [0, a:tags]
44
+ wh 0 < 1
45
+ if alltags[nr] =~ '^!' && alltags[nr] !~ '^!_TAG_'
46
+ let nr += 1
47
+ con
48
+ en
49
+ if alltags[nr] =~ '^!_TAG_' && len(alltags) > nr
50
+ cal remove(alltags, nr)
51
+ el
52
+ brea
53
+ en
54
+ endw
55
+ retu alltags
56
+ endf
57
+
58
+ fu! s:syntax()
59
+ if !ctrlp#nosy()
60
+ cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
61
+ sy match CtrlPTabExtra '\zs\t.*\ze$'
62
+ en
63
+ endf
64
+ " Public {{{1
65
+ fu! ctrlp#tag#init()
66
+ if empty(s:tagfiles) | retu [] | en
67
+ let g:ctrlp_alltags = []
68
+ let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1'))
69
+ for each in tagfiles
70
+ let alltags = s:filter(ctrlp#utils#readfile(each))
71
+ cal extend(g:ctrlp_alltags, alltags)
72
+ endfo
73
+ cal s:syntax()
74
+ retu g:ctrlp_alltags
75
+ endf
76
+
77
+ fu! ctrlp#tag#accept(mode, str)
78
+ cal ctrlp#exit()
79
+ let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
80
+ let [tg, fnd] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str)]
81
+ let cmds = {
82
+ \ 't': ['tab sp', 'tab stj'],
83
+ \ 'h': ['sp', 'stj'],
84
+ \ 'v': ['vs', 'vert stj'],
85
+ \ 'e': ['', 'tj'],
86
+ \ }
87
+ let cmd = fnd[0] == 1 ? cmds[a:mode][0] : cmds[a:mode][1]
88
+ let cmd = cmd == 'tj' && &modified ? 'hid '.cmd : cmd
89
+ let cmd = cmd =~ '^tab' ? tabpagenr('$').cmd : cmd
90
+ if fnd[0] == 1
91
+ if cmd != ''
92
+ exe cmd
93
+ en
94
+ exe fnd[1].'ta' tg
95
+ el
96
+ exe cmd tg
97
+ en
98
+ cal ctrlp#setlcdir()
99
+ endf
100
+
101
+ fu! ctrlp#tag#id()
102
+ retu s:id
103
+ endf
104
+
105
+ fu! ctrlp#tag#enter()
106
+ let tfs = tagfiles()
107
+ let s:tagfiles = tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'),
108
+ \ 'filereadable(v:val)') : []
109
+ endf
110
+ "}}}
111
+
112
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,154 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/undo.vim
3
+ " Description: Undo extension
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Init {{{1
8
+ if ( exists('g:loaded_ctrlp_undo') && g:loaded_ctrlp_undo )
9
+ fini
10
+ en
11
+ let g:loaded_ctrlp_undo = 1
12
+
13
+ cal add(g:ctrlp_ext_vars, {
14
+ \ 'init': 'ctrlp#undo#init()',
15
+ \ 'accept': 'ctrlp#undo#accept',
16
+ \ 'lname': 'undo',
17
+ \ 'sname': 'udo',
18
+ \ 'enter': 'ctrlp#undo#enter()',
19
+ \ 'exit': 'ctrlp#undo#exit()',
20
+ \ 'type': 'line',
21
+ \ 'sort': 0,
22
+ \ 'nolim': 1,
23
+ \ })
24
+
25
+ let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
26
+
27
+ let s:text = map(['second', 'seconds', 'minutes', 'hours', 'days', 'weeks',
28
+ \ 'months', 'years'], '" ".v:val." ago"')
29
+ " Utilities {{{1
30
+ fu! s:getundo()
31
+ if exists('*undotree')
32
+ \ && ( v:version > 703 || ( v:version == 703 && has('patch005') ) )
33
+ retu [1, undotree()]
34
+ el
35
+ redi => result
36
+ sil! undol
37
+ redi END
38
+ retu [0, split(result, "\n")[1:]]
39
+ en
40
+ endf
41
+
42
+ fu! s:flatten(tree, cur)
43
+ let flatdict = {}
44
+ for each in a:tree
45
+ let saved = has_key(each, 'save') ? 'saved' : ''
46
+ let current = each['seq'] == a:cur ? 'current' : ''
47
+ cal extend(flatdict, { each['seq'] : [each['time'], saved, current] })
48
+ if has_key(each, 'alt')
49
+ cal extend(flatdict, s:flatten(each['alt'], a:cur))
50
+ en
51
+ endfo
52
+ retu flatdict
53
+ endf
54
+
55
+ fu! s:elapsed(nr)
56
+ let [text, time] = [s:text, localtime() - a:nr]
57
+ let mins = time / 60
58
+ let hrs = time / 3600
59
+ let days = time / 86400
60
+ let wks = time / 604800
61
+ let mons = time / 2592000
62
+ let yrs = time / 31536000
63
+ if yrs > 1
64
+ retu yrs.text[7]
65
+ elsei mons > 1
66
+ retu mons.text[6]
67
+ elsei wks > 1
68
+ retu wks.text[5]
69
+ elsei days > 1
70
+ retu days.text[4]
71
+ elsei hrs > 1
72
+ retu hrs.text[3]
73
+ elsei mins > 1
74
+ retu mins.text[2]
75
+ elsei time == 1
76
+ retu time.text[0]
77
+ elsei time < 120
78
+ retu time.text[1]
79
+ en
80
+ endf
81
+
82
+ fu! s:syntax()
83
+ if ctrlp#nosy() | retu | en
84
+ for [ke, va] in items({'T': 'Directory', 'Br': 'Comment', 'Nr': 'String',
85
+ \ 'Sv': 'Comment', 'Po': 'Title'})
86
+ cal ctrlp#hicheck('CtrlPUndo'.ke, va)
87
+ endfo
88
+ sy match CtrlPUndoT '\v\d+ \zs[^ ]+\ze|\d+:\d+:\d+'
89
+ sy match CtrlPUndoBr '\[\|\]'
90
+ sy match CtrlPUndoNr '\[\d\+\]' contains=CtrlPUndoBr
91
+ sy match CtrlPUndoSv 'saved'
92
+ sy match CtrlPUndoPo 'current'
93
+ endf
94
+
95
+ fu! s:dict2list(dict)
96
+ for ke in keys(a:dict)
97
+ let a:dict[ke][0] = s:elapsed(a:dict[ke][0])
98
+ endfo
99
+ retu map(keys(a:dict), 'eval(''[v:val, a:dict[v:val]]'')')
100
+ endf
101
+
102
+ fu! s:compval(...)
103
+ retu a:2[0] - a:1[0]
104
+ endf
105
+
106
+ fu! s:format(...)
107
+ let saved = !empty(a:1[1][1]) ? ' '.a:1[1][1] : ''
108
+ let current = !empty(a:1[1][2]) ? ' '.a:1[1][2] : ''
109
+ retu a:1[1][0].' ['.a:1[0].']'.saved.current
110
+ endf
111
+
112
+ fu! s:formatul(...)
113
+ let parts = matchlist(a:1,
114
+ \ '\v^\s+(\d+)\s+\d+\s+([^ ]+\s?[^ ]+|\d+\s\w+\s\w+)(\s*\d*)$')
115
+ retu parts == [] ? '----'
116
+ \ : parts[2].' ['.parts[1].']'.( parts[3] != '' ? ' saved' : '' )
117
+ endf
118
+ " Public {{{1
119
+ fu! ctrlp#undo#init()
120
+ let entries = s:undos[0] ? s:undos[1]['entries'] : s:undos[1]
121
+ if empty(entries) | retu [] | en
122
+ if !exists('s:lines')
123
+ if s:undos[0]
124
+ let entries = s:dict2list(s:flatten(entries, s:undos[1]['seq_cur']))
125
+ let s:lines = map(sort(entries, 's:compval'), 's:format(v:val)')
126
+ el
127
+ let s:lines = map(reverse(entries), 's:formatul(v:val)')
128
+ en
129
+ en
130
+ cal s:syntax()
131
+ retu s:lines
132
+ endf
133
+
134
+ fu! ctrlp#undo#accept(mode, str)
135
+ let undon = matchstr(a:str, '\[\zs\d\+\ze\]')
136
+ if empty(undon) | retu | en
137
+ cal ctrlp#exit()
138
+ exe 'u' undon
139
+ endf
140
+
141
+ fu! ctrlp#undo#id()
142
+ retu s:id
143
+ endf
144
+
145
+ fu! ctrlp#undo#enter()
146
+ let s:undos = s:getundo()
147
+ endf
148
+
149
+ fu! ctrlp#undo#exit()
150
+ unl! s:lines
151
+ endf
152
+ "}}}
153
+
154
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
@@ -0,0 +1,72 @@
1
+ " =============================================================================
2
+ " File: autoload/ctrlp/utils.vim
3
+ " Description: Utilities
4
+ " Author: Kien Nguyen <github.com/kien>
5
+ " =============================================================================
6
+
7
+ " Static variables {{{1
8
+ fu! ctrlp#utils#lash()
9
+ retu &ssl || !exists('+ssl') ? '/' : '\'
10
+ endf
11
+ let s:lash = ctrlp#utils#lash()
12
+
13
+ fu! s:lash(...)
14
+ retu match(a:0 ? a:1 : getcwd(), '[\/]$') < 0 ? s:lash : ''
15
+ endf
16
+
17
+ fu! ctrlp#utils#opts()
18
+ let usrhome = $HOME.s:lash($HOME)
19
+ let cahome = exists('$XDG_CACHE_HOME') ? $XDG_CACHE_HOME : usrhome.'.cache'
20
+ let s:cache_dir = isdirectory(usrhome.'.ctrlp_cache')
21
+ \ ? usrhome.'.ctrlp_cache' : cahome.s:lash(cahome).'ctrlp'
22
+ if exists('g:ctrlp_cache_dir')
23
+ let s:cache_dir = expand(g:ctrlp_cache_dir, 1)
24
+ if isdirectory(s:cache_dir.s:lash(s:cache_dir).'.ctrlp_cache')
25
+ let s:cache_dir = s:cache_dir.s:lash(s:cache_dir).'.ctrlp_cache'
26
+ en
27
+ en
28
+ endf
29
+ cal ctrlp#utils#opts()
30
+ " Files and Directories {{{1
31
+ fu! ctrlp#utils#cachedir()
32
+ retu s:cache_dir
33
+ endf
34
+
35
+ fu! ctrlp#utils#cachefile(...)
36
+ let [tail, dir] = [a:0 == 1 ? '.'.a:1 : '', a:0 == 2 ? a:1 : getcwd()]
37
+ let cache_file = substitute(dir, '\([\/]\|^\a\zs:\)', '%', 'g').tail.'.txt'
38
+ retu a:0 == 1 ? cache_file : s:cache_dir.s:lash(s:cache_dir).cache_file
39
+ endf
40
+
41
+ fu! ctrlp#utils#readfile(file)
42
+ if filereadable(a:file)
43
+ let data = readfile(a:file)
44
+ if empty(data) || type(data) != 3
45
+ unl data
46
+ let data = []
47
+ en
48
+ retu data
49
+ en
50
+ retu []
51
+ endf
52
+
53
+ fu! ctrlp#utils#mkdir(dir)
54
+ if exists('*mkdir') && !isdirectory(a:dir)
55
+ sil! cal mkdir(a:dir, 'p')
56
+ en
57
+ retu a:dir
58
+ endf
59
+
60
+ fu! ctrlp#utils#writecache(lines, ...)
61
+ if isdirectory(ctrlp#utils#mkdir(a:0 ? a:1 : s:cache_dir))
62
+ sil! cal writefile(a:lines, a:0 >= 2 ? a:2 : ctrlp#utils#cachefile())
63
+ en
64
+ endf
65
+
66
+ fu! ctrlp#utils#glob(...)
67
+ let cond = v:version > 702 || ( v:version == 702 && has('patch051') )
68
+ retu call('glob', cond ? a:000 : [a:1])
69
+ endf
70
+ "}}}
71
+
72
+ " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2