有几次,我的 Mac OS X 终端出现奇怪的状态,换行符无法像平常一样被解释。就好像它们在执行换行部分,而不是回车部分。例如,我通常会看到类似这样的内容:
% git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
但是当终端进入这种奇怪的模式时,我得到的却是这样的:
% git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
我可以创建一个新的终端窗口来修复这个问题,但这有点烦人。如果可能的话,我想让同一个窗口保持活动状态,以防我需要回滚缓冲区中的某些内容。当出现这样的问题时,我可以做些什么来修复问题吗?
(我不知道这是否相关,但我通常在退出 emacs 时会出现这种情况。时不时地,我会做错事,不小心选择了另一个命令而不是C-x C-c
。在我意识到发生了什么之前,我的手指就取消了它,所以我不知道它可能是哪个命令,但是一旦 emacs 消失,终端就会处于这种有趣的新模式。)
答案1
当此问题再次出现时,在终端中发出以下命令:
reset
这应该会将您的终端重置为默认值,并希望解决您的问题。
答案2
当早期的终端(和打印机)收到 LF(ASCII 10)字符时,它们会将光标(打印头)前进到下一行,而不会水平移动。因此,仅由 LF 分隔的字符/单词序列会形成看起来像阶梯状的东西。这就是您所看到的。
当程序想要移动到下一行的开头时,它们会将 CR(ASCII 13)和 LF 设置为终端。CR 将光标移动到当前行的开头,LF 前进到下一行。
Unix 系统上的 tty 驱动程序具有可选的输出后处理,通常启用该功能将输出 LF 转换为 CR 和 LF 的组合。
您看到的问题是终端仿真器使用的 tty 已禁用此部分输出后处理。您可以使用以下命令重新启用输出后处理和 LF → CR LF 转换:
stty opost onlcr
这种类型的输出处理通常在“全屏”终端程序中被禁用,以便它们能够更好地控制光标。因此,如果这样的程序崩溃(或被终止)而无法恢复 tty 设置,那么您很可能会陷入“阶梯式模式”。由于在这种崩溃之后,其他 tty 设置可能会受到影响,因此您可能需要更彻底地清除影响。您可以使用以下命令将当前 tty 的设置重置为合理的默认值:
stty sane
该reset
命令完成大部分工作stty sane
,并向终端仿真器发送各种重置/初始化控制序列。