ncursesエスケープシーケンスの解読

ncursesエスケープシーケンスの解読

ncursesライブラリから生成されますstrace。端末とやり取りする方法を探していますが、ncurses「ハンドシェイクプロトコル」を理解したいと思います。私はいくつかの説明を見つけましたが、「カーソルキーをカーソルに設定する」などの説明はすべて理解していません。

echo $TERM印刷xterm-256color

オリジナル

write(1, "\33[?1049h\33[22;0;0t\33[1;39r\33(B\33[m\33[4l\33[?7h\33[H\33[2J", 46) = 46
write(1, "Hello World !!!", 15)   = 15  
write(1, "\33[39;1H\33[?1049l\33[23;0;0t\r\33[?1l\33>", 32) = 32

私の仮説

write(1, "
    \33[?1049h       # go to alternate screen
    \33[22;0;0t
    \33[1;39r
    \33(B            # Set United States G0 character set 
    \33[m            # Turn off character attributes
    \33[4l
    \33[?7h          # Set auto-wrap mode
    \33[H            # Move cursor to upper left corner
    \33[2J           # Clear entire screen
", 46) = 46

write(1, "Hello World !!!", 15)   = 15

write(1, "
    \33[39;1H
    \33[?1049l       # Go back to the initial screen
    \33[23;0;0t\r
    \33[?1l          # Set cursor key to cursor 
    \33>
", 32) = 32

テストプログラムのソースコード

int main()
{   
    napms(25000);               /* This pause is needed to catch the process by strace*/
    initscr();                  /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();                  /* Print it on to the real screen */
    endwin();                   /* End curses mode        */

    return 0;
}

答え1

XTermとそれと互換性があると主張するすべての項目には、次のものが必要です。

https://invisible-island.net/xterm/ctlseqs/ctlseqs.html

XTerm によってエミュレートされ拡張される VT100 端末のマニュアルも必要です。

https://vt100.net/docs/vt100-ug/contents.html

Linuxconsole_codes(4)のマニュアルページでは、VT100 の上位セットでもある Linux コンソールで使用される制御コードについて説明し、マニュアルページには上記の他のソースよりも詳細な説明がある場合があります。

http://man7.org/linux/man-pages/man4/console_codes.4.html

あなたの例では不明なコード:

\33[22;0;0t

ここで、最初の部分\33[(または)をorESC [と呼びます。CSI制御シーケンスインポーター

これはCSI <number> ; <number> ; <number> t一連のウィンドウ操作です。で終わる制御シーケンスはt常に3つの数値引数を使用しますが、必ずしもすべてではありません。最初のパラメータはで、222番目のパラメータはなので、0後で復元できるように、現在のウィンドウとアイコンのタイトルを保存するようにターミナルエミュレータに指示します。

\33[1;39r

これはCSI <number> ; <number> r。 「スクロール領域の設定」を意味します。現在のウィンドウのサイズより小さく設定すると、TUIディスプレイの上部にあるメニュー行、下部のステータスバー、またはその両方などの静的項目が、スクロール内に大量のテキストを表示しながら静的に保持されることを効果的に許可します。エリア。

\33[4l

これはCSI <one or more numbers> l。 「リセットモード」を意味します。値4は、「代替挿入モード」をリセット(無効化)するか、単に画面に印刷されたすべての項目が前の内容を上書きする必要があることを示します。

\33[39;1H

これはCSI <number> ; <number> H。これにより、カーソルが39行、1列に移動します。

\33[23;0;0t

これは別のウィンドウ操作の順序です。以前に保存したウィンドウとアイコンのタイトルが復元されます。明らかに、テストプログラムはヘッダーをまったく変更しませんが、これらのシーケンスは別々に実行される標準の初期化/終了プロセスの一部ですinitscr()endwin()

\33[?1l          # Set cursor key to cursor

これにより、VT100 キーボードのカーソルキーを通常の「カーソルキーモード」に設定します。アドオンキーセットなど、アプリケーション固有の目的でこれらのキーを使用できるように設計された別のモードがあります。 VT100端子は、モード設定に応じてこれらのキーに対して異なる出力を生成します。これにより、アプリケーションがカーソルキーをデフォルト以外のモードに切り替えると、プログラムが終了する前にデフォルトモードに戻ることが保証されます。

\33>

これだけですESC >。これは前のコードと似ていますが、数字キーパッド用です。

関連情報