ターミナル ウィンドウの幅が 80 列で、次の内容のみを含む Python スクリプトを実行するとします。
print("x" * 81 + "\b\by")
出力は、最後の 1 行を除いて でいっぱいの行になるはずx
です。最後の 1 行は です。y
問題は、出力が でいっぱいの行x
と、2 行目に 1 行だけ が含まれるy
ことです。実際には、バックスペース文字が stdout に出力されるときは常に、折り返された行がある場合を除いて期待どおりに動作し、カーソルは 1 行上に配置されます。その場合、バックスペース文字は stdout バッファから除外されるようです。
この動作は、上記のスニペットに沿って、たとえばecho -e "xx...x\b\by"
bash と sh で試してみたり、printf(...);
C/C++ で試してみたりと、さまざまな方法で再現できます。バックスペース文字を含むファイルの場合や、ターミナルウィンドウの行を複数回取る stdin 読み取りの入力の場合もcout << ...;
同じ問題が発生します。後者の場合、文字はバックスペースキーを複数回押すことで置き換えられます。ウィンドウの幅を超えて行が折り返されると、バックスペースを繰り返し押しても前の行に移動することはできませんが、それらのヒットは呼び出し元プログラムによって期待どおりに処理されます。たとえば、呼び出しでは、上記の例に従って、 79と 1 が含まれます。ここで面白いのは、ウィンドウのサイズを変更して新しいカーソル位置がウィンドウの最初の列ではなくなるようにすると、バックスペースで新しい最初の列の場所に戻り、ターミナル行が 1 つだけになるまでこの方法を進めることができることです。その後、それ以上バックスペースできない位置があることがわかりますが、その位置を予測する方法がわかりませんでした。cat
'\b'
scanf("%s", s);
s
x
y
最後に、折り返された行とバックスペースが出会う別の状況は、長いコマンドを入力し、バックスペースで最初の行に戻る場合です。これを実行すると、何の問題も発生しません。
私は Ubuntu 18.04 を使用しており、gnome-terminal、xvt、tilda などのさまざまなターミナル エミュレーターで上記のすべてを試しました。ヒントがあれば、ぜひ教えてください。ありがとうございます!
答え1
tmux
、、希望どおりに動作します。有効にすることでその動作に切り替えることができますscreen
。urxvt
xterm
逆ラップアラウンドモード: printf '\e[?45h'
.
これはレガシーであり、設計上壊れており、誰もそれを修正しようとはしませんでした。あなたが指摘した問題以外にも多くの問題があります。VTE 62号詳細についてはこちらをご覧ください。
長いコマンドを入力し、バックスペースキーを押して最初の行に戻る場合。その操作に問題はありません。
この場合、単にバックスペースを発行するよりも複雑な画面処理を実行するシェルの行編集 (readline ライブラリなど) を使用しています。
答え2
Windows 7 Python 3.7.4
print("x" * 81 + "y")
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
それがあなたの望みですか?