0

我正在写一个BufUnload autocmd,并且我想有条件地阻止缓冲区从 autocmd 中实际卸载或关闭。有没有办法做到这一点?

例如,我想使用缓冲区的内容作为 mercurial 的提交消息,使用 autocmd 执行以下操作:

autocmd BufUnload <buffer> !hg ci -l logfile

因此,如果提交失败(hg命令返回非零错误代码),我想保持缓冲区打开并保持不变。

4

2 回答 2

2

我建议将此消息保存在变量中。在 aurum(用于 VCS↔Vim 集成的插件)中有以下逻辑编码:当带有提交消息的缓冲区被擦除或写入(触发实际提交并将其擦除)时,我保存了三个变量:

  1. 提交消息。
  2. 当前提交十六进制(您可以使用 来查看hg log -r .)。
  3. 当前存储库根。

. 然后,当再次提交某些内容时,使用以下逻辑:如果当前存储库根目录与保存的存储库根目录相同,当前提交十六进制也是如此,则从变量中获取提交消息并初始化缓冲区。

以下行为的原因:

  1. 如果提交失败,我想恢复提交消息(与您的相同)。
  2. 如果我这样做了hg rollback,编辑了一些东西并想再次提交,我想恢复提交消息。
  3. 如果我关闭提交缓冲区是因为我记得我想编写更多我想要的更改......</li>
  4. 如果我没有做上述任何事情,我不想看到旧的提交消息。

保存当前提交十六进制是为了区分前三种和最后一种情况。

于 2013-10-07T04:38:41.627 回答
1

我不认为这是可能的(至少我无法做到这一点,即使在:throwing 上设置了一个异常BufUnload),但没有什么能阻止您再次:edit立即重新访问同一个文件(假设它已正确持久化)。您可以通过expand('<afile>').

对于提交消息,它通常以另一种方式工作:修订控制系统触发提交消息编辑器,并在消息为空或编辑器因错误退出时中止提交(在 Vim 中您可以使用 实现:cquit)。

为了从重新调用 Vim 中调用此类中止的提交消息,我编写了VcsMessageRecall 插件。可能会帮助您实现目标。

于 2013-10-06T20:33:34.813 回答