ターミナルエミュレータはDC1制御コードをどのように扱うべきですか?

ターミナルエミュレータはDC1制御コードをどのように扱うべきですか?

私はansi互換の端末エミュレータを書いていますが、表示される順序で別の制御コードを実装しています。これを使用するときの1つの奇妙なことlynxは、過度のDC1/XON制御コード(0x11)です。しかし、彼らは実際にはそうは思わない。はいその制御コード。私はLXTerminalそれらが矢印の形でレンダリングされることを知り、Lynxの完全なページレイアウトを見ると矢印の形で動作するように意図されているようです。

0x11代わりに、印刷可能文字を指定するよく知られた仕様または参照実装がありますかDC1

編集する:

この円矢印は、このコードに対してxtermが出力するものですが、わかりません。なぜ、私のエンコーディングがUTF-8の場合は、このようにDC1出力する必要があります。

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

ベストアンサー1

controlQ(0x11)と(0x13)が表示されている場合、controlSこれはXON / XOFF:フロー制御アーティファクトです。接続がソフトウェアフロー制御に依存していることを示す場合にのみ、これを確認する必要があります。端末ドライバはそれをデバイスに送信できます(ユーザーがこのキーを押して他の方向を制御できるように)。

追加資料:

「レイアウト」の説明サルクあいまい:

  • 0x11 は、可能な文字セット内の空白文字ではありません。
  • 見ている文字セットLynxは、0x11を印刷できない文字で表示する人がいないことを知っています。
  • 表示文字セットは以下で使用できます。オプションメニュー
  • ロケールと表示文字セットの奇妙な組み合わせのため、Lynxはこれを印刷可能な文字としてのみ使用します。

Lynxが0x11を印刷されない文字として使用する理由の詳細が不足しているため、ターミナルドライバはXON / XOFFを送信するためにかなり小さいバッファを使用しているように聞こえます。

後続のコメント(どの使用中の端末TERM=ansi?スクリーンショットショーxterm)、lynxたとえば左矢印文字を書くことができます(curseを使用)ACS_LARROW。内部にソースコード、次のようになります。

    /*
     *今、複雑さを避けるために、左スクロールインジケータを描画します。
     *最初の列にある可能性がある複数列文字の一部を上書きします。
     *場所。
     */
    if (IsPanned && lft_cells) {
        CTRACE_EDIT((tfp, "左スクロール表示を描画\n"));
        TmpStyleOn(prompt?s_prompt_edit_arr:s_aedit_arr);
        LYmove(StartY、StartX);
        LYaddch(ACS_LARROW);
        TmpStyleOff(プロンプト?s_prompt_edit_arr:s_aedit_arr);
        左_シフト= 1;
    }

今…それ自体lynxは、次の定義だけを知っています<curses.h>

#define ACS_LARROW      NCURSES_ACS(',') /* arrow pointing left */

そして、端末は次のように説明されます。「アンシー」実際のマッピングを提供しますklone+acs:

acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,

幸いなことに(読みやすくするために)興味のあるマッピングは、カンマ(エスケープされた)を8進数021にマッピングする2番目のエントリです。

    \,\021

これがDC1です(021 8進数は0x11 16進数です)。ただし、このマッピングは次の目的には使用されません。xterm。線描画文字xterm(ncurses が端末記述を無視する UTF-8 を使用しない限り)には、左矢印は含まれません。このマッピングは次に定義されます。xterm-basic、カンマがないことがわかります(末尾のカンマは区切り文字です)。

acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,

これxterm マニュアル提案された有用な値TERMと「ansi」(リストにもかかわらず)が最初の値ではありません。それはしばらく使用されました(ncurses以前)。

   Terminal  database (terminfo (5) or termcap (5)) entries that work with
   xterm include

          an optional platform-specific entry ("xterm-new"),
          "xterm",
          "vt102",
          "vt100",
          "ansi" and
          "dumb"

たとえば、X11R5(1993)で見ました。紹介されましたが、より早い、X10R4(1986)に登場。私は、ターミナルエミュレータの「ansi」の意味が30年間少し変わったと思います。ANSI.SYS、これはxtermなどとは異なります。)"xterm"(または"xterm-new")、より良い結果を得ることができます。

おすすめ記事