+++ /dev/null
-if !exists("g:qname_hotkey") || g:qname_hotkey == ""
- let g:qname_hotkey = "<F3>"
-endif
-exe "nmap" g:qname_hotkey ":cal QNameInit(1)<cr>:~"
-let s:qname_hotkey = eval('"\'.g:qname_hotkey.'"')
-
-if exists("g:qname_loaded") && g:qname_loaded
- finish
-endif
-let g:qname_loaded = 1
-
-function! QNameRun()
- cal s:colPrinter.print()
- echo "\rMatch" len(s:n)."/".len(s:ls) "names:" s:inp
- call inputsave()
- let _key = getchar()
- if !type(_key)
- let _key = nr2char(_key)
- endif
-
- if _key == "\<BS>"
- let s:inp = s:inp[:-2]
- elseif strlen(_key) == 1 && char2nr(_key) > 31
- let s:inp = s:inp._key
- endif
- if _key == "\<ESC>" || _key == "\<CR>"
- let _sel = s:colPrinter.sel
- if _key == "\<CR>" && _sel < len(s:n) && _sel >= 0
- call s:swb(matchstr(s:s[_sel], '<\zs\d\+\ze>'),"")
- endif
- cal QNameInit(0)
- elseif _key == "\<Up>"
- cal s:colPrinter.vert(-1)
- elseif _key == "\<Down>"
- cal s:colPrinter.vert(1)
- elseif _key == "\<Left>"
- cal s:colPrinter.horz(-1)
- elseif _key == "\<Right>"
- cal s:colPrinter.horz(1)
- elseif _key == s:qname_hotkey
- cal QNameInit(0)
- else
- cal s:build()
- endif
- redraws
- call inputrestore()
-endfunc
-
-function! QNameInit(start)
- if a:start
- cmap ~ cal QNameRun()<CR>:~
- let s:pro = "Prompt: "
- let s:cmdh = &cmdheight
- if a:start != -1
- let s:inp = ""
- endif
- call s:baselist()
- call s:build()
- exe "set cmdheight=".(s:colPrinter.trow+1)
- else
- cmap ~ exe "cunmap \x7E"<cr>
- exe "set cmdheight=".s:cmdh
- endif
-endfunc
-
-function! s:build()
- let s:s = []
- let s:n = []
- let s:blen = 0
- let _cmp = tolower(tr(s:inp, '\', '/'))
- for _line in s:ls
- let _name = matchstr(_line, '^.\{-}\ze \+<')
- if s:fmatch(tolower(_name), _cmp)
- cal add(s:s, _line)
- cal add(s:n, _name)
- endif
- endfor
- if len(s:n) > s:colPrinter.trow
- cal s:colPrinter.put(s:n)
- else
- cal s:colPrinter.put(s:s)
- endif
-endfunc
-
-function! s:swb(bno,mod)
- if bufwinnr(a:bno) == -1
- exe "hid b".a:mod a:bno
- else
- exe bufwinnr(a:bno) . "winc w"
- endif
-endfunc
-
-function! s:fmatch(src,pat)
- let _si = strlen(a:src)-1
- let _pi = strlen(a:pat)-1
- while _si>=0 && _pi>=0
- if a:src[_si] == a:pat[_pi]
- let _pi -= 1
- endif
- let _si -= 1
- endwhile
- return _pi < 0
-endfunc
-
-function! s:baselist()
- let s:ls = []
- redir @y | silent ls! | redir END
- for _line in split(@y,"\n")
- if _line[3]!='u' || _line[6]!='-'
- let _bno = matchstr(_line, '^ *\zs\d*')+0
- let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g')
- if _fname == ""
- let _fname = "\xA0".matchstr(_line, '"\zs[^"]*')
- endif
- let _name = fnamemodify(_fname,":t")
- cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":h"))
- endif
- endfor
- let _align = max(map(copy(s:ls),'stridx(v:val,">")'))
- call map(s:ls, 'substitute(v:val, " <", repeat(" ",_align-stridx(v:val,">"))." <", "")')
- cal sort(s:ls, 1)
-endfunc
-
-let s:colPrinter = {"trow": 4}
-function! s:colPrinter.put(its) dict
- let _cols = []
- let _trow = self.trow
-
- let _its = copy(a:its)
- let _len = len(_its)
- let _i = 0
- while _i < _len
- if _i+_trow <= _len
- cal add(_cols, remove(_its,0,_trow-1))
- else
- cal add(_cols, _its)
- endif
- let _i += _trow
- endwhile
-
- let _cpos = [0]
- let _cw = []
- let _t = 0
- for _li in _cols
- let _w = max(map(copy(_li),'strlen(v:val)'))+4
- let _t += _w
- cal add(_cpos,_t)
- cal add(_cw,_w)
- endfor
-
- let _rows = []
- for _i in range(_trow)
- let _row = []
- for _j in range(len(_cols))
- if _j*_trow+_i < _len
- cal add(_row,_cols[_j][_i])
- endif
- endfor
- cal add(_rows, _row)
- endfor
-
- let self.cols = _cols
- let self.cw = _cw
- let self.rows = _rows
- let self.cpos = _cpos
- let self.len = _len
- let self.lcol = 0
- let self.sel = 0
-endfunc
-
-function! s:colPrinter.horz(mv) dict
- let _t = self.sel + a:mv*self.trow
- if _t >= 0 && _t < self.len
- let self.sel = _t
- endif
-endfunc
-
-function! s:colPrinter.vert(mv) dict
- let _t = self.sel + a:mv
- let _len = self.len
- if _t < 0 && _len > 0
- let self.sel = _len-1
- elseif _t >= _len
- let self.sel = 0
- else
- let self.sel = _t
- endif
-endfunc
-
-function! s:colPrinter.print() dict
- let _len = self.len
- let _trow = self.trow
- if !_len
- echo " [...NO MATCH...]" repeat("\n",_trow)
- return
- endif
- let _sel = self.sel
- let _t = _sel/_trow
- let _cpos = self.cpos
- let _lcol = self.lcol
- let _tcol = &columns
- if _cpos[_lcol]+_tcol < _cpos[_t+1]
- let _rcol = _t
- let _pos = _cpos[_t+1]-_tcol-2
- while _cpos[_lcol] < _pos
- let _lcol += 1
- endwhile
- let _lcol -= _lcol > _t
- else
- if _t < _lcol
- let _lcol = _t
- endif
- let _rcol = len(_cpos)-1
- let _pos = _cpos[_lcol]+_tcol+2
- while _cpos[_rcol] > _pos
- let _rcol -= 1
- endwhile
- let _rcol -= _rcol > _lcol
- endif
- let _cw = self.cw
- let _pos = _cpos[_lcol]+_tcol
- let self.lcol = _lcol
- for _i in range(_trow)
- let _row = self.rows[_i]
- for _j in range(_lcol,_rcol)
- if _j*_trow+_i < _len
- let _txt = " " . _row[_j]
- let _txt .= repeat(" ", _cw[_j] - strlen(_txt))
- let _txt = _txt[:_pos-_cpos[_j]-2]
- if _j*_trow + _i == _sel
- echoh Search|echon _txt|echoh None
- else
- echon _txt
- endif
- endif
- endfor
- echon "\n"
- endfor
-endfunc