Mercurial > ec-dotfiles
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 |
