fix(cmd): :update writes new file buffers only for real files #35939

Problem: :update should write new file buffers, but previous fix
affected special buffer types (acwrite, nofile, etc.).

Solution: Add bt_nofilename() check to only write new files for
buffers representing real filesystem paths.
This commit is contained in:
glepnir
2025-09-28 11:28:05 +08:00
committed by GitHub
parent 03032d1f73
commit fcf752476a
4 changed files with 17 additions and 2 deletions

View File

@@ -989,7 +989,8 @@ slower (but safer).
*:up* *:update*
:[range]up[date][!] [++opt] [>>] [file]
Like ":write", but only write when the buffer has been
modified.
modified, or when the buffer represents a new file
that doesn't exist on disk.
WRITING WITH MULTIPLE BUFFERS *buffer-write*

View File

@@ -308,6 +308,7 @@ Commands:
- |:trust|
- User commands can support |:command-preview| to show results as you type
- |:write| with "++p" flag creates parent directories.
- |:update| command writes new file buffers even when unmodified.
Editor:
- |prompt-buffer| supports multiline input/paste, undo/redo, and o/O normal

View File

@@ -1772,7 +1772,9 @@ void ex_file(exarg_T *eap)
/// ":update".
void ex_update(exarg_T *eap)
{
if (curbufIsChanged() || (curbuf->b_ffname != NULL && !os_path_exists(curbuf->b_ffname))) {
if (curbufIsChanged()
|| (!bt_nofilename(curbuf) && curbuf->b_ffname != NULL
&& !os_path_exists(curbuf->b_ffname))) {
do_write(eap);
}
}

View File

@@ -258,4 +258,15 @@ describe(':update', function()
eq(1, eval('g:write_pre'))
eq(1, eval('g:write_post'))
end)
it('does not write acwrite buffer when unchanged', function()
command('file remote://test')
command('setlocal buftype=acwrite')
command('let g:triggered = 0 | autocmd BufWriteCmd remote://* let g:triggered = 1')
command('update')
eq(0, eval('g:triggered'))
command('call setline(1, ["hello"])')
command('update')
eq(1, eval('g:triggered'))
end)
end)