[?1049h 和 [?1h ANSI 转义序列] 有何作用?

[?1049h 和 [?1h ANSI 转义序列] 有何作用?

当我在一个盒子里使用 shell 时,当我echo foo | less在 ajax 响应中调用 less 命令()时,有这样的代码:

\u001B[?1049h\u001B[?1h\u001B=\rfoo\r\n\u001B[7m(END)\u001B[27m\u001B[K

\u001B[?1049h\u001B[?1h转义序列有什么作用,还有什么是\u001B=?它们是否记录在某处?

答案1

\u001B是一个不必要的冗长 ASCII 转义字符,它似乎是为ECMAScript6。 POSIX 将使用八进制\033,而其他一些则允许使用十六进制\01b。数字的大写/小写无关紧要。

\u001B[?1049h(和\u001B[?1049l) 是转义序列,它告诉xterm可选地切换到备用屏幕或从备用屏幕切换。

  • 问号表明它是“私人使用”(标准中为特定于实现的功能预留的类别)。列出的私人使用模式中约有三分之一XTerm 控制序列对应于 DEC 之一(它们具有助记符,如其DECCKM描述中所示)。如前所述,其他的要么是 xterm 原创的,要么是从其他终端改编而来的。

  • 此转义序列的原因是提供一种基于 terminfo 的方法,让用户决定程序是否可以使用备用屏幕。根据xterm 手册:

titeInhibit(班级TiteInhibit)
指定 xterm 是否应删除tite 来自 TERMCAP 字符串的 termcap 条目(用于在启动许多面向屏幕的程序时在备用屏幕之间切换)。如果设置,xterm 还会忽略转义序列以切换到备用屏幕。 Xterm 以不同的方式支持 terminfo,支持复合控制序列(也称为私有模式)1047,10481049与原来的效果相同47控制序列。该资源的默认值为“false”。

1049 代码(引入于1998年) 是公认的大多数声称与 xterm 兼容的终端仿真器,但大多数都没有提供该功能选修的。所以他们并没有真正实现这个功能。

另一方面,\u001B[?1h并​​非源自 xterm,而是(如\u001B=)来自 DEC VT100s,用于切换终端使用应用方式用于光标键 (DECCKM) 和数字键盘 (DECKPAM)。这些由程序使用,例如less在初始化终端时,因为终端描述使用应用程序(或正常)模式转义序列作为特殊键匹配这些终端描述中给出的初始化字符串。

进一步阅读:

答案2

ESC[?1049h似乎是来自DEC 私有模式集:

将光标保存为 DECSC 并使用备用屏幕缓冲区,首先清除它。 (这可能会被 titeInhibit 资源禁用)。这结合了 1 0 4 7 和 1 0 4 8 模式的效果。将此用于基于 terminfo 的应用程序,而不是 4 7 模式。

http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Functions-using-CSI-_-ordered-by-the-final-character_s_

请注意,CSI翻译为ESC[.

相关内容