I have a plugin that wants to manage a group of related buffers, and
when one is unloaded they all should be. And if that is all the buffers
there are, vim should exit. So I implemented a BufUnload autocommand
that would unload all the related buffers.
I realize that the help for BufUnload says not to change to another
buffer. Still, I found a method that worked in many versions of vim
over time. But sometime between 7.3.363 and 7.3.547, it started
crashing. You can reproduce with this test.vim:
set nohidden
au! BufUnload * call Unload()
function Unload()
" unload the related buffers; switching to a new buffer
" first made this work in older versions of vim
new
bunload 1
bunload 2
q
endfunction
Then run "vi -o f1 f2", ":source test.vim", and ":q". In 7.3.547, this
seg faults with this backtrace:
#0 ml_get_buf (buf=0x0, lnum=1, will_change=0) at memline.c:2429
#1 0x00000000004cc060 in plines_win_nofold (wp=0x8fcab0, lnum=<optimized out>)
at misc1.c:1911
#2 0x00000000004cc175 in plines_win_nofill (winheight=1, lnum=1, wp=0x8fcab0)
at misc1.c:1892
#3 plines_win_nofill (wp=0x8fcab0, lnum=1, winheight=1) at misc1.c:1869
#4 0x00000000004dfa4a in curs_rows (wp=0x8fcab0, do_botline=<optimized out>)
at move.c:747
#5 curs_columns (may_scroll=1) at move.c:953
#6 0x000000000058e385 in main_loop (cmdwin=0, noexmode=0) at main.c:1192
#7 0x000000000042d0ca in main (argc=<optimized out>, argv=<optimized out>)
at main.c:1001
memline.c:2429 is
if (lnum > buf->b_ml.ml_line_count) /* invalid line number */
buf is NUL.
In earlier vims, it would exit as desired.
Is there a safe way to do what I want?
Andrew
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php