無法在終端機中跨換行退格

無法在終端機中跨換行退格

假設您的終端機視窗有 80 列寬,並且您執行的 python 腳本僅包含:

print("x" * 81 + "\b\by")

您可能期望輸出是一行,x除了最後一行,它應該是一個y.我的問題是我得到的輸出是一行充滿了x和第二行包含一個孤獨的y。事實是,每當將退格字元印到stdout 時,它都會按預期工作,除非存在換行,並且它應該將遊標放在上面一行:在這種情況下,它似乎被排除在stdout 緩衝區之外。

我可以按照上面的程式碼片段以多種方式重現此行為,例如echo -e "xx...x\b\by"嘗試使用 bash 和 sh、printf(...);對於 C/C++、cout << ...;對於 C++。當cat包含退格字元的檔案以及輸入標準輸入讀取需要多個終端機視窗行時,也會出現相同的問題。在後一種情況下,'\b'我多次按退格鍵來替換字元:當我超過視窗寬度並且換行時,我無法透過重複按退格鍵到達前面的行,但這些點擊會按呼叫程式的預期進行處理,例如在scanf("%s", s);呼叫中,s將包含 79x和 1 y,遵循上面的範例。這裡有趣的是,如果我調整視窗大小,使新的遊標位置不再位於視窗的第一列,那麼我可以退格回到新的第一列位置,並以這種方式繼續,直到只有一個終端線已離開;然後事實證明有一個位置我無法進一步退格 - 但我無法弄清楚如何預測該位置。

最後,換行和退格鍵相遇的另一種情況是鍵入長命令並願意退格回到第一行。我這樣做沒有遇到任何問題。

我使用的是 Ubuntu 18.04,並使用各種終端模擬器(即 gnome-terminal、xvt 和 tilda)嘗試了上述所有操作。任何提示將非常感激。謝謝!

答案1

tmux, screen,urxvt按照您希望的方式行事。xterm可以透過啟用來切換到該行為反向環繞模式: printf '\e[?45h'

它是遺產,確實被設計破壞了,沒有人真正關心修復它。問題比你指出的還要多。看VTE第62期了解更多詳情。

當輸入長命令並願意退格回到第一行。我這樣做沒有遇到任何問題。

在這種情況下,您使用的是 shell 的行編輯(例如 readline 庫),它執行比僅發出退格鍵更複雜的螢幕處理。

答案2

Windows 7 Python 3.7.4

print("x" * 81 + "y")


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy

那是你要的嗎?

相關內容