If you are running vim autocmd's without a group, you're killing your performance. Granted your probably not sourcing your vimscript files with autocmd's too often, but every time you source that vimscript you are adding another command that needs to run redundantly.

This is what I had

Not silky smooth

For WAAY too long I have had something like this in my vimrc or init.vim. It formats my python for me on every save, works great except if I source my dotfiles more than once I start adding how many times black runs.


autocmd bufwritepre *.py execute 'Black'

Why is a bare autocmd bad

let me demonstrate

Lets create a new file called format.vim and give it the :so %. Works great, it starts telling me that its formatting.


autocmd bufwritepre *.py :echo("formatting with black")

too-many-formats

BUT as every time I give it the :so % it formats an extra time on every single save.

Setting up an augroup

I've been told I need an augroup to prevent duplicates. So I did it, and nothing changes, it still ran as many times as it was sources on every save.


augroup black
    autocmd bufwritepre *.py :echo("formatting with black")
augroup end

Clearing out the augroup

What you need to do is clear out all commands in the augroup with autocmd! right at the beginning of the group.


augroup black
    autocmd!
    autocmd bufwritepre *.py :echo("formatting with black")
augroup end

My Final silky smooth setup

Now this is what I have in my dotfiles for a silky smooth setup that does not run automds like crazy as I am making changes to my dotfiles.


augroup waylonwalker
    autocmd!
    autocmd bufwritepre *.py execute 'PyPreSave'
    autocmd bufwritepost *.py execute 'PyPostSave'
    autocmd bufwritepost .tmux.conf execute ':!tmux source-file %' autocmd bufwritepost .tmux.local.conf execute ':!tmux source-file %'
    autocmd bufwritepost *.vim execute ':source %'
augroup end