Bash

ANSI 轉義 0x1b[0A 和其他 0 值程式碼應該做什麼?

  • December 29, 2019

我正在為 jQuery 終端編寫 ANSI 格式程式碼。它幾乎可以工作,但我有一個問題與應該移動游標的 0A ansi 程式碼有關(還有其他 0 游標程式碼:BCDEF)

我已經使用ervy 庫進行了測試,如果我\x1b\[0[A-D]在輸出到終端之前從字元串中刪除它會有所不同。

我不確定如果我正確處理 ANSI 轉義,我將在每行之前將輸出分成幾行,我增加 y 位置並將 x 設置為 0,當有游標 ANSI 轉義碼時,我移動游標。我正在使用數組數組來保存螢幕的輸出。(不確定,但我認為如果我直到最後都不將線條連接成一個字元串會更快,但我這樣做是因為它是第一個想法而不是因為速度)。

如果有0,我不確定我應該這樣做。

這是來自 ervy 庫的兩個圖的輸出

在此處輸入圖像描述

正確的情節

在此處輸入圖像描述

沒有零程式碼的情節。

我正在嘗試調試我的程式碼(我認為在某一點上,情節會出現在第二個螢幕上),但我不知道如何處理 0 ANSI 轉義碼。

我使用維基百科作為參考。

考慮到 ZDM(零預設模式),在 DEC VT 中看到的行為更容易理解。來自 ECMA-48:

參數值 0 表示可能不同於 0 的預設參數值。

對於游標移動序列,規範將預設值定義為“1”,因此這些在 ZDM 中都是相等的:

  • CSI A(省略參數預設為 1)
  • CSI 0 A(0具有預設值的特殊含義)
  • CSI 1 A(參數恰好是預設值)

據我所知,在 DEC 設備中實現的所有 CSI 序列都遵循 ZDM 方案。

後來 ZDM 從規範中刪除,因此“0”現在應該讀作數字,而不是作為預設值的特殊佔位符。但是 DEC 設備並沒有改變這種行為。因此歸結為一個問題,VT100+ 兼容的仿真器是否完全符合規範。

這些轉義序列以重複計數作為參數,例如\e[5A將游標向上移動 5 行,\e[10C將游標向右移動 10 列等。如果省略,則該值預設為 1。

但是如果參數顯式指定為 0 會發生什麼?

讓我們看看標準。ECMA-48 以及 ctlseqs.html(記錄 xterm 的行為)沒有說明任何內容,也就是說,隱含地暗示它們應該移動零。另一方面,DEC STD 070 表示值 0 應該移動 1。

讓我們看看實現。對於其中一些序列,urxvt 將 0 解釋為 0,例如對於垂直游標移動,而不是對於水平(這裡是 1)。我檢查過的所有其他終端都將其解釋為 1(包括 xterm,因此其行為和文件不匹配)。

標準不一致。實現不一致。

你能做什麼?不要使用這些。如果您遇到發出這些問題的庫,請送出錯誤並要求其開發人員停止使用這些有問題的轉義序列,因為無論他們期望什麼,它都違反了某些標準,並且肯定會在某些終端中中斷。

引用自:https://unix.stackexchange.com/questions/559308