游標

游標是下一個字元將被列印、或位置敏感的控制序列將被執行的列與欄。

游標始終存在於終端機中,並位於作用中畫面區域內的某個列與欄。游標可能在視覺上被隱藏,但終端機內部狀態始終有一個游標,並且它始終位於某個作用中位置。

游標最常被關聯到下一個要列印字元將放置的位置。然而,游標也用於位置敏感的控制序列。例如,執行 清除行控制序列 時,游標決定了要清除的第一行。

終端機 每個畫面 只有一個游標。 請注意,本文件討論的是與 終端機 API 相關的游標。 編輯器等應用程式可能有自己的「游標」概念,它與終端機游標完全無關。例如,編輯器可能支援「多游標」,但底層終端機 API 是一個獨立的概念,並且在任意時刻只支援單一游標。

初始狀態

游標初始時始終位於畫面左上角。

待處理換行狀態

待處理換行狀態是一個布林值:當在畫面最右欄列印字元時會被設定,表示下一個要列印的字元應換行到下一行。

如果待處理換行狀態已設定,下一個要列印的字元會將游標移動到下一行的最左欄,取消待處理換行狀態,然後列印該字元1。

待處理換行狀態看似是一個顯而易見且無關緊要的特性,但它對游標行為有顯著(但微妙)的影響。例如,列印後接 退格 的行為,取決於你是在畫面最右欄還是其他欄列印。

如果你在除最右欄以外的任意欄列印字元,然後傳送 退格 控制字元,游標會退回到最近列印的字元之上。但如果你在最右欄列印字元,然後傳送 退格 控制字元,游標會移動到最近列印字元的左側。這正是 多個流行 shell 提示字元中的 bug 的來源。

你會看到許多控制序列註明它們會「取消待處理換行狀態」。這與字面意思一致:如果游標上已設定待處理換行狀態,則將其取消。下一個列印的字元不會換行到下一行。

Footnotes

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