帮助我破译由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 [
) 被称为CSI
or控制序列引入器。
这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 >
。这与前面的代码类似,但用于数字键盘。