"============================================================================= " File: qnamebuf.vim " Author: batman900 " Last Change: 5/12/2011 " Version: 0.07 if v:version < 700 finish endif if exists("g:qnamebuf_loaded") && g:qnamebuf_loaded finish endif let g:qnamebuf_loaded = 1 if !exists("g:qnamebuf_hotkey") || g:qnamebuf_hotkey == "" let g:qnamebuf_hotkey = "" endif if !hasmapto('QNameBufInit') exe "nmap " g:qnamebuf_hotkey ":call QNameBufInit(0, 0, 1, 0):~" endif let s:qnamebuf_hotkey = eval('"\'.g:qnamebuf_hotkey.'"') let s:modified_string = '[+]' let g:qnamebuf_unlisted = 0 function! QNameBufInit(regexp, ...) let s:fileName = (a:0 > 1) ? a:2 : 1 let s:unlisted = g:qnamebuf_unlisted let name_arr = s:QNameBufParseLs() call QNamePickerStart(name_arr, { \ "render_func": function("QNameBufRender"), \ "complete_func": function("QNameBufCompletion"), \ "modifiers": ["l", "d", "c", "\", "\", "\", "\"], \ "modifier_func": function("QNameBufModifier"), \ "acceptors": ["v", "s", "t", "\", "\", "\", "\", "\", "\"], \ "cancelors": ["g", "\"], \ "regexp": a:regexp, \ "use_leader": (a:0 > 2) ? a:3 : 0, \ "height": (a:0 > 0) ? a:1 : 0, \}) endfunction function! QNameBufModifier(index, key) if a:key == "l" || a:key == "\" let s:unlisted = 1 - s:unlisted elseif a:key == "d" || a:key == "\" || a:key == "\" && a:index >= 0 exe 'bd ' . g:cmd_arr[a:index]['bno'] elseif a:key == "c" || a:key == "\" && a:index >= 0 call s:closewindow(g:cmd_arr[a:index]['bno']) endif return s:QNameBufParseLs() endfunction function! QNameBufCompletion(index, key) if a:key == "v" || a:key == "\" || a:key == "\" vert split elseif a:key == "s" || a:key == "\" || a:key == "\" split elseif a:key == "t" || a:key == "\" || a:key == "\" tab split endif call s:swb(g:cmd_arr[a:index]['bno']) unlet g:cmd_arr endfunction function! QNameBufRender(index, count, len, columnar) let rel_len_len = len(a:len) let rel_len_fill = repeat(' ', rel_len_len - len(a:count) + 1) let item = g:cmd_arr[a:index] let name = item['name'] if a:columnar return a:count . rel_len_fill . name else let name_fill = repeat(' ', s:len_longest_name - len(name) + 1) let modified_fill = repeat(' ', len(s:modified_string) - len(item['modified'])) let type = len(item['type']) ? item['type'] : ' ' return a:count . type . rel_len_fill . name . name_fill \ . ' ' . item['modified'] . modified_fill \ . ' <' . item['bno'] . '> ' . item['path'] endif endfunction function! s:QNameBufParseLs() let _y = @y redir @y | silent ls! | redir END let g:cmd_arr = [] let name_arr = [] let s:len_longest_name = 0 let i = 1 for _line in split(@y, "\n") if s:unlisted && _line[3] == "u" && (_line[6] != "-" || _line[5] != " ") \ || !s:unlisted && _line[3] != "u" let _bno = matchstr(_line, '^ *\zs\d*')+0 let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g') if _fname == "" let _fname = "|".matchstr(_line, '"\[\zs[^\]]*')."|" endif let _moreinfo = "" if s:unlisted let _moreinfo = substitute(_line[5], "[ah]", s:modified_string, "") else let _moreinfo = substitute(_line[7], "+", s:modified_string, "") endif if _bno == bufnr('') let _type = '%' elseif bufwinnr(str2nr(_bno)) > 0 let _type = '=' elseif _bno == bufnr('#') let _type = '#' else let _type = ' ' endif let _tname = fnamemodify(_fname,":t") let _path = fnamemodify(_fname,":~:.:h") let _name = s:fileName ? _tname : _path . '/' . _tname if len(_name) > s:len_longest_name let s:len_longest_name = len(_name) endif call add(name_arr, _name) call add(g:cmd_arr, {"bno": _bno, "type": _type, "modified": _moreinfo, "name": _name, "path": _path}) let i = i + 1 endif endfor let @y = _y return name_arr endfunction function! s:closewindow(bno) if bufwinnr(a:bno) != -1 exe bufwinnr(a:bno) . "winc w|close" endif endfunc function! s:swb(bno) if bufwinnr(a:bno) == -1 exe "hid b" a:bno else exe bufwinnr(a:bno) . "winc w" endif endfunc