我知道为什么 ctrl+c
终止一个程序;我更感兴趣的是为什么选择“c”而不是其他字母,因为它(显然)没有语义含义。
如果有人知道这背后的历史(以及其他历史,例如ctrl+d
EOF),那就太棒了。
答案1
最初发布于 Unix.stackexchange.com,但我无法对该答案投赞成票,因此这是一份副本:
Ctrl+的“kill”含义C非常古老,我认为甚至比 Unix 还要古老。 维基百科 将其追溯到 TOPS-10,即 20 世纪 60 年代末。文章解释了为什么Ctrl+C是一个合理的选择:ASCII,出版于 1963 年,对应的角色是 ETX, 正文结束由于缺少表示“停止”¹的字符,因此表示“此段输入已结束”的字符是“停止当前处理”的合理选择。
Ctrl+的“复制”含义C来自 Xerox PARC,现代复制粘贴技术的发明者(以及图形用户界面的大多数其他基础知识)。我不知道具体是什么时候,但一定是在 20 世纪 70 年代末。用户体验 Stack Exchange 上的这个主题 讨论了键绑定的选择;C 表示复制,非常有意义。
PARC 没有理由 因为 TOPS-10 和 Unix 终端中已有的含义而 拒绝使用Ctrl+来复制。当时操作系统和应用程序更加多样化,使用计算机的人要少得多;没有机会也没有呼吁为所有应用程序制定单一的键绑定标准。 +在流行应用程序中的其他用途包括CCtrlC词星² 以及 Emacs 中特定于模式的命令。所有这些都是独立设计的,适用于通常具有不同要求、在不同环境中运行的应用程序。
您可以使用以下方式配置终端键绑定
stty
命令。当终端处于熟模式³时,终端绑定处于活动状态。例如,该命令stty intr ^G
将发送 SIGINT 信号的字符设置为 Ctrl+G而不是Ctrl+ C。^G
字符是 比利时ASCII 格式;当发送到终端时,它的意思是“响铃”。这是 Emacs 用于表示“中断当前操作”的字符(原理:应用程序通过终端向用户发送 BEL 来中断用户;用户通过终端向应用程序发送 BEL 来中断应用程序)。当发送到终端时,它没有标准含义。大多数 shell 都提供行编辑功能,因此它们将终端设置为原始模式。全屏文本模式应用程序也是如此。您可能需要配置这些应用程序以识别Ctrl+G 而不是Ctrl+ C,并且有些应用程序可能具有不可配置的键绑定。因此,根据您使用的应用程序,更改中断字符可能可行,也可能不可行。
另一种方法是配置您的终端以更改它为Ctrl+C 键组发送的字节序列,或者让它不发送任何内容,而是执行复制操作。您还可以选择不同的键组来发送 Ctrl+ C(如果您有非笔记本电脑键盘,您可以使用偏僻的Pause/Break 键)。并非所有终端都可以以这种方式配置。
¹ Ctrl-S (XOFF) 表示停止,但它是针对终端的,而不是针对应用程序的。² 位于+ 旁边的 Ctrl是X下一行, Ctrl+E和Ctrl+R是上一行和向上翻页;选择这些键是因为它们在 QWERTY 键盘上的位置。³ Nitpick :cooked 模式是一组终端设置,包括对几个字符的解释,其中一个字符发送中断信号。