CTRL+C:复制或中断

Dak*_*ron 7 keyboard-shortcuts user-interface

在 Linux 和 Windows CTRL + 中 C 有两种截然不同的含义,这取决于您使用的程序。在某些程序(主要是 GUI 程序)中,它的意思是“复制”,而在其他程序(几乎所有命令行工具)中,它的意思是“中断”或“退出”。

这对于从使用 GUI 转向使用命令行的人来说尤其麻烦,因为“复制”是一种完全安全的操作,而中断可能会杀死您当前正在使用的程序,从而可能破坏您的工作。

原因是什么,或者这种分歧的起源在哪里?

Gil*_*il' 20

Ctrl+的“kill”含义C非常古老,我认为比 Unix 还要古老。维基百科将其追溯到 1960 年代后期的 TOPS-10。文章解释了为什么Ctrl+C是一个合理的选择:在1963 年出版的ASCII 中,对应的字符是 ETX,文本结束。缺少表示“停止”¹ 的字符,表示“本段输入结束”的字符是表示“停止当前处理”的合理选择。

Ctrl+的“复制”含义C来自施乐 PARC,它是现代形式复制粘贴(以及大多数其他图形用户界面基础)的发明者。我不知道那是什么时候,但肯定是 1970 年代后期。User Experience Stack Exchange 上的这个线程讨论了键绑定的选择;C 表示复制很有意义。

基于TOPS-10 和Unix 终端中的现有含义,PARC 几乎没有理由拒绝Ctrl+ Cfor copy。那时操作系统和应用程序更加多样化,使用计算机的人要少得多;没有机会也没有要求为所有应用程序的键绑定制定单一标准。Ctrl+C在流行应用程序中的其他用途包括WordStar² 中的page-down和 Emacs 中特定于模式的命令。所有这些都是独立设计的,适用于通常具有不同要求、在不同环境中运行的应用程序。

您可以使用stty命令配置终端键绑定。当终端处于煮熟模式³时,终端绑定处于活动状态。例如,该命令stty intr ^G将发送 SIGINT 信号的字符设置为Ctrl+G而不是Ctrl+ C。该^G字符是BEL在ASCII; 当发送到终端时,它的意思是“敲钟”。是Emacs用于“中断当前操作”的字符(原理:应用通过终端向用户发送BEL来中断用户;用户通过终端向应用发送BEL来中断应用)。发送到终端时它没有标准含义。

大多数 shell 提供行编辑功能,因此它们将终端设置为原始模式。全屏文本模式应用程序也是如此。您可能需要配置这些应用程序以识别Ctrl+G而不是Ctrl+ C,并且某些应用程序可能具有不可配置的键绑定。因此,根据您使用的应用程序,更改中断字符实际上可能可行,也可能不可行。

另一种方法可能是配置您的终端以更改它为Ctrl+C键和弦发送的字节序列,或者使其不发送任何内容而是执行复制操作。您还可以选择不同的键和键发送Ctrl+ C(如果您有非笔记本电脑键盘,则可以使用偏僻的Pause/Break键)。并非所有终端都可以通过这种方式进行配置。

¹ Ctrl-S (XOFF) 表示停止,但它指向终端,而不是应用程序。
²Ctrl+X旁边为下一行,Ctrl+ECtrl+R为上一行和翻页;选择这些键是因为它们位于 QWERTY 键盘上。
³ Nitpick:cooked 模式是一组终端设置,包括几个字符的解释,包括一个发送中断信号的字符。