我知道以下语句是一种查询当前光标位置的方法:
echo -en '\033[6n'
有谁知道如何查询光标下的字符或使用当前屏幕/窗口的内容填充数组?我已经通过ANSI终端命令进行了搜索,但是很多这些命令都是非常抽象的,看起来它们看起来不会正常。我也考虑过用tcup
命令做这件事而没有运气。
感谢您的帮助。
答案 0 :(得分:6)
ANSI终端实际上并不需要能够告诉您屏幕上的内容。如果你需要这些信息,你应该记住自己。例如,流行的ncurses
库就是这样做的,虽然它只允许您将屏幕导出到文件,但文件格式没有记录。无论如何,bash
不使用ncurses
,所以它实际上对控制台的状态一无所知。
最有可能的是,您所谈论的屏幕实际上是某些终端仿真程序(如xterm
)的工件。这些程序在用户空间中运行,很少(如果有的话)具有外部查询接口。但是,linux确实有一个控制台(实际上,有许多模拟控制台,但使用显示器的控制台模式)并且它维护这些控制台的显示内存。此外,它提供了一个用于读取控制台内存的接口,通常以/dev/vcsN
形式提供(对于{0}的值,介于0和Linux编译的虚拟控制台的数量之间)。 N
是“当前”控制台(可见的控制台)。
大多数Linux发行版限制对/dev/vcs0
的访问,因此如果您想要使用它们,您将需要特殊权限,或者您需要使用root权限来更改设备文件的访问权限。 (Ubuntu似乎对/dev/vcsN
组中的用户提供rw
访问权限;请检查tty
以查看您的系统是如何进行的。)(当然,您需要找到控制台:-)尝试 Ctl Alt 1 ; Ctl Alt 7 可能会回复你的GUI。)
一旦解决了访问问题,您就可以执行ls -l /dev/vcs0
之类的操作来查看它。您会发现它只是一个没有换行符的2D字符数组,并且没有指示尺寸是什么。 (您可以使用cp /dev/vcs0 console_memory
或查看环境变量ioctl
和$LINES
来获取维度。)
您可以使用$COLUMNS
代替;它的格式略有不同,每个字符使用两个字节,以便存储显示属性(主要是前景色和背景色)以及字符。此外,/dev/vcsa0
的前四个字节是屏幕尺寸和光标位置(每个坐标一个字节),这将为您节省查询光标位置的工作。
请注意,控制台不支持完整的Unicode字符集。实际上,它一次只能显示512个不同的字形。为了最大化可用的字形空间,Linux可能会将某些代码重新分配给所需的符号,并且此映射不是控制台内存的一部分。因此,从控制台内存中提取的代码可能没有明显映射到Unicode代码,但它应该适用于标准ANSI字符。