Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vim replace content from file with output from external command

Tags:

vim

go

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?

like image 750
user2393256 Avatar asked Jul 20 '26 02:07

user2393256


1 Answers

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.
like image 90
Ingo Karkat Avatar answered Jul 21 '26 18:07

Ingo Karkat