]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1323: b:undo_ftplugin not executed when re-using buffer v9.1.1323
authorChristian Brabandt <cb@256bit.org>
Sat, 19 Apr 2025 09:14:11 +0000 (11:14 +0200)
committerChristian Brabandt <cb@256bit.org>
Sat, 19 Apr 2025 09:14:11 +0000 (11:14 +0200)
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 <cb@256bit.org>
src/buffer.c
src/proto/window.pro
src/testdir/test_filetype.vim
src/version.c
src/window.c

index eed3e8de13f5339e8d0787a3abb32c4a7ef49178..0624f9dceda694b4aa1c9fc8a5763615fa7e7afd 100644 (file)
@@ -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);
index ccb69efd3a1c326159814304848a07d0678f865e..d92a5af488e96849d38ff13a4bb4bdb69c26c01e 100644 (file)
@@ -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);
index 6ec55aeb06b10180ddf3e2b8e928f938f42e6eee..1411559aaf6b9e82b84799d165e4c806091d7df3 100644 (file)
@@ -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.
index 4990e4475ccb4c64308d5d526bf9a7aee3ceb31a..db77e4538f5537645f2c37ef731454559608f5bb 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1323,
 /**/
     1322,
 /**/
index 21f81e5fc041ee216cd95ddefe0b7fd88bac4c4b..9ea68107c74ac778031bd3378a86c7a6e50bfa2d 100644 (file)
@@ -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;