光标

光标是下一个字符将被打印、或位置敏感的控制序列将被执行的行与列。

光标始终存在于终端中,并位于活动屏幕区域内的某个行与列。光标可能在视觉上被隐藏,但终端内部状态始终有一个光标,并且它始终位于某个活动位置。

光标最常被关联到下一个要打印字符将放置的位置。然而,光标也用于位置敏感的控制序列。例如,执行 擦除行控制序列 时,光标决定了要擦除的第一行。

终端 每个屏幕 只有一个光标。 请注意,本文档讨论的是与 终端 API 相关的光标。 编辑器等应用可能有自己的“光标”概念,它与终端光标完全无关。例如,编辑器可能支持“多光标”,但底层终端 API 是一个独立的概念,并且在任意时刻只支持单个光标。

初始状态

光标初始时始终位于屏幕左上角。

待处理换行状态

待处理换行状态是一个布尔值:当在屏幕最右列打印字符时会被置位,表示下一个要打印的字符应换行到下一行。

如果待处理换行状态已置位,下一个要打印的字符会将光标移动到下一行的最左列,取消待处理换行状态,然后打印该字符1。

待处理换行状态看似是一个显而易见且无关紧要的特性,但它对光标行为有显著(但微妙)的影响。例如,打印后接 退格 的行为,取决于你是在屏幕最右列还是其他列打印。

如果你在除最右列以外的任意列打印字符,然后发送 退格 控制字符,光标会退回到最近打印的字符之上。但如果你在最右列打印字符,然后发送 退格 控制字符,光标会移动到最近打印字符的左侧。这正是 多个流行 shell 提示符中的 bug 的来源。

你会看到许多控制序列注明它们会“取消待处理换行状态”。这与字面意思一致:如果光标上已置位待处理换行状态,则将其取消。下一个打印的字符不会换行到下一行。

Footnotes

  1. This isn't strictly true. Wraparound modes and scroll regions 可以改变此行为。 ↩