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

您还需要 VT100 终端的手册,XTerm 对其进行模拟和扩展:

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

Linuxconsole_codes(4)手册页描述了 Linux 控制台使用的控制代码,Linux 控制台也是 VT100 的超集,并且手册页有时比上述其他来源有更详细的描述:

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

您的示例中的未知代码:

\33[22;0;0t

这里,第一部分\33[(or ESC [) 被称为CSIor控制序列引入器

CSI <number> ; <number> ; <number> t是一个窗口操作序列。以 结尾的控制序列t始终采用三个数字参数,但并不总是使用所有这些参数。第一个参数是22,第二个参数是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 >。这与前面的代码类似,但用于数字键盘。

相关内容