JQueryターミナルのANSIフォーマットコードに取り組んでいます。それはほとんど機能していますが、カーソルを移動する必要がある0A ansiコードに関連する1つの問題があります(他の0カーソルコード:B C D E F)
私は ervy library でテストしましたが、\x1b\[0[A-D]
ターミナルに出力する前の文字列から。
ANSIエスケープを正しく処理するかどうかわからない場合は、各行の前に出力を行に分割し、y位置を増やしてxを0に設定し、カーソルANSIエスケープコードがあるときにカーソルを移動します。画面の出力を保持するために配列の配列を使用しています。 (わかりませんが、最後まで行を1つの文字列に結合しないと高速になると思いますが、速度ではなく最初のアイデアであったため、この方法で作成しました)。
0がある場合はどうすればよいかわかりません。
これはervyライブラリからの2つのプロットの出力です
正しいプロット
ゼロコードなしでプロットします。
私は自分のコードをデバッグしようとしています(ある点でプロットが2番目の画面に表示されると思います)が、0 ANSIエスケープコードを処理する方法がわかりません。
Wikipedia を参照として使用しています。
DEC VTで見られる動作は、ZDM(ゼロデフォルトモード)を念頭に置いて理解する方が簡単です。 ECMA-48から:
パラメータ値0は、デフォルトのパラメータ値を表し、0とは異なる場合があります。
カーソル移動シーケンスの場合、仕様ではデフォルトが「1」と定義されているため、ZDMではこれらはすべて同じです。
CSI A
(省略されたパラメーターのデフォルトは1です)CSI 0 A
(0はデフォルト値の特別な意味を持ちます)CSI 1 A
(paramはたまたまデフォルト値です)私の知る限り、DECデバイスに実装されているすべてのCSIシーケンスはZDMスキームに従います。
その後、ZDMは仕様から削除されたため、「0」はデフォルト値の特別なプレースホルダーではなく、数値として読み取られるようになりました。しかし、DECデバイスはその動作を切り替えませんでした。したがって、VT100 +互換エミュレータを仕様に完全に適合させることができるかどうかという問題に要約されます。
これらのエスケープシーケンスは、繰り返しカウントをパラメーターとして受け取ります。 \e[5A
カーソルを5行上に移動します。\e[10C
は、カーソルを10列分右に移動します。値が省略の場合、デフォルトは1です。
しかし、パラメーターが明示的に0として指定されている場合はどうなるでしょうか?
標準を見てみましょう。 ECMA-48、およびctlseqs.html(xtermの動作を文書化)は、それについて何も述べていません。つまり、ゼロだけ移動する必要があることを暗黙的に暗示しています。一方、DEC STD 070では、値0は1ずつ移動する必要があると述べています。
実装を見てみましょう。 urxvtは、これらのシーケンスの一部で0を0として解釈します。垂直方向のカーソル移動用ですが、水平方向には使用できません(1つあります)。私がチェックした他のすべての端末は1と解釈します(xtermを含むため、その動作とドキュメントは一致しません)。
標準に一貫性がありません。実装に一貫性がありません。
あなたは何ができますか?これらは使用しないでください。これらを発行するライブラリに遭遇した場合は、バグを報告し、開発者にこれらの問題のあるエスケープシーケンスの使用を停止するように依頼してください。彼らが何を期待しても、それはいくつかの標準に違反し、いくつかの端末で確実に壊れます。