changeset 29867:6eaef7375f17 v9.0.0272

patch 9.0.0272: BufReadCmd not triggered when loading a "nofile" buffer Commit: https://github.com/vim/vim/commit/b1d2c8116cb5577961ea109651fb888b5e58265f Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 26 11:55:01 2022 +0100 patch 9.0.0272: BufReadCmd not triggered when loading a "nofile" buffer Problem: BufReadCmd not triggered when loading a "nofile" buffer. (Maxim Kim) Solution: Call readfile() but bail out before reading a file. (closes #10983)
author Bram Moolenaar <Bram@vim.org>
date Fri, 26 Aug 2022 13:00:04 +0200
parents 607385b95bf7
children 6ab2c61291ac
files src/buffer.c src/fileio.c src/testdir/test_autocmd.vim src/version.c src/vim.h
diffstat 5 files changed, 26 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -167,8 +167,9 @@ buffer_ensure_loaded(buf_T *buf)
 open_buffer(
     int		read_stdin,	    // read file from stdin
     exarg_T	*eap,		    // for forced 'ff' and 'fenc' or NULL
-    int		flags)		    // extra flags for readfile()
+    int		flags_arg)	    // extra flags for readfile()
 {
+    int		flags = flags_arg;
     int		retval = OK;
     bufref_T	old_curbuf;
 #ifdef FEAT_SYN_HL
@@ -220,10 +221,13 @@ open_buffer(
     // mark cursor position as being invalid
     curwin->w_valid = 0;
 
+    // A buffer without an actual file should not use the buffer name to read a
+    // file.
+    if (bt_quickfix(curbuf) || bt_nofilename(curbuf))
+	flags |= READ_NOFILE;
+
     // Read the file if there is one.
     if (curbuf->b_ffname != NULL
-	    && !bt_quickfix(curbuf)
-	    && !bt_nofilename(curbuf)
 #ifdef FEAT_NETBEANS_INTG
 	    && netbeansReadFile
 #endif
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -108,6 +108,7 @@ filemess(
  * READ_STDIN	read from stdin instead of a file
  * READ_BUFFER	read from curbuf instead of a file (converting after reading
  *		stdin)
+ * READ_NOFILE	do not read a file, only trigger BufReadCmd
  * READ_DUMMY	read into a dummy buffer (to check if file contents changed)
  * READ_KEEP_UNDO  don't clear undo info or read it from a file
  * READ_FIFO	read from fifo/socket instead of a file
@@ -309,6 +310,9 @@ readfile(
 #endif
 
 	curbuf->b_op_start = orig_start;
+
+	if (flags & READ_NOFILE)
+	    return FAIL;
     }
 
     if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -576,6 +576,18 @@ func Test_BufReadCmdHelpJump()
   au! BufReadCmd
 endfunc
 
+" BufReadCmd is triggered for a "nofile" buffer
+func Test_BufReadCmdNofile()
+  new somefile
+  set buftype=nofile
+  au BufReadCmd somefile call setline(1, 'triggered')
+  edit
+  call assert_equal('triggered', getline(1))
+
+  au! BufReadCmd
+  bwipe!
+endfunc
+
 func Test_augroup_deleted()
   " This caused a crash before E936 was introduced
   augroup x
--- a/src/version.c
+++ b/src/version.c
@@ -724,6 +724,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    272,
+/**/
     271,
 /**/
     270,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1006,6 +1006,7 @@ extern int (*dyn_libintl_wputenv)(const 
 #define READ_KEEP_UNDO	0x20	// keep undo info
 #define READ_FIFO	0x40	// read from fifo or socket
 #define READ_NOWINENTER 0x80	// do not trigger BufWinEnter
+#define READ_NOFILE	0x100	// do not read a file, do trigger BufReadCmd
 
 // Values for change_indent()
 #define INDENT_SET	1	// set indent