comparison vendor/vim-packs/ctrlp.vim/autoload/ctrlp/undo.vim @ 707:4576f1471f53

[update-vendor, vim] add ctrlp
author nanaya <me@nanaya.net>
date Sun, 18 Dec 2022 22:27:56 +0900
parents
children
comparison
equal deleted inserted replaced
706:4b30df382167 707:4576f1471f53
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