我正在写一个BufUnload
autocmd
,并且我想有条件地阻止缓冲区从 autocmd 中实际卸载或关闭。有没有办法做到这一点?
例如,我想使用缓冲区的内容作为 mercurial 的提交消息,使用 autocmd 执行以下操作:
autocmd BufUnload <buffer> !hg ci -l logfile
因此,如果提交失败(hg
命令返回非零错误代码),我想保持缓冲区打开并保持不变。
我建议将此消息保存在变量中。在 aurum(用于 VCS↔Vim 集成的插件)中有以下逻辑编码:当带有提交消息的缓冲区被擦除或写入(触发实际提交并将其擦除)时,我保存了三个变量:
hg log -r .
)。. 然后,当再次提交某些内容时,使用以下逻辑:如果当前存储库根目录与保存的存储库根目录相同,当前提交十六进制也是如此,则从变量中获取提交消息并初始化缓冲区。
以下行为的原因:
hg rollback
,编辑了一些东西并想再次提交,我想恢复提交消息。保存当前提交十六进制是为了区分前三种和最后一种情况。
我不认为这是可能的(至少我无法做到这一点,即使在:throw
ing 上设置了一个异常BufUnload
),但没有什么能阻止您再次:edit
立即重新访问同一个文件(假设它已正确持久化)。您可以通过expand('<afile>')
.
对于提交消息,它通常以另一种方式工作:修订控制系统触发提交消息编辑器,并在消息为空或编辑器因错误退出时中止提交(在 Vim 中您可以使用 实现:cquit
)。
为了从重新调用 Vim 中调用此类中止的提交消息,我编写了VcsMessageRecall 插件。可能会帮助您实现目标。