【问题标题】:Prevent file saving during BufWritePre防止在 BufWritePre 期间保存文件
【发布时间】:2011-04-04 18:58:31
【问题描述】:

我有一个对当前文件执行有效性检查的功能(以符合我雇主的编码标准)。我想在保存之前调用这个函数,即使用 BufWritePre。但是,如果我的检查功能失败,我会阻止保存文件。

那么,是否有可能突破 BufWritePre 自动命令?

我意识到我可以通过重新映射:write 命令来实现这一点,如图所示here,但我想尽可能避免这种情况,因为它感觉有点不微妙。

提前感谢您的建议。

【问题讨论】:

标签: vim


【解决方案1】:

您可以“简单地”强制出错:

:autocmd BufWritePre *.txt throw "you may not"

如果您希望能够再次保存 .txt 文件

:autocmd!
:source $MYVIMRC

【讨论】:

  • 这比我炮制的要简单得多。我猜使用:w! 会强制解决这个错误?
  • 不,w! 无论如何都不会写
  • 谢谢!这看起来很有希望。但是,“检测到错误”消息看起来很丑……可以处理错误,使其回显有意义的消息,但仍然离开函数而不保存?我在 try/catch/endtry 方面的经验不足,不知道这是否可能。
  • 我也不是,王子! (+1 为大网名,顺便说一句)
【解决方案2】:

来自:help BufWriteCmd

                            *BufWriteCmd*
BufWriteCmd         Before writing the whole buffer to a file.
                Should do the writing of the file and reset
                'modified' if successful, unless '+' is in
                'cpo' and writing to another file |cpo-+|.
                The buffer contents should not be changed.
                |Cmd-event|

所以听起来您可以实现该自动命令,并且仅在允许保存的情况下进行保存和重置'modified'

我猜你必须使用writefile(getline('^', '$')) 之类的东西才能真正进行写作。

另一方面,你也许可以做类似的事情

  • 禁用 BufWriteCmd 自动命令
  • :write 再次文件。我不确定它是否允许您在 BufWriteCmd 处理程序中执行此操作。
  • 重新启用您的 BufWriteCmd 自动命令。您可能应该将它放在:finally 子句中,以确保即使写入出现问题它也能执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2018-07-16
    相关资源
    最近更新 更多