【问题标题】:Automatically reload current file in vim after code formatter has run on save在保存时运行代码格式化程序后自动在 vim 中重新加载当前文件
【发布时间】:2020-10-16 19:22:26
【问题描述】:

每次在 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 会自动重新加载文件并且我可以继续工作。

【问题讨论】:

    标签: vim autoformatting


    【解决方案1】:

    目前无法在 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!
    

    【讨论】:

    • 我刚刚尝试了这两个选项,但在我的 Windows 机器上都没有。第一个选项(有edit,没有autoread)在保存后不会自动更新屏幕。我必须失去焦点,然后回来查看重新加载对话框。第二个选项(没有edit,有autoread)不会自动更新屏幕,但是如果我失去焦点并回到Vim,屏幕会在没有重新加载对话框的情况下更新。
    • @BobMorane 哦,这真的很不幸:(你能提供更多关于你的设置的信息吗?例如,你是从终端运行 vim 还是使用 gvim?——我一到我的窗口10 台机器在工作,我将尝试复制您的设置,并希望提出一个有效的 Windows 解决方案。
    • 我在 Windows 10 上使用 GVim 8.2。我不使用插件,使用的格式化程序是 Uncrustify(在脚本中调用)。我有一个小的.vimrc 文件,如果需要,我可以与您分享。基本上我只为行号等设置了几个选项。感谢您抽出宝贵的时间,我很感激。
    • 我已经在我的 Linux 机器上尝试了您的第二个解决方案,它按预期工作。
    • 我在 Windows 上使用 .vimrc 的工作行更新了问题。您的解决方案有效。
    猜你喜欢
    • 2012-04-04
    • 2018-08-05
    • 2012-06-13
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多