我知道,如果我按下esc然后输入:q!
,我可以退出vim
编辑器,因为这个问题。
但是,标准约定是程序在按下ctrl+时退出,这会将 a 发送到当前正在运行的进程。cSIGINT
例如,top
、tail -f
和ping
都遵循此约定。
我的问题是:为什么不vim
遵循这个完善的惯例?是有历史原因,还是另有原因?
在我看来,如果它像其他所有东西一样遵循这个标准约定,它将避免给新用户带来很多困惑。
(当我们在做的时候,为什么是它SIGINT
而不是SIGTERM
一开始呢?)
因为
vim
遵循另一个古老而完善的约定,其中交互式程序中的 Control-C 将中止当前命令,而不是整个程序。交互式 shell 也遵循此约定—— Control-C 不会杀死你的 shell,而是它正在运行或将要运行的命令。不遵循该约定的程序通常试图通过捕捉
SIGINT
并询问用户“你真的要退出”或“使用退出退出”等来减轻恐惧,这使它们从讨厌变成烦人。Control-C 的其他非常成熟的约定是将其用作其他命令的前缀(如在 emacs 启发的程序中,Control-G 扮演 Control-C 的角色)或将选择复制到剪贴板。