vim 设置默认在收到 TERM 信号时保存缓冲区

vim 设置默认在收到 TERM 信号时保存缓冲区

我使用多个 vim 实例。目前我使用 bash 函数

kv(){ a=($(pgrep vim)); kill ${a[@]}; }  

终止所有正在运行的 vim 实例。这样做的缺点是,如果 vim 被终止且未保存更改,则留下未解决的 .swp 文件。有没有办法设置 vim 在收到终止信号时保存其缓冲区?

答案1

您无法专门捕获 TERM 信号,但您可以“捕获”几乎任何让 Vim 有机会正常退出的信号。请参阅以下示例:

:help v:dying

您可以将:echo示例中的命令修改为类似于:wqall(参见“ :help :wqall”)。

但我不推荐这样做。你很容易在不希望的情况下让文件被覆盖。

答案2

我认为无法保存缓冲区VimLeave。我试过下面的代码

autocmd VimLeave * :!touch ~/logs/vim-leave
autocmd VimLeave * :wall

此代码成功保存了touch文件,但没有保存缓冲区。我发现此主题来自 vim 邮件列表

Vim 调用 deathtrap() 函数,关闭所有缓冲区,然后调用 getout(),在此函数中处理所有自动命令(BufWinLeave、BufUnLoad、VimLeavePre 以及最后的 VimLeave)。但到那时,您就无法再保护任何缓冲区了。

到那时,Vim 处理致命信号,它将不再调用不安全的函数(例如分配内存),所以我怀疑它是否有可能实现你想要的。

相关内容