diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-08-26 19:04:20 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-08-27 06:12:52 +0800 |
commit | 900a151bf541c7fa77a56b4881c4836a1cabcde6 (patch) | |
tree | 32973768295e652ac35bdc946a7f76d5cefcc0d0 | |
parent | b0e052a8b30ce84221c3f992e111713451633b36 (diff) | |
download | rneovim-900a151bf541c7fa77a56b4881c4836a1cabcde6.tar.gz rneovim-900a151bf541c7fa77a56b4881c4836a1cabcde6.tar.bz2 rneovim-900a151bf541c7fa77a56b4881c4836a1cabcde6.zip |
vim-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 vim/vim#10983)
https://github.com/vim/vim/commit/b1d2c8116cb5577961ea109651fb888b5e58265f
-rw-r--r-- | src/nvim/buffer.c | 13 | ||||
-rw-r--r-- | src/nvim/fileio.c | 5 | ||||
-rw-r--r-- | src/nvim/fileio.h | 1 | ||||
-rw-r--r-- | src/nvim/testdir/test_autocmd.vim | 12 |
4 files changed, 28 insertions, 3 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 24fd1b3022..3211b83dc7 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -165,11 +165,12 @@ static int read_buffer(int read_stdin, exarg_T *eap, int flags) /// /// @param read_stdin read file from stdin /// @param eap for forced 'ff' and 'fenc' or NULL -/// @param flags extra flags for readfile() +/// @param flags_arg extra flags for readfile() /// /// @return FAIL for failure, OK otherwise. -int open_buffer(int read_stdin, exarg_T *eap, int flags) +int open_buffer(int read_stdin, exarg_T *eap, int flags_arg) { + int flags = flags_arg; int retval = OK; bufref_T old_curbuf; long old_tw = curbuf->b_p_tw; @@ -224,8 +225,14 @@ int open_buffer(int read_stdin, exarg_T *eap, int flags) // 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)) { + if (curbuf->b_ffname != NULL) { #ifdef UNIX int save_bin = curbuf->b_p_bin; int perm; diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 21c1549f42..fdba186200 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -167,6 +167,7 @@ void filemess(buf_T *buf, char_u *name, char_u *s, int attr) /// 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 @@ -334,6 +335,10 @@ int readfile(char *fname, char *sfname, linenr_T from, linenr_T lines_to_skip, } 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/nvim/fileio.h b/src/nvim/fileio.h index 650977deac..ae3c51f1bc 100644 --- a/src/nvim/fileio.h +++ b/src/nvim/fileio.h @@ -15,6 +15,7 @@ #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 #define READ_STRING(x, y) (char_u *)read_string((x), (size_t)(y)) diff --git a/src/nvim/testdir/test_autocmd.vim b/src/nvim/testdir/test_autocmd.vim index 5451dcf241..f21b958f1a 100644 --- a/src/nvim/testdir/test_autocmd.vim +++ b/src/nvim/testdir/test_autocmd.vim @@ -493,6 +493,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 |