在代码格式化程序保存 运行 后自动重新加载 vim 中的当前文件

Automatically reload current file in vim after code formatter has run on save

每次在 Vim 下 Windows 10 (Vim 8.2) 下保存文件时,我都试图实现以下目标:

  1. 自动格式化文件(使用外部工具,例如 Uncrustify)
  2. 重新加载Vim中的格式化文件(我想看新格式化的文件)

现在我可以使用 autocmd 自动格式化文件,方法是将以下内容添加到我的 .vimrc:

autocmd BufWritePost * silent! !start /min Autoformat.bat <afile>

问题是文件内容没有在屏幕上更新(我仍然看到未格式化的文件)。我必须离开焦点然后回来才能看到重新加载文件的提示。 刷新文件缺少什么?

经过一些研究,到目前为止我尝试了以下方法:

  1. 添加 autocmd BufWritePost * !edit(手动,有效)
  2. 添加autocmd BufWritePost * !redraw

但是好像不行。


注意:silent! !start /min 使每次保存时(在 Windows 上)闪过的烦人的命令提示符静音。


以下对我有用 Windows:

set autoread
autocmd BufWritePost * silent! !C:\Users\epoirier\Documents\BufWritePost.bat <afile>
autocmd BufWritePost * redraw!

我仍然看到控制台闪烁(不到)一秒,但我可以接受,因为 Vim 自动重新加载文件,我可以继续工作。

现在无法在 Windows 10 上进行测试,但在 Linux 上我正在尝试一个类似的有效设置:

autocmd BufWritePost * silent! !start /min Autoformat.bat <afile>
autocmd BufWritePost * edit
autocmd BufWritePost * redraw!

文件重新加载由 edit 触发(正如您已经发现的那样)没有 前置 !

! 执行一个 shell 命令,但 edit 是一个 vim 命令,我们不需要在命令之前使用 !(同样适用至 redraw).

redraw! 是必需的,因为 silent can mess up the screen 用于外部命令时。


另一种(我认为更适合)重新加载文件的解决方案是使用 autoread 选项而不是触发 edit。来自 :help autoread:

'autoread' 'ar'

When a file has been detected to have been changed outside of Vim and it has not been changed inside of Vim, automatically read it again.

.vimrc 上的行变为:

set autoread
autocmd BufWritePost * silent! !start /min Autoformat.bat <afile>
autocmd BufWritePost * redraw!