user2393256
user2393256

Reputation: 1150

Vim replace content from file with output from external command

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?

Upvotes: 7

Views: 1656

Answers (2)

Ingo Karkat
Ingo Karkat

Reputation: 172510

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.

Upvotes: 8

IanS5
IanS5

Reputation: 94

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

Upvotes: 5

Related Questions