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

问题描述

每次尝试在Windows 10(Vim 8.2)下的Vim中保存文件时,我都会尝试达到以下目的:

  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'

当检测到文件在Vim外部已被更改并且在Vim内部尚未被更改时,请自动再次读取。

.vimrc上的

行变为:

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