ds0678 2017-07-30 22:50
浏览 36
已采纳

Vim用外部命令的输出替换文件中的内容

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?

  • 写回答

2条回答 默认 最新

  • douhuantui6259 2017-07-31 09:31
    关注

    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.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?