1 if !exists("g:qname_hotkey") || g:qname_hotkey == ""
2 let g:qname_hotkey = "<F3>"
4 exe "nmap" g:qname_hotkey ":cal QNameInit(1)<cr>:~"
5 let s:qname_hotkey = eval('"\'.g:qname_hotkey.'"')
7 if exists("g:qname_loaded") && g:qname_loaded
10 let g:qname_loaded = 1
13 cal s:colPrinter.print()
14 echo "\rMatch" len(s:n)."/".len(s:ls) "names:" s:inp
18 let _key = nr2char(_key)
22 let s:inp = s:inp[:-2]
23 elseif strlen(_key) == 1 && char2nr(_key) > 31
24 let s:inp = s:inp._key
26 if _key == "\<ESC>" || _key == "\<CR>"
27 let _sel = s:colPrinter.sel
28 if _key == "\<CR>" && _sel < len(s:n) && _sel >= 0
29 call s:swb(matchstr(s:s[_sel], '<\zs\d\+\ze>'),"")
32 elseif _key == "\<Up>"
33 cal s:colPrinter.vert(-1)
34 elseif _key == "\<Down>"
35 cal s:colPrinter.vert(1)
36 elseif _key == "\<Left>"
37 cal s:colPrinter.horz(-1)
38 elseif _key == "\<Right>"
39 cal s:colPrinter.horz(1)
40 elseif _key == s:qname_hotkey
49 function! QNameInit(start)
51 cmap ~ cal QNameRun()<CR>:~
52 let s:pro = "Prompt: "
53 let s:cmdh = &cmdheight
59 exe "set cmdheight=".(s:colPrinter.trow+1)
61 cmap ~ exe "cunmap \x7E"<cr>
62 exe "set cmdheight=".s:cmdh
70 let _cmp = tolower(tr(s:inp, '\', '/'))
72 let _name = matchstr(_line, '^.\{-}\ze \+<')
73 if s:fmatch(tolower(_name), _cmp)
78 if len(s:n) > s:colPrinter.trow
79 cal s:colPrinter.put(s:n)
81 cal s:colPrinter.put(s:s)
85 function! s:swb(bno,mod)
86 if bufwinnr(a:bno) == -1
87 exe "hid b".a:mod a:bno
89 exe bufwinnr(a:bno) . "winc w"
93 function! s:fmatch(src,pat)
94 let _si = strlen(a:src)-1
95 let _pi = strlen(a:pat)-1
96 while _si>=0 && _pi>=0
97 if a:src[_si] == a:pat[_pi]
105 function! s:baselist()
107 redir @y | silent ls! | redir END
108 for _line in split(@y,"\n")
109 if _line[3]!='u' || _line[6]!='-'
110 let _bno = matchstr(_line, '^ *\zs\d*')+0
111 let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g')
113 let _fname = "\xA0".matchstr(_line, '"\zs[^"]*')
115 let _name = fnamemodify(_fname,":t")
116 cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":h"))
119 let _align = max(map(copy(s:ls),'stridx(v:val,">")'))
120 call map(s:ls, 'substitute(v:val, " <", repeat(" ",_align-stridx(v:val,">"))." <", "")')
124 let s:colPrinter = {"trow": 4}
125 function! s:colPrinter.put(its) dict
127 let _trow = self.trow
129 let _its = copy(a:its)
134 cal add(_cols, remove(_its,0,_trow-1))
145 let _w = max(map(copy(_li),'strlen(v:val)'))+4
152 for _i in range(_trow)
154 for _j in range(len(_cols))
155 if _j*_trow+_i < _len
156 cal add(_row,_cols[_j][_i])
162 let self.cols = _cols
164 let self.rows = _rows
165 let self.cpos = _cpos
171 function! s:colPrinter.horz(mv) dict
172 let _t = self.sel + a:mv*self.trow
173 if _t >= 0 && _t < self.len
178 function! s:colPrinter.vert(mv) dict
179 let _t = self.sel + a:mv
181 if _t < 0 && _len > 0
182 let self.sel = _len-1
190 function! s:colPrinter.print() dict
192 let _trow = self.trow
194 echo " [...NO MATCH...]" repeat("\n",_trow)
199 let _cpos = self.cpos
200 let _lcol = self.lcol
202 if _cpos[_lcol]+_tcol < _cpos[_t+1]
204 let _pos = _cpos[_t+1]-_tcol-2
205 while _cpos[_lcol] < _pos
208 let _lcol -= _lcol > _t
213 let _rcol = len(_cpos)-1
214 let _pos = _cpos[_lcol]+_tcol+2
215 while _cpos[_rcol] > _pos
218 let _rcol -= _rcol > _lcol
221 let _pos = _cpos[_lcol]+_tcol
222 let self.lcol = _lcol
223 for _i in range(_trow)
224 let _row = self.rows[_i]
225 for _j in range(_lcol,_rcol)
226 if _j*_trow+_i < _len
227 let _txt = " " . _row[_j]
228 let _txt .= repeat(" ", _cw[_j] - strlen(_txt))
229 let _txt = _txt[:_pos-_cpos[_j]-2]
230 if _j*_trow + _i == _sel
231 echoh Search|echon _txt|echoh None