From: Bram Moolenaar Date: Sun, 29 Mar 2020 14:06:29 +0000 (+0200) Subject: patch 8.2.0474: cannot use :write when using a plugin with BufWriteCmd X-Git-Tag: v8.2.0474 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0fff44152d06e6b662ad4bef172af07a041d2f3f;p=vim patch 8.2.0474: cannot use :write when using a plugin with BufWriteCmd Problem: Cannot use :write when using a plugin with BufWriteCmd. Solution: Reset BF_NOTEDITED after BufWriteCmd. (closes #5807) --- diff --git a/src/fileio.c b/src/fileio.c index 6e66a3e86..f05abe68c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -261,11 +261,21 @@ readfile( { if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname, FALSE, curbuf, eap)) + { + int status = OK; #ifdef FEAT_EVAL - return aborting() ? FAIL : OK; -#else - return OK; -#endif + if (aborting()) + status = FAIL; +#endif + // The BufReadCmd code usually uses ":read" to get the text and + // perhaps ":file" to change the buffer name. But we should + // consider this to work like ":edit", thus reset the + // BF_NOTEDITED flag. Then ":write" will work to overwrite the + // same file. + if (status == OK) + curbuf->b_flags &= ~BF_NOTEDITED; + return status; + } } else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname, FALSE, NULL, eap)) diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 44f9465f0..ad2dc2b0e 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -1536,6 +1536,40 @@ func Test_Cmd_Autocmds() enew! endfunc +func s:ReadFile() + setl noswapfile nomodified + let filename = resolve(expand(":p")) + execute 'read' fnameescape(filename) + 1d_ + exe 'file' fnameescape(filename) + setl buftype=acwrite +endfunc + +func s:WriteFile() + let filename = resolve(expand(":p")) + setl buftype= + noautocmd execute 'write' fnameescape(filename) + setl buftype=acwrite + setl nomodified +endfunc + +func Test_BufReadCmd() + autocmd BufReadCmd *.test call s:ReadFile() + autocmd BufWriteCmd *.test call s:WriteFile() + + call writefile(['one', 'two', 'three'], 'Xcmd.test') + edit Xcmd.test + call assert_match('Xcmd.test" line 1 of 3', execute('file')) + normal! Gofour + write + call assert_equal(['one', 'two', 'three', 'four'], readfile('Xcmd.test')) + + bwipe! + call delete('Xcmd.test') + au! BufReadCmd + au! BufWriteCmd +endfunc + func SetChangeMarks(start, end) exe a:start. 'mark [' exe a:end. 'mark ]' diff --git a/src/version.c b/src/version.c index 328203358..d06b4b777 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 474, /**/ 473, /**/