vimfiles/plugin/qnamebuf.vim

144 lines
4.0 KiB
VimL

"=============================================================================
" File: qnamebuf.vim
" Author: batman900 <batman900+vim@gmail.com>
" 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 = "<F4>"
endif
if !hasmapto('QNameBufInit')
exe "nmap <unique>" g:qnamebuf_hotkey ":call QNameBufInit(0, 0, 1, 0)<cr>:~"
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", "\<M-l>", "\<M-d>", "\<M-c>"],
\ "modifier_func": function("QNameBufModifier"),
\ "acceptors": ["v", "s", "t", "\<M-v>", "\<M-s>", "\<M-t>"],
\ "cancelors": ["g", "\<C-g>", s:qnamebuf_hotkey],
\ "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 == "\<M-l>"
let s:unlisted = 1 - s:unlisted
elseif a:key == "d" || a:key == "\<M-d>" && a:index >= 0
exe 'bd ' . g:cmd_arr[a:index]['bno']
elseif a:key == "c" || a:key == "\<M-c>" && 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 == "\<M-v>"
vert split
elseif a:key == "s" || a:key == "\<M-s>"
split
elseif a:key == "t" || a:key == "\<M-t>"
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