VT100エスケープシーケンス:カーソル移動ラップラインの終わりまでラップ
質問
VT100エスケープシーケンスで制御されるTelnet CLIアプリケーションを作成しています。そのために。カーソルを移動する
例カーソルは '|'です。コメントは '//'
でマークされています----------------
>potato| // Now I press left arrow which sends esc sequence to application
----------------
>potat|o // Works as expected. The cursor moved left
----------------
.
別の例
----------------
>potatopotatopot // This is a long command which goes over two lines
|ato // Now I press left arrow which sends esc sequence to application
----------------
>potatopotatopot // The cursor didn't move, since the escape sequence
|ato // does nothing if the cursor is at the edge
----------------
.
私は、エッジで折り返し折り返しの他のエスケープシーケンスを検索していましたが、見つかりませんでした。ターミナルモードを折り返すことを可能にする何かに変更するエスケープシーケンスも見つかりませんでした。
それでは、このようなターミナルナビゲーションは一般的に処理されていますか?
解決
TERMCAP端末のbw
機能は、画面の端に残っているのかを前の行に折り返すかどうかを述べています。それは私がチェックされたPuttyの説明(Ncursesの下でinfocmp putty
)に存在しましたが、他の多くの人にはありませんでした(例えば、infocmp gnome
ではありません)。
前の行にラウンドをラップするときに、カーソルがどの列に移動して移動制御シーケンスを使用するかを追跡しようとすることができます。ユーザーの画面の幅を知る必要があります。これは、LINES
とCOLS
環境変数を設定することによって実行できます。
他のヒント
記載のように、bw
能力は問題の一部を解決できる可能性がありますが、まれです。特に、VT100対応プログラム(XTERMなど)の機能ではありません。 OPはPUTTY端子とGNOME端子の両方に記載されています。後者はbw
を使用していないため、異なる溶液が好ましい。
CSI Ps n Device Status Report (DSR).
Ps = 5 -> Status Report.
Result (``OK'') is CSI 0 n
Ps = 6 -> Report Cursor Position (CPR) [row;column].
Result is CSI r ; c R
.
resize
プログラムはこれを
- 「巨大」の右下隅にカーソルを送る(999×999)ウィンドウ
- CPRシーケンスの送信
- 実際のカーソル位置のレポートを読む
スクリーンサイズを知ると、サーバはより有用な位置にカーソルを送信することができます。