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

gelonida
gelonida used Ask the Experts™
on
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)
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Trying to tame bits. They're nasty.
Commented:
Maybe
:autocmd BufWritePost * ! vim_save_command.sh <afile>

Open in new window

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 BarbosTrying to tame bits. They're nasty.

Commented:
: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.
Ensure you’re charging the right price for your IT

Do you wonder if your IT business is truly profitable or if you should raise your prices? Learn how to calculate your overhead burden using our free interactive tool and use it to determine the right price for your IT services. Start calculating Now!

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.
Mihai BarbosTrying to tame bits. They're nasty.

Commented:
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:
#!/bin/bash

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

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.
Mihai BarbosTrying to tame bits. They're nasty.

Commented:
Thanks. I think it's done somehow automatically now.
OK,  Thanks again. Just ping me in case you don't receive the points.

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial