Fix "Can't open file for writing" in Vim
I learned this tip watching Sean Griffin in Hands-On Backbone.js on Rails.
The error
Edit a new file in a directory that does not exist yet, such as app/views/application
:
:e app/views/application/index.html.erb
Try to save the file:
:x
An error will display:
"app/views/application/index.html.erb" E212: Can't open file for writing
Press ENTER or type command to continue
The error means is it can't save the file because app/views/application
doesn't exist. So, we have to create it.
Making the directory in the shell
I used to suspend Vim:
Ctrl+Z
Then, create the directory from the shell:
mkdir app/views/application
Then, bring Vim back to the foreground:
fg
Making the directory in Vim
What Sean does in Hands-On Backbone.js on Rails is create the directory right from Vim:
:!mkdir -p %:h
Much faster!
How it works
%
is the current file in Vim. %:h
is the directory in which the current file is located. So, when editing app/views/application/index.html.erb
, the command expands to mkdir -p app/views/application
.
Bonus!
For the fastest approach yet, use vim-mkdir to just automatically make the directory when it doesn't exist, with no manual intervention necessary.
Related protips:
Written by Dan Croak
Related protips
2 Responses
Is there a similar solution for when we have no write permissions to a catalog and have to restart vim with sudo?
@jimmykane thanks!