I’m using vim with the vim-golang plugin. This plugin comes with a function called :Fmt that “reformats” the source code using gofmt, a command-line executable.
I want to invoke the :Fmt function each time that I save the file, so it is continuously re-formatted. I think this should be done with a autocmd directive. But I have two doubts:
- I could not find a way to execute the function. I tried writting Fmt and :Fmt at the end of the autocmd line, but it didn’t seem to work. I think I miss something, like “call”.
- I want this to happen only when saving a file of filetype ‘go’. I don’t know how to combine those two conditions – I can activate variables depending on the file type, and I can do small stuff, like removing trailing spaces, whenever a file is saved, but separatedly.
So this is what I have so far:
" I can set variables for go like this
autocmd FileType go setlocal noexpandtab shiftwidth=4 tabstop=4 softtabstop=4 nolist
" I can clean trailing spaces(conserving cursor position) on save like this
autocmd BufWritePre * kz|:%s/\s\+$//e|'z
" None of these worked:
autocmd BufWritePre,FileType go Fmt
autocmd BufWritePre,FileType go :Fmt
The
FileTypeevent doesn’t fire on buffer writes;BufWritePreis the correct one, but you need to provide a file pattern, e.g.*.go:The only downside is that this duplicates the detection of the go filetype. You could delegate this by hooking into the
FileTypeevent, and then define the formatting autocmd for each Go buffer by using the special<buffer>pattern:This has the downside that if the filetype ever gets set multiple times, you’ll run the formatting multiple times, too. That could be solved via a custom
:augroup, but now it becomes really complex. Or, if you’re really sure that this is the onlyBufWritePreautocmd for Go buffers, you could use:autocmd! BufWritePre ...(with a!).