patch 9.1.1323: b:undo_ftplugin not executed when re-using buffer Commit: https://github.com/vim/vim/commit/baa8c90cc0d214e036a3a7980d5cf95cae88a68d Author: Christian Brabandt <c...@256bit.org> Date: Sat Apr 19 11:14:11 2025 +0200
patch 9.1.1323: b:undo_ftplugin not executed when re-using buffer Problem: b:undo_ftplugin not executed when re-using buffer (archy3) Solution: explicitly execute b:undo_ftplugin in buflist_new() when re-using the current buffer fixes: #17113 closes: #17133 Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/buffer.c b/src/buffer.c index eed3e8de1..0624f9dce 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -72,6 +72,20 @@ static int buf_free_count = 0; static int top_file_num = 1; // highest file number static garray_T buf_reuse = GA_EMPTY; // file numbers to recycle + static void +trigger_undo_ftplugin(buf_T *buf, win_T *win) +{ + window_layout_lock(); + buf->b_locked++; + win->w_locked = TRUE; + // b:undo_ftplugin may be set, undo it + do_cmdline_cmd((char_u*)"if exists('b:undo_ftplugin') | :legacy :exe \ + b:undo_ftplugin | endif"); + buf->b_locked--; + win->w_locked = FALSE; + window_layout_unlock(); +} + /* * Calculate the percentage that `part` is of the `whole`. */ @@ -2206,6 +2220,7 @@ buflist_new( if ((flags & BLN_CURBUF) && curbuf_reusable()) { buf = curbuf; + trigger_undo_ftplugin(buf, curwin); // It's like this buffer is deleted. Watch out for autocommands that // change curbuf! If that happens, allocate a new buffer anyway. buf_freeall(buf, BFA_WIPE | BFA_DEL); diff --git a/src/proto/window.pro b/src/proto/window.pro index ccb69efd3..d92a5af48 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -1,4 +1,6 @@ /* window.c */ +void window_layout_lock(void); +void window_layout_unlock(void); int window_layout_locked(enum CMD_index cmd); int check_can_set_curbuf_disabled(void); int check_can_set_curbuf_forceit(int forceit); diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 6ec55aeb0..1411559aa 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -1131,6 +1131,34 @@ func Test_filetype_indent_off() close endfunc +func Test_undo_ftplugin_on_buffer_reuse() + filetype on + + new + let b:undo_ftplugin = ":let g:var='exists'" + let g:bufnr = bufnr('%') + " no changes done to the buffer, so the buffer will be re-used + e $VIMRUNTIME/defaults.vim + call assert_equal(g:bufnr, bufnr('%')) + call assert_equal('exists', get(g:, 'var', 'fail')) + unlet! g:bufnr g:var + + " try to wipe the buffer + enew + bw defaults.vim + let b:undo_ftplugin = ':bw' + call assert_fails(':e $VIMRUNTIME/defaults.vim', 'E937') + + " try to split the window + enew + bw defaults.vim + let b:undo_ftplugin = ':sp $VIMRUNTIME/defaults.vim' + call assert_fails(':e $VIMRUNTIME/defaults.vim', 'E242') + + bwipe! + filetype off +endfunc + """"""""""""""""""""""""""""""""""""""""""""""""" " Tests for specific extensions and filetypes. " Keep sorted. diff --git a/src/version.c b/src/version.c index 4990e4475..db77e4538 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1323, /**/ 1322, /**/ diff --git a/src/window.c b/src/window.c index 21f81e5fc..9ea68107c 100644 --- a/src/window.c +++ b/src/window.c @@ -97,14 +97,14 @@ static int close_disallowed = 0; * make sure the previously selected window is still there. * Must be matched with exactly one call to window_layout_unlock()! */ - static void + void window_layout_lock(void) { ++split_disallowed; ++close_disallowed; } - static void + void window_layout_unlock(void) { --split_disallowed; -- -- 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 --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1u64WR-00CIKd-VY%40256bit.org.