I hate this warning so much that I forked Neovim and ripped the feature out.
You changed branches or performed some other Git operation that updated the file you have open, and that means a different modification time. Vim compares it to that of when it was last read and gives you this message if they differ:
WARNING: The file has been changed since reading it!!! Do you really want to write to it (y/n)?
Perhaps you temporarily switched to another branch. You had to check something on
master briefly and didn't want to use a Git worktree. After two
git checkouts, and despite your files being exactly the same, Vim is tipped off that they changed. So then you get to fight through this warning for each file you have open.
This sucks especially in CLI Vim, which is what I use, because it bumps up the entire console output of Vim until you respond to the prompt. Usually Vim doesn't then refresh properly, requiring you to force an unnatural act of a full redraw.
The fork, sans-warning
My fork of Neovim adds an option called
overwritewarning and lives here:
This is the description of this new option:
*'overwritewarning'* *'ow'* *'nooverwritewarning'* *'noow'* 'overwritewarning' 'ow' boolean (default on) global When writing a file, Vim ensures its modified time hasn't changed since the last read. Specifies whether the user is prompted for confirmation if this time differs with "WARNING: The file has been changed since reading it!!!"
I use Neovim pretty much daily so I do plan on continuous rebasing on the main repo.
Here's how to build and install it alongside of stock/system Neovim.
FAIR WARNING: This invites accidental overwrites with the thinking that version control (Git) is more than capable of handling these scenarios. It's now your responsiblity to manage when you are overwriting a change, and if you are unprepared this may get you in trouble. I suggest only doing this if you feel that the warning gets in your way more than it saves you from yourself. If you're not already, you should now always review staged changes with a
git diff --staged and to know when you need to refresh your Vim buffer manually (
:e). Otherwise removing this warning will definitely cause you surprises.
If you are not comfortable with that, don't do this. The original feature was written for a reason.
Check out the fork:
git checkout https://github.com/mcnelson/neovim.git
Install Libtool via your package manager. I.e. on Fedora:
dnf install libtool.
Follow the instructions on the Neovim Wiki Page. This method installs Neovim stand-alone at
~/neovimso it won't interfere with your system Neovim instance. That way, if the feature is ever merged to the main project, you can simply remove
~/neovimand update your main version.
rm -r build make CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=$HOME/neovim" make install
Add the binary to your PATH in your Bash profile --
.profile. This serves as the switch between custom and stock Neovim.
nvimand open your
set noow # No overwrite warning
Source your config file to establish the new setting.
Test that it's working:
With Neovim open, separately run:
Back to Neovim, and run
:w. It should now quietly overwrite the file.
Maybe I'll try to merge this back to the main Neovim project, but it's kind of a workaround. A much better solution would be a quick diff of the original and new buffer. Then we'd only see the warning if there are actual changes.
Until then, I hope this alleviates some frustration.