neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

bufonly.vim (2022B)


      1 " BufOnly.vim  -  Delete all the buffers except the current/named buffer.
      2 "
      3 "
      4 " Copyright November 2003 by Christian J. Robinson <infynity@onewest.net>
      5 "
      6 " Distributed under the terms of the Vim license.  See ":help license".
      7 "
      8 " Usage:
      9 "
     10 " :Bonly / :BOnly / :Bufonly / :BufOnly [buffer]
     11 "
     12 " Without any arguments the current buffer is kept.  With an argument the
     13 " buffer name/number supplied is kept.
     14 
     15 if exists('g:BufonlyLoaded') || &cp
     16   finish
     17 end
     18 let g:BufonlyLoaded = 1
     19 
     20 command! -nargs=? -complete=buffer -bang Bonly
     21     \ :call BufOnly('<args>', '<bang>')
     22 command! -nargs=? -complete=buffer -bang BOnly
     23     \ :call BufOnly('<args>', '<bang>')
     24 command! -nargs=? -complete=buffer -bang Bufonly
     25     \ :call BufOnly('<args>', '<bang>')
     26 command! -nargs=? -complete=buffer -bang BufOnly
     27     \ :call BufOnly('<args>', '<bang>')
     28 
     29 function! BufOnly(buffer, bang)
     30 	if a:buffer == ''
     31 		" No buffer provided, use the current buffer.
     32 		let buffer = bufnr('%')
     33 	elseif (a:buffer + 0) > 0
     34 		" A buffer number was provided.
     35 		let buffer = bufnr(a:buffer + 0)
     36 	else
     37 		" A buffer name was provided.
     38 		let buffer = bufnr(a:buffer)
     39 	endif
     40 
     41 	if buffer == -1
     42 		echohl ErrorMsg
     43 		echomsg "No matching buffer for" a:buffer
     44 		echohl None
     45 		return
     46 	endif
     47 
     48 	let last_buffer = bufnr('$')
     49 
     50 	let delete_count = 0
     51 	let n = 1
     52 	while n <= last_buffer
     53 		if n != buffer && buflisted(n)
     54 			if a:bang == '' && getbufvar(n, '&modified')
     55 				echohl ErrorMsg
     56 				echomsg 'No write since last change for buffer'
     57 							\ n '(add ! to override)'
     58 				echohl None
     59 			else
     60 				silent exe 'bdel' . a:bang . ' ' . n
     61 				if ! buflisted(n)
     62 					let delete_count = delete_count+1
     63 				endif
     64 			endif
     65 		endif
     66 		let n = n+1
     67 	endwhile
     68 
     69 	if delete_count == 1
     70 		echomsg delete_count "buffer deleted"
     71 	elseif delete_count > 1
     72 		echomsg delete_count "buffers deleted"
     73 	endif
     74 
     75 endfunction
     76 
     77 lua << EOF
     78   vim.keymap.set('n', '<leader>bo', '<cmd>BufOnly<cr>', {desc = 'Buffer Only'})
     79   vim.keymap.set('n', '<leader>bO', '<cmd>BufOnly!<cr>', {desc = 'Buffer Force Only'})
     80 EOF