【问题标题】:VT100 ANSI escape sequences: getting screen size, conditional ANSIVT100 ANSI 转义序列:获取屏幕大小,条件 ANSI
【发布时间】:2015-08-08 22:20:18
【问题描述】:
  1. 当我在终端上调整大小时,它保持全屏显示。 我想,有某种方法可以找出终端的屏幕尺寸。如何在 VT100 中做到这一点?

  2. 使用 ,当我列出文件夹时,它以蓝色显示文件夹。 (或者说不同的颜色)但是,如果您将输出保存到文本文件( ls > out.txt )中,您将看不到任何 ANSI 代码,而是纯文本。但是,如果您尝试 (vi > out.txt),您将看到 ANSI 代码。怎么知道的?

谢谢

【问题讨论】:

    标签: linux escaping ansi vt100


    【解决方案1】:

    自动调整屏幕大小的程序(例如vi)响应SIGWINCH 信号,并使用系统调用获取系统关于屏幕大小的信息。参见例如 Get width/height of a terminal window in c++?。顺便说一句,虽然它被广泛实施,但它似乎没有记录在 POSIX signal.h 中。

    在不考虑SIGWINCH 的情况下,程序可以终端询问其屏幕尺寸。 resize 程序通过将终端控制序列发送到

    • 将光标移到右下角(实际上是移到第 999/999 行/第 999 列,这已经足够好了),并且
    • 询问终端光标的真正位置。

    lsvi(和其他程序)关于将嵌入其输出中的 ANSI 控制序列的行为取决于程序的设计。他们可能会使用isatty 函数检测到其输出重定向到文件,并根据输出是到终端还是到文件执行不同的操作。

    【讨论】:

    • 终端程序(以及像 ncurses 这样的库)不使用光标移动技术,而是使用TIOCGWINSZioctl。
    • 您的评论与答案无关(已指向使用 termios 的示例程序)。
    • @sim642 感谢您提供有关常见做法的信息;与答案非常相关!
    猜你喜欢
    • 2021-01-15
    • 2013-03-15
    • 2012-04-07
    • 2012-04-14
    • 2011-09-27
    相关资源
    最近更新 更多