summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-08-26 11:55:01 +0100
committerBram Moolenaar <Bram@vim.org>2022-08-26 11:55:01 +0100
commitb1d2c8116cb5577961ea109651fb888b5e58265f (patch)
tree3cca94a88929fc31a58d1965da471e7b1e8050a2
parent9b7d2a959646560f5770329f4428c4739eed4656 (diff)
downloadvim-git-b1d2c8116cb5577961ea109651fb888b5e58265f.tar.gz
patch 9.0.0272: BufReadCmd not triggered when loading a "nofile" bufferv9.0.0272
Problem: BufReadCmd not triggered when loading a "nofile" buffer. (Maxim Kim) Solution: Call readfile() but bail out before reading a file. (closes #10983)
-rw-r--r--src/buffer.c10
-rw-r--r--src/fileio.c4
-rw-r--r--src/testdir/test_autocmd.vim12
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
5 files changed, 26 insertions, 3 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 728685281..2c8169478 100644
--- 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
diff --git a/src/fileio.c b/src/fileio.c
index 6d063a5ab..1b30e0fed 100644
--- 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)
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 6bbe48c0f..c043a3531 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 59e36e4fa..ff452da1f 100644
--- 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,
diff --git a/src/vim.h b/src/vim.h
index 9445fa2da..05b663237 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1006,6 +1006,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#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