到達終端末端時的背景色空白
我正在使用用於文本格式的控制序列,並偶然發現了一些意外行為。我有一些文本要輸出,在這段文本的中間有一些較小的文本塊,用彩色背景突出顯示。原始文本可能很長,可能需要幾行,所以中間的彩色文本塊可能出現在多行上——從一行開始,在另一行結束。一切似乎都很好,直到它到達終端視窗的底部,很多空白變成了彩色:
這是一個重現的腳本:
# color.sh echo -e 'default \x1B[43m color \n color \x1B[49m default';
如您所見,我在文本塊中添加了一個換行符
\n
,只是為了重現,但在我的情況下,當文本很長並且不適合單行時,彩色塊會分成多行,結果我在文本之後有相同的彩色空白。# color-long.sh echo -e 'default default default default default default default default default \x1B[43m color color \x1B[49m default';
我在 Ubuntu 14.04 上得到了這個,但能夠在 Yosemite 10.10 上重現相同的行為。
我想知道這種行為的原因是什麼,以及如何在不使用不同的實用程序進行輸出(而不是
echo
)的情況下修復它,但也許可以使用相同的控制序列。我可以控製文本,但不能控制輸出過程。我已經嘗試將 , 之類的序列包裝起來
\[\x1B[43m\]
,\001\x1B[43m\002
但它沒有給出任何結果,只是在文本中添加了額外[]
的內容或輸出了一些無法辨識的符號。
這與 bash 無關,它純粹是終端行為的影響,特別是滾動。當您到達螢幕底部並開始在下一行輸入時,終端會通過將所有內容向上推一行來創建一個新的空白行。(在較舊的終端中,這會破壞頂行。在較新的終端中,頂行只是被推入回滾緩衝區。)現在這是一個難題,新行是什麼顏色。前景色不是問題,因為你看不到它,而是背景色。. . (在他們開始爭論它可能是黑灰色或白色(或者實際上是黑綠色,亮綠色或琥珀色中的相同)的日子裡)有實驗只使用黑色,但有人抱怨。確定的是新行(或在清除螢幕的情況下清除整個螢幕中的清除區域)將目前背景顏色作為受影響區域的背景顏色。所以這種行為是設計使然,因為它在大多數情況下都是正確的。
那麼你想做什麼來獲得你想要的行為呢?當您更改回黑色背景(或在行尾)時,發送一個 clear 到行尾,這將為行的其餘部分設置背景顏色。
同意@hildred 這是特定於終端的行為,但存在一些分歧點:
- 如果應用程序碰巧切換到備用螢幕(如在 xterm 中執行的全屏程序中,具有適當的終端描述),則不會將文本移入回滾緩衝區。
- 沒有“正確”或“錯誤”的行為,只有約定。
- 終端設計中有幾個(可能)獨立的相關功能。
- 由於慣例(以及一些範例,例如 Linux 控制台、xterm 和 - 有點不同 - rxvt),許多彩色終端的行為相似。
- ncurses 常見問題解答*我的終端顯示一些未著色的空間*更詳細。
約定是一個強有力的論據;程序依賴於這些不變的設計選擇。對於導致問題的一些範例,請考慮以下幾種情況:
- linux 2.6.26 vt back_color_erase :如Novell #418613中所述,對 Linux 控制台驅動程序的更改破壞了 bce 模型。
- xterm 的一些更新導致其游標顏色滲入新滾動的行(在 xterm更新檔 #242關於 Debian #252873以及 Debian #522141中提到)
VTE 最近的錯誤報告#754596提供了有趣的閱讀。似乎 VTE 的開發人員建議只是改變行為來看看會發生什麼:
首先,我們可以為下一個開發週期“修復”我們的程式碼(從 _vte_terminal_cursor_down() 中刪除“匹配 xterm 並在滾動時填充新行”6 行),看看是否有人抱怨有問題。然後我們就會更好地了解情況。