Link to home
Start Free TrialLog in
Avatar of gelonida
gelonidaFlag 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.
- 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)
Avatar of Mihai Barbos
Mihai Barbos
Flag of Switzerland image

Link to home
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of gelonida


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

but what happens if 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.
: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.
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/ <afile>"

Open in new window

and the shell script looks like:

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

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.
Thanks. I think it's done somehow automatically now.
OK,  Thanks again. Just ping me in case you don't receive the points.