Skip to content

Instantly share code, notes, and snippets.

@adscriven
Last active September 16, 2020 07:55
Show Gist options
  • Save adscriven/281e57fd1116589e1644118d187745de to your computer and use it in GitHub Desktop.
Save adscriven/281e57fd1116589e1644118d187745de to your computer and use it in GitHub Desktop.
" :Recent -- list buffers first, + oldfiles, both in reverse time order
" <CR> opens a file or buffer
" <BS> starts a fuzzy search
" :Delete!, :Delfuzz! keeps lines
" :Delete, :Delfuzz removes lines
" :Delfuzz does a very nomagic search, and replaces white space with \.\*
" It's like the -e (exact) flag for fzf.
" :Delete doesn't use :keeppat because I like to highlight afterwards,
" and move to matches with n.
fun! Delete(l1,l2,bang,fuzz,srch)
let tot = a:l2 - a:l1 + 1
let n = 0
let re = a:srch
if a:fuzz
let re = '\V'.escape(re, '\')
let re = substitute(re, '\s\+', '\\.\\*', 'g')
endif
let re = escape(re, '/')
exe a:l1.','.a:l2.'g'.a:bang.'/'.re.'/d|let n+=1'
exe a:l1
redraw
echo n.'/'.tot.' deleted, '.(tot-n).' remain'
endfun
com! -range=% -bang -nargs=? Delfuzz call Delete(<line1>,<line2>,'<bang>',1,<q-args>)
com! -range=% -bang -nargs=? Delete call Delete(<line1>,<line2>,'<bang>',0,<q-args>)
fun! ListBufsAndOldfiles() abort
enew
execute 'file bufs+old_' . bufnr()
setlocal buftype=nofile noswapfile noundofile bufhidden=wipe
\ nobuflisted
nnoremap <buffer> <bs> :Delfuzz!<space>
nnoremap <buffer> <cr> :<c-u>exe 'keepalt ' . getline('.')<cr>
autocmd! bufenter <buffer> set hlsearch isfname&vim isfname+=32,(,)
execute 'autocmd! bufleave <buffer> set isfname&vim | let &hlsearch=' . &hls
doautocmd bufenter <buffer>
let bufs = filter(getbufinfo({'buflisted':1}), {k,v -> v.name != ''})
call sort(bufs, {a,b -> b.lastused - a.lastused})
let bnames = map(copy(bufs), {k,v->'b ' . fnamemodify(v.name, ':~')})
for name in v:oldfiles
let name = fnamemodify(name, ':~')
if index(bnames, 'b ' . name) == -1
call add(bnames, 'e ' . name)
endif
endfor
put=bnames
1d
redraw
endfun
com! Recent silent call ListBufsAndOldfiles()
" Starting an immediate search is usually quickest for buffers.
" If you don't want this, double-tap <bs> for a fuzzy search.
nno <space>b :<c-u>Recent<cr>/
nno <space>B :<c-u>sp\|Recent<cr>/
nno <space><space>b :<c-u>vsp\|Recent<cr>/
" :Del* commands are generally useful. (g)rep (v)grep
nore <space>g :Delfuzz!<space>
nore <space>v :Delfuzz<space>
nore <space>G :Delete!<space>
nore <space>V :Delete<space>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment