7

I am programming go and I want to run gofmt with a shortcut and replace the content of the current source file with the output of gofmt.

I have the following mapping defined in my vimrc: map <C-r> :r ! gofmt %<CR> but this does simply append the output to the current file. Is there a way to override it?

3
  • 2
    As an aside, why don't you use vim-go. It does this already Commented Jul 31, 2017 at 1:59
  • 1
    And run goimports instead of gofmt. Commented Jul 31, 2017 at 3:06
  • 1
    If you don't want to use vim-go and automate formatting on save, add the following line to the .vimrc file. :autocmd BufWritePost *.go silent ! go fmt % 2>&1 >/dev/null Commented Jul 31, 2017 at 9:28

2 Answers 2

9

You're using the wrong command: :read appends lines to the buffer (with ! {cmd}: from an external command). Instead, you want to filter the current buffer contents through an external command. This is done via :help :range!. The gofmt command reads from stdin when no file is passed (some other commands take a special - argument for that. Ergo:

:nnoremap <C-r> :%! gofmt<CR>

Notes

  • You should use :noremap; it makes the mapping immune to remapping and recursion.
  • I've limited the mapping to normal mode; I don't think is necessary to directly launch this from visual mode or operator-pending mode.
  • As mentioned in the comments, there's probably a plugin that already provides this out of the box.
Sign up to request clarification or add additional context in comments.

Comments

5

The gofmt flag -w will overwrite the contents of the file it's fixing

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.