Mac OS X 终端.app 有时会开始以不同的方式解释换行符!可以修复这个问题吗?

Mac OS X 终端.app 有时会开始以不同的方式解释换行符!可以修复这个问题吗?

有几次,我的 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,并向终端仿真器发送各种重置/初始化控制序列。

相关内容