端末エミュレーターには行と行の概念があるようですが、それについてもっと知りたいです。
行と行の意味のデモンストレーション
以下の Python スクリプトは、3 行の「a」を表示して待機し、次に 3 行の「b」を表示します。
import sys, struct, fcntl, termios
write = sys.stdout.write
def clear_screen(): write('\x1b[2J')
def move_cursor(row, col): write('\x1b['+str(row)+';'+str(col)+'H')
def current_width(): #taken from blessings so this example doesn't have dependencies
return struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ, '\000' * 8))[1]
clear_screen()
for c in 'ab':
#clear_screen between loops changes this behavior
width = current_width()
move_cursor(5, 1)
write(c*width+'\n')
move_cursor(6, 1)
write(c*width+'\n')
move_cursor(7, 1)
write(c*width+'\n')
sys.stdout.flush()
try: input() # pause and wait for ENTER in python 2 and 3
except: pass
この休憩中に端末ウィンドウの幅を 1 文字狭くすると、次のように表示されます。
これはかなり妥当なようです。各行は個別にラップされています。もう一度エンターを押してb
s を印刷すると、
すべてが期待どおりに機能します。私は絶対カーソル位置を使用し、以前に書き込んだのと同じ行に書き込みました - もちろん、すべての a を上書きするわけではありません。それらの多くは他の行にあるからです。
ただし、ウィンドウをさらに 1 文字狭めると、ラッピングの動作が異なります。
2 番目と 3 番目の行がb
折り返されたのはなぜa
ですか? また、' の最後の行が b の最初の行と結合したのはなぜですか? 上の表示されている行に理由のヒントがあります - 2 つa
の が表示されているのは、これらの 2 つの行がまだリンクされているためです - もちろん、ウィンドウを再度移動すると、その 1 つの行は同じように折り返されます。これは、行全体を置き換えた行でも発生しているようです。
以前に折り返されていた行が、対応する親行にリンクされていることがわかります。ターミナルを大きく広げると、それらが同じ論理行に属していることがより明白になります。
私の質問
実際には、私の質問は、この行が行に結合されるのをどのように防止または予測するかです。画面全体をクリアするとこの動作はなくなりますが、アプリケーションを大幅に高速化する行ごとのキャッシュを保持できるように、可能であればこれを必要とする個々の行に対してのみこれを行うとよいでしょう。行の最後までクリアすると、その行はその下の行からリンク解除されますが、行の先頭までクリアしても、その行からその行のリンクは解除されません。
私は興味があります - これらの行のものは何ですか? それらについてどこで読むことができますか?どの行が同じ行の一部であるかを調べることはできますか?
私は、tmux の有無にかかわらず、terminal.app と iterm でこの動作を観察しました。仕様がなくても、これらのいずれかにソースダイブすると答えが得られると思いますが、どこかに仕様があると思います!
背景: ユーザーがウィンドウの幅を狭めた場合に端末の折り返しが発生する方法を予測できる端末ユーザー インターフェイスを作成したいと考えています。tput smcup
行の折り返しを防ぐために機能するフルスクリーンモード( 、または'、ncursesが使用するもの)のようなものは知ってpython -c 'print "\x1b[?1049h"
いますが、ここでは使用したくありません。
編集:スクリプトの上書き動作をすでに理解していることをより明確にし、ラッピング動作の説明が必要です。