当我在一个盒子里使用 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 是否应删除ti
和te
来自 TERMCAP 字符串的 termcap 条目(用于在启动许多面向屏幕的程序时在备用屏幕之间切换)。如果设置,xterm 还会忽略转义序列以切换到备用屏幕。 Xterm 以不同的方式支持 terminfo,支持复合控制序列(也称为私有模式)1047
,1048
和1049
与原来的效果相同47
控制序列。该资源的默认值为“false”。
1049 代码(引入于1998年) 是公认的大多数声称与 xterm 兼容的终端仿真器,但大多数都没有提供该功能选修的。所以他们并没有真正实现这个功能。
另一方面,\u001B[?1h
并非源自 xterm,而是(如\u001B=
)来自 DEC VT100s,用于切换终端使用应用方式用于光标键 (DECCKM) 和数字键盘 (DECKPAM)。这些由程序使用,例如less
在初始化终端时,因为终端描述使用应用程序(或正常)模式转义序列作为特殊键匹配这些终端描述中给出的初始化字符串。
进一步阅读:
- 为什么运行 vi 时屏幕不清除?(xterm 常见问题解答)
- 为什么我不能在(任何)shell 中使用光标键?(xterm 常见问题解答)
- 我的光标键不起作用(ncurses 常见问题解答)
- XTerm 控制序列
答案2
ESC[?1049h
似乎是来自DEC 私有模式集:
将光标保存为 DECSC 并使用备用屏幕缓冲区,首先清除它。 (这可能会被 titeInhibit 资源禁用)。这结合了 1 0 4 7 和 1 0 4 8 模式的效果。将此用于基于 terminfo 的应用程序,而不是 4 7 模式。
请注意,CSI
翻译为ESC[
.