[ADD] conf for archlinux, <init>
[arrow.git] / archlinux_conf / home / .vim / autoload / tlib / World.vim
blobf7328215579a6468c10e0cc61972edb271549ab8
1 " World.vim -- The World prototype for tlib#input#List()
2 " @Author:      Thomas Link (micathom AT gmail com?subject=[vim])
3 " @Website:     http://members.a1.net/t.link/
4 " @License:     GPL (see http://www.gnu.org/licenses/gpl.txt)
5 " @Created:     2007-05-01.
6 " @Last Change: 2008-03-08.
7 " @Revision:    0.1.431
9 " :filedoc:
10 " A prototype used by |tlib#input#List|.
11 " Inherits from |tlib#Object#New|.
14 if &cp || exists("loaded_tlib_world_autoload")
15     finish
16 endif
17 let loaded_tlib_world_autoload = 1
20 let s:prototype = tlib#Object#New({
21             \ '_class': 'World',
22             \ 'name': 'world',
23             \ 'allow_suspend': 1,
24             \ 'base': [], 
25             \ 'bufnr': -1,
26             \ 'display_format': '',
27             \ 'filter': [['']],
28             \ 'filter_format': '',
29             \ 'follow_cursor': '',
30             \ 'index_table': [],
31             \ 'initial_filter': [['']],
32             \ 'initial_index': 1,
33             \ 'initialized': 0,
34             \ 'key_handlers': [],
35             \ 'list': [],
36             \ 'next_state': '',
37             \ 'numeric_chars': tlib#var#Get('tlib_numeric_chars', 'bg'),
38             \ 'offset': 1,
39             \ 'offset_horizontal': 0,
40             \ 'pick_last_item': tlib#var#Get('tlib_pick_last_item', 'bg'),
41             \ 'post_handlers': [],
42             \ 'query': '',
43             \ 'resize': 0,
44             \ 'resize_vertical': 0,
45             \ 'retrieve_eval': '',
46             \ 'return_agent': '',
47             \ 'rv': '',
48             \ 'scratch': '__InputList__',
49             \ 'scratch_filetype': 'tlibInputList',
50             \ 'scratch_vertical': 0,
51             \ 'sel_idx': [],
52             \ 'show_empty': 0,
53             \ 'state': 'display', 
54             \ 'state_handlers': [],
55             \ 'sticky': 0,
56             \ 'timeout': 0,
57             \ 'timeout_resolution': 2,
58             \ 'type': '', 
59             \ 'win_wnr': -1,
60             \ })
61             " \ 'handlers': [],
63 function! tlib#World#New(...)
64     let object = s:prototype.New(a:0 >= 1 ? a:1 : {})
65     return object
66 endf
69 function! s:prototype.Set_display_format(value) dict "{{{3
70     if a:value == 'filename'
71         call self.Set_highlight_filename()
72         let self.display_format = 'world.FormatFilename(%s)'
73     else
74         let self.display_format = a:value
75     endif
76 endf
79 function! s:prototype.Set_highlight_filename() dict "{{{3
80     let self.tlib_UseInputListScratch = 'call world.Highlight_filename()'
81     "             \ 'syntax match TLibMarker /\%>'. (1 + eval(g:tlib_inputlist_width_filename)) .'c |.\{-}| / | hi def link TLibMarker Special'
82     " let self.tlib_UseInputListScratch .= '| syntax match TLibDir /\%>'. (4 + eval(g:tlib_inputlist_width_filename)) .'c\S\{-}[\/].*$/ | hi def link TLibDir Directory'
83 endf
86 function! s:prototype.Highlight_filename() dict "{{{3
87     " exec 'syntax match TLibDir /\%>'. (3 + eval(g:tlib_inputlist_width_filename)) .'c \(\S:\)\?[\/].*$/ contained containedin=TLibMarker'
88     exec 'syntax match TLibDir /\(\a:\|\.\.\..\{-}\)\?[\/][^&<>*|]*$/ contained containedin=TLibMarker'
89     exec 'syntax match TLibMarker /\%>'. (1 + eval(g:tlib_inputlist_width_filename)) .'c |\( \|[[:alnum:]%*+-]*\)| \S.*$/ contains=TLibDir'
90     hi def link TLibMarker Special
91     hi def link TLibDir Directory
92 endf
95 function! s:prototype.FormatFilename(file) dict "{{{3
96     let fname = fnamemodify(a:file, ":p:t")
97     " let fname = fnamemodify(a:file, ":t")
98     " if isdirectory(a:file)
99     "     let fname .='/'
100     " endif
101     let dname = fnamemodify(a:file, ":h")
102     " let dname = pathshorten(fnamemodify(a:file, ":h"))
103     let dnmax = &co - max([eval(g:tlib_inputlist_width_filename), len(fname)]) - 11 - self.index_width - &fdc
104     if len(dname) > dnmax
105         let dname = '...'. strpart(fnamemodify(a:file, ":h"), len(dname) - dnmax)
106     endif
107     let marker = []
108     if g:tlib_inputlist_filename_indicators
109         let bnr = bufnr(a:file)
110         " TLogVAR a:file, bnr, self.bufnr
111         if bnr != -1
112             if bnr == self.bufnr
113                 call add(marker, '%')
114             else
115                 call add(marker, ' ')
116                 " elseif buflisted(a:file)
117                 "     if getbufvar(a:file, "&mod")
118                 "         call add(marker, '+')
119                 "     else
120                 "         call add(marker, 'B')
121                 "     endif
122                 " elseif bufloaded(a:file)
123                 "     call add(marker, 'h')
124                 " else
125                 "     call add(marker, 'u')
126             endif
127         else
128             call add(marker, ' ')
129         endif
130     endif
131     call insert(marker, '|')
132     call add(marker, '|')
133     return printf("%-". eval(g:tlib_inputlist_width_filename) ."s %s %s", fname, join(marker, ''), dname)
134 endf
137 function! s:prototype.GetSelectedItems(current) dict "{{{3
138     if stridx(self.type, 'i') != -1
139         let rv = copy(self.sel_idx)
140     else
141         let rv = map(copy(self.sel_idx), 'self.GetBaseItem(v:val)')
142     endif
143     if a:current != ''
144         let ci = index(rv, a:current)
145         if ci != -1
146             call remove(rv, ci)
147         endif
148         call insert(rv, a:current)
149     endif
150     if stridx(self.type, 'i') != -1
151         if !empty(self.index_table)
152             " TLogVAR rv, self.index_table
153             call map(rv, 'self.index_table[v:val - 1]')
154             " TLogVAR rv
155         endif
156     endif
157     return rv
158 endf
161 function! s:prototype.SelectItem(mode, index) dict "{{{3
162     let bi = self.GetBaseIdx(a:index)
163     " if self.RespondTo('MaySelectItem')
164     "     if !self.MaySelectItem(bi)
165     "         return 0
166     "     endif
167     " endif
168     " TLogVAR bi
169     let si = index(self.sel_idx, bi)
170     " TLogVAR self.sel_idx
171     " TLogVAR si
172     if si == -1
173         call add(self.sel_idx, bi)
174     elseif a:mode == 'toggle'
175         call remove(self.sel_idx, si)
176     endif
177     return 1
178 endf
181 function! s:prototype.FormatArgs(format_string, arg) dict "{{{3
182     let nargs = len(substitute(a:format_string, '%%\|[^%]', '', 'g'))
183     return [a:format_string] + repeat([string(a:arg)], nargs)
184 endf
187 function! s:prototype.GetRx(filter) dict "{{{3
188     return '\('. join(filter(copy(a:filter), 'v:val[0] != "!"'), '\|') .'\)' 
189 endf
192 function! s:prototype.GetRx0(...) dict "{{{3
193     exec tlib#arg#Let(['negative'])
194     let rx0 = []
195     for filter in self.filter
196         " TLogVAR filter
197         let rx = join(reverse(filter(copy(filter), '!empty(v:val)')), '\|')
198         " TLogVAR rx
199         if !empty(rx) && (negative ? rx[0] == g:tlib_inputlist_not : rx[0] != g:tlib_inputlist_not)
200             call add(rx0, rx)
201         endif
202     endfor
203     let rx0s = join(rx0, '\|')
204     if empty(rx0s)
205         return ''
206     else
207         return '\V\('. rx0s .'\)'
208     endif
209 endf
212 function! s:prototype.GetItem(idx) dict "{{{3
213     return self.list[a:idx - 1]
214 endf
217 function! s:prototype.GetListIdx(baseidx) dict "{{{3
218     " if empty(self.index_table)
219         let baseidx = a:baseidx
220     " else
221     "     let baseidx = 0 + self.index_table[a:baseidx - 1]
222     "     " TLogVAR a:baseidx, baseidx, self.index_table 
223     " endif
224     let rv = index(self.table, baseidx)
225     " TLogVAR rv, self.table
226     return rv
227 endf
230 function! s:prototype.GetBaseIdx(idx) dict "{{{3
231     " TLogVAR a:idx, self.table, self.index_table
232     if !empty(self.table) && a:idx > 0 && a:idx <= len(self.table)
233         return self.table[a:idx - 1]
234     else
235         return ''
236     endif
237 endf
240 function! s:prototype.GetBaseItem(idx) dict "{{{3
241     return self.base[a:idx - 1]
242 endf
245 function! s:prototype.SetBaseItem(idx, item) dict "{{{3
246     let self.base[a:idx - 1] = a:item
247 endf
250 function! s:prototype.GetCurrentItem() dict "{{{3
251     let idx = self.prefidx
252     if stridx(self.type, 'i') != -1
253         return idx
254     elseif !empty(self.list)
255         if len(self.list) >= idx
256             return self.list[idx - 1]
257         endif
258     else
259         return ''
260     endif
261 endf
264 function! s:prototype.CurrentItem() dict "{{{3
265     if stridx(self.type, 'i') != -1
266         return self.GetBaseIdx(self.llen == 1 ? 1 : self.prefidx)
267     else
268         if self.llen == 1
269             " TLogVAR self.llen
270             return self.list[0]
271         elseif self.prefidx > 0
272             " TLogVAR self.prefidx
273             return self.GetCurrentItem()
274         endif
275     endif
276 endf
279 function! s:prototype.SetFilter() dict "{{{3
280     " let mrx = '\V'. (a:0 >= 1 && a:1 ? '\C' : '')
281     let mrx = '\V'. self.filter_format
282     let self.filter_pos = []
283     let self.filter_neg = []
284     for filter in self.filter
285         " TLogVAR filter
286         let rx = join(reverse(filter(copy(filter), '!empty(v:val)')), '\|')
287         " TLogVAR rx
288         if rx[0] == g:tlib_inputlist_not
289             if len(rx) > 1
290                 call add(self.filter_neg, mrx .'\('. rx[1:-1] .'\)')
291             endif
292         else
293             call add(self.filter_pos, mrx .'\('. rx .'\)')
294         endif
295     endfor
296 endf
299 function! s:prototype.Match(text, ...) dict "{{{3
300     for rx in self.filter_neg
301         if a:text =~ rx
302             return 0
303         endif
304     endfor
305     for rx in self.filter_pos
306         if a:text !~ rx
307             return 0
308         endif
309     endfor
310     " for filter in self.filter
311     "     " TLogVAR filter
312     "     let rx = join(reverse(filter(copy(filter), '!empty(v:val)')), '\|')
313     "     " TLogVAR rx
314     "     if rx[0] == g:tlib_inputlist_not
315     "         if len(rx) > 1 && a:text =~ mrx .'\('. rx[1:-1] .'\)'
316     "             return 0
317     "         endif
318     "     elseif a:text !~ mrx .'\('. rx .'\)'
319     "         return 0
320     "     endif
321     "     " if a:text !~ mrx. self.GetRx(filter)
322     "     "     return 0
323     "     " endif
324     " endfor
325     return 1
326 endf
329 function! s:prototype.MatchBaseIdx(idx) dict "{{{3
330     let text = self.GetBaseItem(a:idx)
331     if !empty(self.filter_format)
332         let text = eval(call(function("printf"), self.FormatArgs(self.filter_format, text)))
333     endif
334     return self.Match(text)
335 endf
338 function! s:prototype.BuildTable() dict "{{{3
339     call self.SetFilter()
340     let self.table = filter(range(1, len(self.base)), 'self.MatchBaseIdx(v:val)')
341 endf
344 function! s:prototype.ReduceFilter() dict "{{{3
345     " TLogVAR self.filter
346     if self.filter[0] == [''] && len(self.filter) > 1
347         call remove(self.filter, 0)
348     elseif empty(self.filter[0][0]) && len(self.filter[0]) > 1
349         call remove(self.filter[0], 0)
350     else
351         let self.filter[0][0] = self.filter[0][0][0:-2]
352     endif
353 endf
356 function! s:prototype.SetInitialFilter(filter) dict "{{{3
357     " let self.initial_filter = [[''], [a:filter]]
358     let self.initial_filter = [[a:filter]]
359 endf
362 function! s:prototype.PopFilter() dict "{{{3
363     " TLogVAR self.filter
364     if len(self.filter[0]) > 1
365         call remove(self.filter[0], 0)
366     elseif len(self.filter) > 1
367         call remove(self.filter, 0)
368     else
369         let self.filter[0] = ['']
370     endif
371 endf
374 function! s:prototype.FilterIsEmpty() dict "{{{3
375     " TLogVAR self.filter
376     return self.filter == copy(self.initial_filter)
377 endf
380 function! s:prototype.DisplayFilter() dict "{{{3
381     " TLogVAR self.filter
382     let filter1 = map(deepcopy(self.filter), '"(". join(reverse(v:val), " OR ") .")"')
383     " TLogVAR filter1
384     return join(reverse(filter1), ' AND ')
385 endf
388 function! s:prototype.UseScratch() dict "{{{3
389     return tlib#scratch#UseScratch(self)
390 endf
393 function! s:prototype.CloseScratch(...) dict "{{{3
394     TVarArg ['reset_scratch', 0]
395     " TVarArg ['reset_scratch', 1]
396     " TLogVAR reset_scratch
397     return tlib#scratch#CloseScratch(self, reset_scratch)
398 endf
401 function! s:prototype.UseInputListScratch() dict "{{{3
402     let scratch = self.UseScratch()
403     " TLogVAR scratch
404     syntax match InputlListIndex /^\d\+:/
405     syntax match InputlListCursor /^\d\+\* .*$/ contains=InputlListIndex
406     syntax match InputlListSelected /^\d\+# .*$/ contains=InputlListIndex
407     hi def link InputlListIndex Constant
408     hi def link InputlListCursor Search
409     hi def link InputlListSelected IncSearch
410     " exec "au BufEnter <buffer> call tlib#input#Resume(". string(self.name) .")"
411     setlocal nowrap
412     " hi def link InputlListIndex Special
413     " let b:tlibDisplayListMarks = {}
414     let b:tlibDisplayListMarks = []
415     call tlib#hook#Run('tlib_UseInputListScratch', self)
416     return scratch
417 endf
420 " :def: function! s:prototype.Reset(?initial=0)
421 function! s:prototype.Reset(...) dict "{{{3
422     TVarArg ['initial', 0]
423     " TLogVAR initial
424     let self.state     = 'display'
425     let self.offset    = 1
426     let self.filter    = deepcopy(self.initial_filter)
427     let self.idx       = ''
428     let self.prefidx   = 0
429     call self.UseInputListScratch()
430     call self.ResetSelected()
431     call self.Retrieve(!initial)
432     return self
433 endf
436 function! s:prototype.ResetSelected() dict "{{{3
437     let self.sel_idx   = []
438 endf
441 function! s:prototype.Retrieve(anyway) dict "{{{3
442     " TLogVAR a:anyway, self.base
443     " TLogDBG (a:anyway || empty(self.base))
444     if (a:anyway || empty(self.base))
445         let ra = self.retrieve_eval
446         " TLogVAR ra
447         if !empty(ra)
448             let back  = self.SwitchWindow('win')
449             let world = self
450             let self.base = eval(ra)
451             " TLogVAR self.base
452             exec back
453             return 1
454         endif
455     endif
456     return 0
457 endf
460 function! s:prototype.DisplayHelp() dict "{{{3
461     let help = [
462                 \ 'Help:',
463                 \ 'Mouse        ... Pick an item            Letter          ... Filter the list',
464                 \ printf('Number       ... Pick an item            "%s", "%s", %sWORD ... AND, OR, NOT',
465                 \   g:tlib_inputlist_and, g:tlib_inputlist_or, g:tlib_inputlist_not),
466                 \ 'Enter        ... Pick the current item   <bs>, <c-bs>    ... Reduce filter',
467                 \ '<c|m-r>      ... Reset the display       Up/Down         ... Next/previous item',
468                 \ '<c|m-q>      ... Edit top filter string  Page Up/Down    ... Scroll',
469                 \ '<Esc>        ... Abort',
470                 \ ]
472     if self.allow_suspend
473         call add(help,
474                 \ '<c|m-z>      ... Suspend/Resume          <c-o>           ... Switch to origin')
475     endif
477     if stridx(self.type, 'm') != -1
478         let help += [
479                 \ '#, <c-space> ... (Un)Select the current item',
480                 \ '<c|m-a>      ... (Un)Select all currently visible items',
481                 \ '<s-up/down>  ... (Un)Select items',
482                 \ ]
483                     " \ '<c-\>        ... Show only selected',
484     endif
485     for handler in self.key_handlers
486         let key = get(handler, 'key_name', '')
487         if !empty(key)
488             let desc = get(handler, 'help', '')
489             call add(help, printf('%-12s ... %s', key, desc))
490         endif
491     endfor
492     let help += [
493                 \ '',
494                 \ 'Warning:',
495                 \ 'Please don''t resize the window with the mouse.',
496                 \ '',
497                 \ 'Note on filtering:',
498                 \ 'The filter is prepended with "\V". Basically, filtering is case-insensitive.',
499                 \ 'Letters at word boundaries or upper-case lettes in camel-case names is given',
500                 \ 'more weight. If an OR-joined pattern start with "!", matches will be excluded.',
501                 \ '',
502                 \ 'Press any key to continue.',
503                 \ ]
504     norm! ggdG
505     call append(0, help)
506     norm! Gddgg
507     call self.Resize(len(help), 0)
508 endf
511 function! s:prototype.Resize(hsize, vsize) dict "{{{3
512     " TLogVAR self.scratch_vertical, a:hsize, a:vsize
513     if self.scratch_vertical
514         if a:vsize
515             exec 'vert resize '. eval(a:vsize)
516         endif
517     else
518         if a:hsize
519             exec 'resize '. eval(a:hsize)
520         endif
521     endif
522 endf
525 " :def: function! s:prototype.DisplayList(query, ?list)
526 function! s:prototype.DisplayList(query, ...) dict "{{{3
527     " TLogVAR a:query
528     " TLogVAR self.state
529     let list = a:0 >= 1 ? a:1 : []
530     call self.UseScratch()
531     " TLogVAR self.scratch
532     " TAssert IsNotEmpty(self.scratch)
533     if self.state == 'scroll'
534         exec 'norm! '. self.offset .'zt'
535     elseif self.state == 'help'
536         call self.DisplayHelp()
537     else
538         " let ll = len(list)
539         let ll = self.llen
540         " let x  = len(ll) + 1
541         let x  = self.index_width + 1
542         " TLogVAR ll
543         if self.state =~ '\<display\>'
544             let resize = get(self, 'resize', 0)
545             " TLogVAR resize
546             let resize = resize == 0 ? ll : min([ll, resize])
547             let resize = min([resize, (&lines * g:tlib_inputlist_pct / 100)])
548             " TLogVAR resize, ll, &lines
549             call self.Resize(resize, get(self, 'resize_vertical', 0))
550             norm! ggdG
551             let w = winwidth(0) - &fdc
552             " let w = winwidth(0) - &fdc - 1
553             let lines = copy(list)
554             let lines = map(lines, 'printf("%-'. w .'.'. w .'s", substitute(v:val, ''[[:cntrl:][:space:]]'', " ", "g"))')
555             " TLogVAR lines
556             call append(0, lines)
557             norm! Gddgg
558         endif
559         " TLogVAR self.prefidx
560         let base_pref = self.GetBaseIdx(self.prefidx)
561         " TLogVAR base_pref
562         if self.state =~ '\<redisplay\>'
563             call filter(b:tlibDisplayListMarks, 'index(self.sel_idx, v:val) == -1 && v:val != base_pref')
564             " TLogVAR b:tlibDisplayListMarks
565             call map(b:tlibDisplayListMarks, 'self.DisplayListMark(x, v:val, ":")')
566             " let b:tlibDisplayListMarks = map(copy(self.sel_idx), 'self.DisplayListMark(x, v:val, "#")')
567             " call add(b:tlibDisplayListMarks, self.prefidx)
568             " call self.DisplayListMark(x, self.GetBaseIdx(self.prefidx), '*')
569         endif
570         let b:tlibDisplayListMarks = map(copy(self.sel_idx), 'self.DisplayListMark(x, v:val, "#")')
571         call add(b:tlibDisplayListMarks, base_pref)
572         call self.DisplayListMark(x, base_pref, '*')
573         call self.SetOffset()
574         " TLogVAR self.offset
575         " TLogDBG winheight('.')
576         " if self.prefidx > winheight(0)
577             " let lt = len(list) - winheight('.') + 1
578             " if self.offset > lt
579             "     exec 'norm! '. lt .'zt'
580             " else
581                 exec 'norm! '. self.offset .'zt'
582             " endif
583         " else
584         "     norm! 1zt
585         " endif
586         let rx0 = self.GetRx0()
587         " TLogVAR rx0
588         if !empty(g:tlib_inputlist_higroup)
589             if empty(rx0)
590                 match none
591             else
592                 exec 'match '. g:tlib_inputlist_higroup .' /\c'. escape(rx0, '/') .'/'
593             endif
594         endif
595         let query   = a:query
596         let options = []
597         if self.sticky
598             call add(options, 's')
599         endif
600         if !empty(options)
601             let query .= printf(' [%s]', join(options))
602         endif
603         let &statusline = query
604     endif
605     redraw
606 endf
609 function! s:prototype.SetOffset() dict "{{{3
610     " TLogVAR self.prefidx, self.offset
611     " TLogDBG winheight(0)
612     " TLogDBG self.prefidx > self.offset + winheight(0) - 1
613     let listtop = len(self.list) - winheight(0) + 1
614     if listtop < 1
615         let listtop = 1
616     endif
617     if self.prefidx > listtop
618         let self.offset = listtop
619     elseif self.prefidx > self.offset + winheight(0) - 1
620         let listoff = self.prefidx - winheight(0) + 1
621         let self.offset = min([listtop, listoff])
622     "     TLogVAR self.prefidx
623     "     TLogDBG len(self.list)
624     "     TLogDBG winheight(0)
625     "     TLogVAR listtop, listoff, self.offset
626     elseif self.prefidx < self.offset
627         let self.offset = self.prefidx
628     endif
629     " TLogVAR self.offset
630 endf
633 function! s:prototype.DisplayListMark(x, y, mark) dict "{{{3
634     " TLogVAR a:y, a:mark
635     if a:x > 0 && a:y >= 0
636         " TLogDBG a:x .'x'. a:y .' '. a:mark
637         let sy = self.GetListIdx(a:y) + 1
638         " TLogVAR sy
639         if sy >= 1
640             call setpos('.', [0, sy, a:x, 0])
641             exec 'norm! r'. a:mark
642             " exec 'norm! '. a:y .'gg'. a:x .'|r'. a:mark
643         endif
644     endif
645     return a:y
646 endf
649 function! s:prototype.SwitchWindow(where) dict "{{{3
650     let wnr = get(self, a:where.'_wnr')
651     " TLogVAR wnr
652     return tlib#win#Set(wnr)
653 endf
656 function! s:prototype.FollowCursor() dict "{{{3
657     if !empty(self.follow_cursor)
658         let back = self.SwitchWindow('win')
659         " TLogVAR back
660         " TLogDBG winnr()
661         try
662             call call(self.follow_cursor, [self, [self.CurrentItem()]])
663         finally
664             exec back
665         endtry
666     endif
667 endf
670 function! s:prototype.SetOrigin(...) dict "{{{3
671     TVarArg ['winview', 0]
672     let self.win_wnr = winnr()
673     let self.bufnr   = bufnr('%')
674     let self.cursor  = getpos('.')
675     if winview
676         let self.winview = tlib#win#GetLayout()
677     endif
678     return self
679 endf
682 function! s:prototype.RestoreOrigin(...) dict "{{{3
683     TVarArg ['winview', 0]
684     if winview
685         call tlib#win#SetLayout(self.winview)
686     endif
687     " TLogVAR self.win_wnr, self.bufnr, self.cursor
688     if self.win_wnr != winnr()
689         exec self.win_wnr .'wincmd w'
690     endif
691     exec 'buffer! '. self.bufnr
692     call setpos('.', self.cursor)
693 endf