2013-10-06 59 views
0

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

例如,我想用,做一个自动命令以使用缓冲器的内容作为提交消息为水银:

autocmd BufUnload <buffer> !hg ci -l logfile 

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

回答

2

我建议将此消息保存在变量中。在金(插件VCS↔Vim集成)有下面的逻辑编码:当与提交消息缓冲器被擦拭出或写入(其触发实际提交和擦拭出来)我保存三个变量:

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

。然后,在再次提交时,使用以下逻辑:如果当前存储库根与保存的根相同,那么当前提交十六进制,则会从变量中提取提交消息并初始化缓冲区。

原因以下行为:

  1. 如果提交失败我要恢复提交的信息(和你一样)。
  2. 如果我做了hg rollback,编辑了一些内容并想再次提交我想恢复提交消息。
  3. 如果我关闭提交缓冲区,因为我记得我想代码的一些更多的变化我想...
  4. 如果我没有做上述的事情我做不希望看到老提交信息。

保存当前提交十六进制用于区分前三个和最后一个案例。

1

我不认为这是可能的(至少我不能实现这一点,即使:throwBufUnload上有例外),但是没有任何东西阻止您立即将相同的文件(假设它被正确保存)立即执行再次。您可以通过expand('<afile>')从autocmd中获取filespec。

使用提交消息,它通常会以另一种方式实现:版本控制系统触发提交消息编辑器,并在消息为空或编辑器退出时发生错误(在Vim中可以实现:cquit)。

为了从Vim的重新调用中回想到这样的中止提交消息,我写了VcsMessageRecall plugin。可能帮助你实现你的目标。