ANSI 0x1b [0Aおよびその他の0値コードをエスケープするにはどうすればよいですか?

ANSI 0x1b [0Aおよびその他の0値コードをエスケープするにはどうすればよいですか?

私はjQuery端末用のANSIフォーマットコードを書いています。ほとんど動作しますが、問題があります。カーソルを移動する必要がある0A ansiコードに関連しています(他の0カーソルコードもあります:BCDEF)。

私はテストしましたアイビー図書館\x1b\[0[A-D]端末に出力する前に文字列から削除すると効果があります。

ANSIエスケープが正しく処理されるかどうかはわかりません。各行の前に出力を複数行に分割し、y位置を大きくしてxを0に設定し、カーソルANSIエスケープコードがある場合はカーソルを移動します。私は画面の出力を保存するために配列の配列を使用します。 (確かではありませんが、最後まで1行に接続しないと、より速いようですが、速度のためではなく、最初のアイデアだったのでそうしました。)

0があればどうすればいいかわかりません。

これは、ervyライブラリの2つのプロットの出力です。

ここに画像の説明を入力してください。

正しいプロット

ここに画像の説明を入力してください。

コードがゼロの画像はありません。

私のコードをデバッグしようとしています(いつかプロットが2番目の画面に表示されるようです)0 ANSIエスケープコードを処理する方法がわかりません。

私はそれを使用していますウィキペディア参照。

答え1

\e[5Aこれらのエスケープシーケンスは、カーソルを5行上に移動し、カーソルを\e[10C右に10列移動するなど、反復回数を引数として使用します。この値は次のとおりです。省略、デフォルトは1です。

しかし、パラメータが明示的に0に指定された場合はどうなりますか?

基準を見てみましょう。 ECMA-48とctlseqs.html(xtermの動作を文書化)はこれについて何も言いません。つまり、暗黙的にゼロに移動する必要があることを意味します。一方、DEC STD 070では、値0を1ずつ移動する必要があることが示されています。

実装を見てみましょう。これらのシーケンスの一部では、urxvtは、たとえば垂直カーソル移動の場合は0を0と解釈しますが、水平カーソル移動の場合は解釈しません(1)。私が確認した他のすべての端末はこれを1と解釈します(xtermを含むアクションとドキュメントが一致しません)。

標準は一貫性がありません。実装は一貫性がありません。

あなたは何ができますか?これを使用しないでください。これらのエラーが発生するライブラリが見つかった場合は、バグを報告し、開発者に問題のあるエスケープシーケンスの使用を中止するように依頼してください。これは、期待にかかわらず、いくつかの規格に違反し、一部の端末を確実に損傷する可能性があるためです。

答え2

DEC VTの動作は、ZDM(Zero Default Mode)を考慮すると理解しやすくなります。 ECMA-48から:

パラメータ値0はデフォルトのパラメータ値を表し、0と異なる場合があります。

カーソル移動シーケンスの場合、仕様はデフォルト値を「1」と定義するため、ZDMでも同じです。

  • CSI A(パラメータ省略のデフォルト値は1です。)
  • CSI 0 A(0はデフォルトとして特別な意味を持ちます)
  • CSI 1 A(param がデフォルト値)

私が知る限り、DECデバイスに実装されているすべてのCSIシーケンスはZDM方式に従います。

ZDMは後で仕様から削除されたため、「0」は数字で読み取る必要があり、デフォルトの特別なプレースホルダーではなくなりました。ただし、DECデバイスはこの動作を変更していません。したがって、一つの質問に帰結します。 VT100+準拠のエミュレータは仕様に完全に準拠していますか?

関連情報