防止缓冲区在autocmd中卸载

时间:2013-10-06 20:18:09

标签: vim autocmd

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

例如,我想使用autocmd将缓冲区的内容用作mercurial的提交消息:

autocmd BufUnload <buffer> !hg ci -l logfile

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

2 个答案:

答案 0 :(得分:2)

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

  1. 提交消息。
  2. 当前提交十六进制(您可以使用hg log -r .查看)。
  3. 当前存储库根目录。
  4. 。然后,当再次提交某些内容时,将使用以下逻辑:如果当前存储库根目录与已保存的存根相同,那么当前提交十六进制是,则从变量中获取提交消息并初始化缓冲区。

    以下行为的原因:

    1. 如果提交失败,我想恢复提交消息(与您的相同)。
    2. 如果我做了hg rollback,编辑了一些内容并希望再次提交,我想恢复提交消息。
    3. 如果我关闭了提交缓冲区,因为我记得我想编写一些我想要的更改...
    4. 如果我没有做上述任何事情,我会想要查看旧提交消息。
    5. 保存当前提交十六进制用于区分前三个和最后一个案例。

答案 1 :(得分:1)

我不认为这是可能的(至少我无法实现这一点,即使在:throw BufUnload:edit例外,但没有任何事情可以阻止你重新expand('<afile>')同一个文件(假设它被正确保留)立即再次。您可以通过:cquit从autocmd中获取filespec。

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

为了从重新调用Vim中调用这些中止的提交消息,我写了VcsMessageRecall plugin。可能会帮助您实现目标。