这种情况在我身上经常发生:在终端中按Ctrl-S(出于不同的意图)后,与其进行的交互(输入或输出)被冻结。

此后如何解冻终端?

(这一次,我一直在使用apt-shell内部的bashurxvt内部-不知道它们中的哪个对Ctrl-S的特殊处理负责:我像往常一样使用Cr向后搜索Cr的命令历史记录,但后来我想通过“向后”向前浏览历史记录通常(至少在Emacs中)是Cs(1、2、3),但是这导致终端死机了,滚动/分页以查看过去的内容仍然可以在终端中进行,但是与那里运行的进程没有交互。)

评论

我在vim中工作,然后按Ctrl-S保存编辑。呃XD

为什么首先存在?

我很高兴找到这个。当使用CTRL + A跳到一行的开头时,我经常打它。 CTRL + C和Return对我有用,但以后我将使用下面的答案。

这有时发生在我身上:意外地在xfce4终端中冻结了Vim(实际上是被冻结的终端)。各种xon-xoff解决方案(Ctrl-Q ...)均无效。尽管没有明显的键盘快捷键,但我从终端菜单中注意到终端已设置为“只读”。取消选中已恢复的终端响应。

以防万一终端在ssh断开连接后冻结:波浪号-期间,请参见unix.stackexchange.com/a/196724/296434。交叉链接,因为仅在终端冻结上进行谷歌搜索时很难找到该帖子

#1 楼

Ctrl-Q

要完全禁用此功能,请将stty -ixon粘贴在启动脚本中。要让任何键重新使事情顺利进行,请使用stty ixany

ps:终端和外壳程序不是这样做的,而是操作系统的终端驱动程序。

评论


谢谢!顺便说一句,他们建议使用Ctrl-C;它也起作用吗? (在另一个地方,就像您一样,他们建议使用Ctrl-Q。)

– imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)
2011年4月27日在12:41

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

–ak2
2011年4月27日在13:10

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

– Kraang Prime
15年3月14日在18:20

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

– Gerlos
2015年9月23日在15:45

@SamuelJackson并没有阻止您将ctrl-s绑定到.vimrc中的:w命令的示例,请参见此处:stackoverflow.com/a/11298171/2380702

–xor
16-09-22在10:03

#2 楼

Ctrl-Q确实是答案。我以为我会花一点时间来解决这个问题,因为这段历史太长了,无法适应ak2的正确答案。通过长线或通过带调制解调器的电话线连接到远程设备(最初是另一个终端,因为电传打字比电报键更容易学习操作)。到Unix开发之时,ASCII代码已经很成熟(尽管来自IBM的竞争性EBCDIC代码仍然是不容忽视的力量)。

最早的终端保留了每个字符的打印记录收到。只要字符到达的速度至少不超过打印头可以键入的速度。但是,一旦基于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表示为“确定,请立即发送”。 br />
甚至在Unix离开Bell Labs进入世界时,这种约定就已经很好地确立了。

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

如果可行的话,最好使用串行数据流中带外的其他信号进行流控制。在可以负担额外信号线的直接有线连接上,您会发现正在使用硬件握手,从而释放了这些字符以供其他用途。

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

我还记得理查德·斯托曼(Richard Stallman)在emacs的第一个发行版中收到了有关将Ctrl + S映射到增量搜索的投诉,并且他对任何使用过的用户都表示同情取决于7位软件流控制的连接。

评论


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

–ak2
2011-4-27 22:45

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

–penguin359
11年4月28日在10:48

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

–RBerteig
11年4月28日在19:08

@SanuelJackson仔细观察已经有一段时间了,但是Windows附带的默认vimrc已经将映射到“:update”了很多年。我也很确定我也曾经在gvim的一些发行版中看到过它。但是,如果您在终端中使用vim,则此历史仍然非常重要。现代的终端仿真器仍然实现流控制键,因此,即使vim映射了它们,除非每个用户都按照可接受的答案中描述的那样禁用流控制,否则它将永远看不到它们。

–提请
16年4月22日在22:30

@CMCDragonkai不。与SIGCONT和SIGSTOP无关。键入^ Z时,SIGTSTP由终端驱动程序生成,与SIGSTOP不同,可以忽略它。没有击键发送SIGCONT,这是您用来继续已停止作业的Shell中的任何命令所发送的信号。 ^ S和^ Q键直接作用于终端驱动程序堆栈,通常不发送信号。

–RBerteig
17年1月24日在20:09