Avatar of gelonida
Flag for France asked on

run a (shell) script every vim saves a file.

What's the easiest way to achieve following:

Whenever I save a file with vim:
- vim will check in the current working directory (the directory in which vim was saved) whether a script with a certain name exists. (e.g. vim_save_command.sh)
- if the file exists vim will execute it and pass as parameter the name of the saved file (which could be in a different directory)

This has to work under Linux. (even better if it also works under mingw / cygwin / windows, but not required)
Linux* vim

Avatar of undefined
Last Comment

8/22/2022 - Mon
Mihai Barbos

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question

Thanks a lot
This seems to almost do the job. <afile> expands to the file name to be saved

but what happens if vim_save_command.sh does not exist in the current directory?

Can I avoid the error popping up in case the shell script does not exist?

This would allow me to add the autocmd to ~/.vimrc and add the 'magic post save command'  into the directory where I'd like to have the command and to have no action for all other directories.
Mihai Barbos

:help filename-modifiers

Open in new window

might be of help.
I think that you can use another script at an absolute location that would check if vim_save... exists and then runs it.

Idea with global script is perfectly feasible in my case. Very good idea.

I added this global script detecting whether a local file exists or not and calling it.

Now just another question: Is there any way to get rid of the

"Press ENTER or type command to continue" prompt?

My script does in fact not create anything on stdout / stderr
It just kicks off some background tasks, that will report to another application.
This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
Mihai Barbos

You can try something like
:silent ....

Open in new window

but I haven't tested it (and I cannot do that right now)
It might also solve the problem with the error message when the script is not there...

Thanks a lot!!  everything's working now as expected.
In order to get rid of stdout I did following:
autocmd BufWritePost * silent exec "! ~/bin/vim_save_command.sh <afile>"

Open in new window

and the shell script looks like:

if [[ -x ./post_save.sh ]] ; then
    ./post_save.sh "$@"

Open in new window


Hmmm The web interface changed since I last asked a question.

I marked your answer as solution, but don't see where I can attribute points.
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
Mihai Barbos

Thanks. I think it's done somehow automatically now.

OK,  Thanks again. Just ping me in case you don't receive the points.