VT100 ANSI转义序列:获取屏幕大小,条件ANSI

Gon*_*Gon 5 linux escaping ansi vt100

  1. 当我在终端上调整大小时,它会全屏显示.我猜,有些东西可以找出终端的屏幕尺寸.我怎么能在VT100中做到这一点?

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

谢谢

Tho*_*key 7

vi自动调整到屏幕大小调整的程序(例如)响应SIGWINCH信号,并使用系统调用获取系统有关屏幕大小的信息.请参阅例如在c ++中获取终端窗口的宽度/高度?.顺便说一句,虽然广泛实施,但似乎没有在POSIX中记录signal.h.

如果不考虑SIGWINCH,程序可以终端询问其屏幕大小.该resize程序是这种情况,通过发送终端控制序列

  • 将光标移动到右下角(实际上,移动到行/列999/999,这已经足够了),和
  • 询问终端光标到底在哪里.

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

  • 终端程序(和像ncurses这样的库)不使用光标移动技术,而是使用`TIOCGWINSZ` ioctl. (3认同)
  • @ sim642感谢您提供有关常见做法的信息; 与答案非常相关! (3认同)