Will use netrw's Explore instead of Lexplore now. Easier to know which split window will take the file. See also: http://vimcasts.org/blog/2013/01/oil-and-vinegar-split-windows-and-project-drawer/
David Blume

David Blume commited on 2021-04-06 17:46:15
Showing 2 changed files, with 21 additions and 15 deletions.

... ...
@@ -1,17 +1,17 @@
1 1
 if exists("g:loaded_bbye") || &cp | finish | endif
2 2
 let g:loaded_bbye = 1
3 3
 
4
-function! s:bdelete(bang, buffer_name)
4
+function! s:bdelete(action, bang, buffer_name)
5 5
 	let buffer = s:str2bufnr(a:buffer_name)
6 6
 	let w:bbye_back = 1
7 7
 
8 8
 	if buffer < 0
9
-		return s:warn("E516: No buffers were deleted. No match for ".a:buffer_name)
9
+		return s:error("E516: No buffers were deleted. No match for ".a:buffer_name)
10 10
 	endif
11 11
 
12 12
 	if getbufvar(buffer, "&modified") && empty(a:bang)
13 13
 		let error = "E89: No write since last change for buffer "
14
-		return s:warn(error . buffer . " (add ! to override)")
14
+		return s:error(error . buffer . " (add ! to override)")
15 15
 	endif
16 16
 
17 17
 	" If the buffer is set to delete and it contains changes, we can't switch
... ...
@@ -45,15 +45,18 @@ function! s:bdelete(bang, buffer_name)
45 45
 
46 46
 	" If it hasn't been already deleted by &bufhidden, end its pains now.
47 47
 	" Unless it previously was an unnamed buffer and :enew returned it again.
48
-	if bufexists(buffer) && buffer != bufnr("%")
49
-		exe "bdelete" . a:bang . " " . buffer
48
+	"
49
+	" Using buflisted() over bufexists() because bufhidden=delete causes the
50
+	" buffer to still _exist_ even though it won't be :bdelete-able.
51
+	if buflisted(buffer) && buffer != bufnr("%")
52
+		exe a:action . a:bang . " " . buffer
50 53
 	endif
51 54
 endfunction
52 55
 
53 56
 function! s:str2bufnr(buffer)
54 57
 	if empty(a:buffer)
55 58
 		return bufnr("%")
56
-	elseif a:buffer =~ '^\d\+$'
59
+	elseif a:buffer =~# '^\d\+$'
57 60
 		return bufnr(str2nr(a:buffer))
58 61
 	else
59 62
 		return bufnr(a:buffer)
... ...
@@ -74,11 +77,15 @@ function! s:new(bang)
74 77
 endfunction
75 78
 
76 79
 " Using the built-in :echoerr prints a stacktrace, which isn't that nice.
77
-function! s:warn(msg)
80
+function! s:error(msg)
78 81
 	echohl ErrorMsg
79 82
 	echomsg a:msg
80 83
 	echohl NONE
84
+	let v:errmsg = a:msg
81 85
 endfunction
82 86
 
83 87
 command! -bang -complete=buffer -nargs=? Bdelete
84
-	\ :call s:bdelete(<q-bang>, <q-args>)
88
+	\ :call s:bdelete("bdelete", <q-bang>, <q-args>)
89
+
90
+command! -bang -complete=buffer -nargs=? Bwipeout
91
+	\ :call s:bdelete("bwipeout", <q-bang>, <q-args>)
... ...
@@ -121,21 +121,20 @@ nmap <leader>p :set invpaste paste?<cr>
121 121
 " Control+p to paste onto next line
122 122
 nmap <C-p> :pu<cr>
123 123
 
124
-" Make netrw's Lexplore behave like NERDTreeToggle
124
+" Make netrw's Explore behave a little like NERDTreeToggle
125
+" http://vimcasts.org/blog/2013/01/oil-and-vinegar-split-windows-and-project-drawer/
125 126
 let g:NetrwIsOpen=0
126 127
 function! ToggleNetrw()
127 128
     if g:NetrwIsOpen
128
-        let i = bufnr("$")
129
-        while (i >= 1)
129
+        for i in range(1, bufnr("$"))
130 130
             if (getbufvar(i, "&filetype") == "netrw")
131
-                silent exe "bwipeout " . i
131
+                silent exe "Bwipeout " . i
132 132
             endif
133
-            let i-=1
134
-        endwhile
133
+        endfor
135 134
         let g:NetrwIsOpen=0
136 135
     else
137 136
         let g:NetrwIsOpen=1
138
-        silent Lexplore %:p:h
137
+        silent Explore %:p:h
139 138
     endif
140 139
 endfunction
141 140
 nmap <leader>e :call ToggleNetrw()<cr>
142 141