【问题标题】:ANSI escape sequence save/restore cursor position supportANSI 转义序列保存/恢复光标位置支持
【发布时间】:2015-05-13 06:02:45
【问题描述】:

是否有任何已知的终端支持向上、向下、向前和向后光标键的 ANSI 转义序列:

CSI n A     Cursor Up
CSI n B     Cursor Down
CSI n C     Cursor Forward
CSI n D     Cursor Back

但不支持保存光标位置和恢复光标位置转义序列?

CSI s       Save Cursor Position
CSI u       Restore Cursor Position

【问题讨论】:

    标签: terminal ansi-escape


    【解决方案1】:

    真正的 VT100(或 VT220)无法识别这些用于保存/恢复光标位置的控制序列。他们使用(如 xterm 的 control sequences 列表中所述)

    ESC 7     Save Cursor (DECSC).
    ESC 8     Restore Cursor (DECRC).
    

    这些是 terminfo 中的 scrc 功能;您可能会看到这些使用列出的

    infocmp vt100
    infocmp vt220
    

    CSI sCSI u 的来源很可能来自 ansi.sys(请参阅终端数据库条目以获取 ansi.sys-old),但始终可以使用较旧的来源。

    【讨论】:

    • 使用ESC 7ESC 8 似乎更安全。 CSI sCSI u 序列被 iTerm 2 识别,但不能被 macOS 上的 Terminal.app 识别。同样,asciinema 在录制时也无法识别它们。
    • 如果在ESC 7ESC 8之后打印了一些文字怎么办?某些字符似乎使终端误以为 7 实际上是一个完全不同的命令的参数:P(例如,如果您发送 \033[7Hello 它实际上将光标移动到第 7 列并在那里打印 ello,因为初始H 是“移动光标”命令。有没有办法终止7 之后的转义序列,这样后面的文本就不会被解释为命令?
    • ESC 7ESC [ 7 不同,因为后者(前两个字符)是标准化的,而前者取决于终端。第二个之后的任何控制字符都将终止序列(在符合标准的终端上,无论如何)。
    • 有趣,我不知道有两个! :o 确实ESC 7 对我有用。尽管另一个(如您所说的“标准化”)也能正常工作,但它会很好。是否有任何控制字符可以终止序列而不会弄乱输出? (某种“什么都不做”转义序列)
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 2014-09-26
    • 2013-04-18
    相关资源
    最近更新 更多