在终端中意外按下Ctrl-S后如何解冻?


729

这种情况在我身上经常发生:当我(以不同的意图)按下Ctrl-S终端后,与之的交互(输入或输出)被冻结。这可能是一种“滚动锁定”或其他任何一种。

此后如何解冻终端?

(这一次,我一直在apt-shell内部进行bash内部处理- urxvt不确定其中哪个对特殊处理负责Ctrl-S:我C-r像往常一样使用readline 向后搜索命令的历史记录,但是后来我想返回“向前通过与通常的历史-在Emacs--至少C-s123),但导致该终端冻结那么,滚动/寻呼查看过去的事情还工作在终端,但没有相互作用。流程在那里运行。)


23
我当时在工作,vim然后按Ctrl-S保存编辑。嗯,哦XD
ADTC

4
为什么首先存在?
neverMind9

Answers:


862

Ctrl--Q

要完全禁用此功能,请坚持stty -ixon使用启动脚本。要允许任何键重新使事情顺利进行,请使用stty ixany

ps:执行此操作的不是终端也不是Shell,而是操作系统的终端驱动程序。


8
谢谢!顺便说一句,还有他们建议Ctrl-C; 它也起作用吗?(在另一个地方,他们也建议Ctrl-Q您,就像您一样。)
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev

23
Ctrl-C确实有效,但它还会发送一个通常不希望的中断信号。(顺便说一句,用于这些操作的密钥都可以通过配置stty。)
ak2

2
我记得在我的Apple] [克隆上尝试过这种组合,并且在那里也奏效- Ctrl-S然后Ctrl-Q恢复。
sashoalm 2014年

19
感谢上帝 !!多年来,这一直困扰着我。不知道为什么VIM只是没有将它实现为保存的本机快捷方式,而不是它的功能。很高兴知道由于自然使用了CTRL + S(保存快捷方式),冻结的VIM屏幕从监狱中逃脱了,几乎适用于除VIM之外的所有应用程序。
Kraang总理

8
@SanuelJackson Ctrl-S“保存快捷方式”适用于除vim之外的几乎所有DESKTOP应用程序。和Emacs除外。和纳米。以及您可以在终端上运行的所有其他“应用程序”,正是因为终端已将其用于流控制。这是使用Ctrl-Alt-FN快捷键找不到Linux桌面应用程序的原因,这是因为系统已使用它们。
gerlos 2015年

384

Ctrl- Q确实是答案。我以为我会花一点时间来解决这个问题,因为这段历史太长了,无法满足ak2正确答案的范围

早在黑暗时代,终端就是通过长线或通过调制解调器的电话线连接到远程设备(起初是另一个终端,因为电传打字比电报键更容易学习)的大型设备。到Unix开发之时,ASCII代码已经很成熟(尽管来自IBM的竞争EBCDIC代码仍然不容小a)。

最早的终端保留了每个收到字符的打印记录。只要字符到达的速度至少不超过打印头可以键入的速度。但是,一旦基于CRT的终端成为可能,就会出现问题,即CRT上只能容纳25行,而25行的80个字符表示足够的RAM,没有人认真考虑过要为滚动到屏幕顶部的字符提供更多的RAM。屏幕。

因此,需要采取一些惯例来表明发送端应暂停以使读者赶上。

7位ASCII码具有33个代码点,专用于控制字符(0至31和127)。他们有些有真正完善的目的,如NUL(空白纸带领导者线程,差距和接头),DEL(“划掉”,由冲压所有的七个孔表示在纸带上的字符), BEL(丁!) CRLFTAB。而是四个被明确定义的用于控制终端设备本身(DC1DC4又名CTRL + Q键,Ctrl + R键,Ctrl + S和Ctrl + T)。

我最好的猜测是,一些工程师认为(随着助记符的发展),“ S”代表“停止”,“ Q”代表“继续”并不太糟糕,并被分配DC3为“请停止发送”和DC1“确定” ,请立即继续发送”。

甚至在Unix离开Bell Labs进入世界时,这种约定已经很好地确立了。

该约定称为软件流控制,在实际的串行设备中极为常见。正确实现并不容易,因为它会阻止将这些字符中的任何一个用于通信信道中的任何其他目的,并且必须在任何未决的已接收字符之前处理停止信号,以避免发送超出接收端能力的字符。处理。

如果可行,使用串行数据流的带外附加信号进行流量控制是非常可取的。在可以负担额外信号线的直接有线连接上,您会发现正在使用硬件握手,这将释放这些字符以供其他用途。

当然,今天的终端窗口没有使用实际的物理串行端口,没有滚动条,并且根本不需要软件握手。但是惯例仍然存在。

我回想起理查德·斯托曼(Richard Stallman)在其emacs的第一个发行版中收到的有关其将Ctrl + S映射到增量搜索的投诉,并且他对必须依赖7位软件流控制连接的任何用户都表示同情。


2
谢谢..非常有意思...我一直想知道:为什么到底有人会选择继续使用“ Q”(现在(现在)用于退出)继续处理... QRST分组对此进行了解释...
Peter.O 2011年

13
非常感谢您的这段历史。我最近在默认情况下在我维护的终端仿真器中禁用了流控制,但是在仍然使用它的Unix传统主义者的声音抗议下,不得不相当快地将其恢复。我将ixany设置为位,因此至少在不知道^ Q的情况下按^ S的人不会卡住。
ak2

3
@RBerteig我遇到了一些有关退格和删除的类似知识。退格是正式的^ H,删除是^?像Emacs开发人员(还是斯托曼?)之类的人希望^ H可用于一般用途,例如帮助之类的快捷方式。转义序列^ [[3〜或类似的东西用来代替^?现在,退格键变成了旧的删除字符^?。实际上,我已经看到在Linux发行版上专门修补了ncurses来重新映射terminfo中的那些键,而在FreeBSD上的ncurses则未修补,这引起了一些令人烦恼的混乱,从而导致退格不起作用。
penguin359

23
以前我一直想知道为什么DEL会有代码127,而不是与其他控制字符组合在一起,直到我第一次玩一些纸带和ASR33为止。一旦我意识到它具有打所有孔的效果,这意味着它可能会在任何先前打过孔的角色上被过度删除以将其删除,这是有道理的。
RBerteig

3
@SanuelJackson仔细观察已经有一段时间了,但是Windows附带的默认vimrc已经将<Cs>映射到“:update”了很多年。我也很确定我也曾经在gvim的一些发行版中看到过它。但是,如果您在终端中使用vim,则此历史仍然非常重要。现代的终端仿真器仍然实现流控制键,因此,即使vim映射了它们,除非每个用户都按照可接受的答案中描述的那样禁用流控制,否则它将永远看不到它们。
提请
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.