function! overlay#controller(...) if a:0 for [key, act] in items(a:1) exe 'nnoremap ' . key . ' ' . act endfor endif endfunction let s:overlay_count = 1 function! overlay#show(list, actions, ...) let overlay_parent_altbuf = bufnr('#') let overlay_parent = bufnr('%') let options = { \ 'filter' : 1, \ 'use_split' : 0, \ 'auto_act' : 0, \ 'name' : '__overlay__' \ } if a:0 if type(a:1) == type({}) call extend(options, a:1) endif endif if options.name == '__overlay__' let options.name .= s:overlay_count . '__' let s:overlay_count += 1 endif if options.use_split hide noautocmd split endif hide noautocmd enew let b:options = options " let b:overlay_use_split = b:options.use_split let b:overlay_parent = overlay_parent let b:overlay_parent_altbuf = overlay_parent_altbuf setlocal buftype=nofile setlocal bufhidden=hide setlocal noswapfile setlocal nobuflisted setlocal foldmethod=manual setlocal foldcolumn=0 setlocal nospell setlocal modifiable setlocal noreadonly for o in keys(filter(copy(options), 'v:key =~ "^set"')) exe o endfor exe 'file ' . b:options.name 1 call overlay#update(a:list) let old_is = &incsearch set incsearch let old_hls = &hlsearch set hlsearch call overlay#controller(a:actions) endfunction function! overlay#update(list) let line = line('.') % delete call append(0, a:list) $ delete _ exe line if b:options.filter if exists(':Filter') Filter else call feedkeys('/') endif endif if b:options.auto_act if line('$') == 1 call feedkeys("\") endif endif endfunction function! overlay#close() if b:options.use_split let scratch_buf = bufnr('') wincmd q exe 'bwipe ' . scratch_buf else exe 'buffer ' . b:overlay_parent bwipe # if exists('b:overlay_parent_altbuf') \ && buflisted(b:overlay_parent_altbuf) exe 'buffer ' . b:overlay_parent_altbuf silent! buffer # endif endif endfunction function! overlay#select_line() let line = getline('.') call overlay#close() return line endfunction function! overlay#select_buffer() let lines = getline(1,'$') call overlay#close() return lines endfunction function! overlay#command(cmd, actions, options) call overlay#show(vimple#redir(a:cmd), a:actions, a:options) endfunction