我有点困惑:
% vim tmp
zsh: suspended vim tmp
% kill %1
% jobs
[1] + suspended vim tmp
% kill -SIGINT %1
% jobs
[1] + suspended vim tmp
% kill -INT %1
% jobs
[1] + suspended vim tmp
所以我辞职只是“自己做”,后来想知道为什么:
% fg
[1] - continued vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated vim tmp
%
哦!
确实有道理,现在我想起来,它vim
必须运行才能让信号处理程序被告知退出并执行此操作。
但显然不是我想要的。
有没有办法通过单个命令“唤醒并退出”?即, kill %N && fg %N
?的内置别名
为什么后台恢复不起作用?如果使用 Ibg
而不是fg
,Vim 会一直存活到 I 为止fg
,这有点打破了我的上述直觉。
答案1
vi-vi-vi
是属于魔鬼的。你必须用火杀死它。或者SIGKILL
:
kill -KILL %1
内置函数kill
足以发送SIGCONT
到挂起的进程,这样您就不必自己执行此操作,但是如果进程阻止您发送的信号或者处理信号导致进程挂起,那么这将无济于事再次(如果后台进程尝试从终端读取,默认情况下,它将被发送SIGTTIN
,如果未处理,则会挂起进程)。
答案2
vim
正在安装信号处理程序(并且可能还设置sigprocmask(2)
)以忽略常见信号,以便正在编辑的任何文件都不会因杂散的 control+c 或随机终止信号而丢失。一个更简单的程序很容易被杀死:
% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc busyloop.c -o busyloop
% ./busyloop
^Z
zsh: suspended ./busyloop
% kill %1
%
[1] + terminated ./busyloop
(安全地)退出vim
将需要一个信号处理程序来vim
接受TERM
或USR1
某种东西,保存(或丢弃?)任何缓冲区等。您想要做什么才能需要vim
像这样退出?