我使用多个 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 处理致命信号,它将不再调用不安全的函数(例如分配内存),所以我怀疑它是否有可能实现你想要的。