VT100エスケープシーケンス:カーソル移動ラップラインの終わりまでラップ

StackOverflow https://stackoverflow.com//questions/25038426

  •  21-12-2019
  •  | 
  •  

質問

VT100エスケープシーケンスで制御されるTelnet CLIアプリケーションを作成しています。そのために。カーソルを移動する [DエスケープシーケンスがTelnetサーバーからクライアントに送信されます。これはPuttyまたはGnome-Terminalでは可能です。残念ながら、PATTY線の長さよりも長い行で、上記のエスケープシーケンスは現在の行の上の回線にカーソルをナビゲートすることを許可しません。

例カーソルは '|'です。コメントは '//'

でマークされています
----------------
>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ではありません)。

前の行にラウンドをラップするときに、カーソルがどの列に移動して移動制御シーケンスを使用するかを追跡しようとすることができます。ユーザーの画面の幅を知る必要があります。これは、LINESCOLS環境変数を設定することによって実行できます。

他のヒント

記載のように、bw能力は問題の一部を解決できる可能性がありますが、まれです。特に、VT100対応プログラム(XTERMなど)の機能ではありません。 OPはPUTTY端子とGNOME端子の両方に記載されています。後者はbwを使用していないため、異なる溶液が好ましい。

一方、PUTTYは、カーソル位置レポートを実装しています。 rel="nofollow">システムコールを使用してスクリーンサイズを取得できない場合のフォールバックとしての再設定。 XTermのコントロールシーケンス文書:

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シーケンスの送信
  • 実際のカーソル位置のレポートを読む

スクリーンサイズを知ると、サーバはより有用な位置にカーソルを送信することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top