gpt4 book ai didi

linux - 如何在bash中查询当前光标位置下或屏幕上任意位置的字符

转载 作者:IT王子 更新时间:2023-10-29 01:16:04 27 4
gpt4 key购买 nike

我知道下面的语句是查询当前光标位置的一种方式:

echo -en '\033[6n'

有谁知道如何查询光标下的字符或用当前屏幕/窗口的内容填充数组?我已经搜索过 ANSI 终端命令,但是其中很多都非常抽象,看起来它们不会正确地执行此操作。我也研究过使用 tcup 命令来完成它,但没有成功。

感谢您的帮助。

最佳答案

ANSI 终端并不是真正需要能够告诉您屏幕上显示的内容。如果您需要这些信息,您应该自己记住这一点。例如,流行的 ncurses 库就是这样做的,尽管它只允许您将屏幕导出到文件,并且没有记录文件格式。无论如何,bash 不使用 ncurses,因此它实际上对控制台的状态一无所知。

很可能,您所说的屏幕实际上是某些终端仿真程序(如 xterm)的产物。这些程序在用户空间中运行,很少(如果有的话)有外部查询接口(interface)。然而,linux 确实有一个控制台(实际上是许多模拟控制台,但使用显示器的控制台模式)并且它维护这些控制台的显示内存。此外,它还提供了一个用于读取控制台内存的接口(interface),通常以 /dev/vcsN 的形式提供(N 的值介于 0 和 linux 编译的虚拟控制台数量之间)和)。 /dev/vcs0 是“当前”控制台(可见的控制台)。

大多数 linux 发行版都限制对 /dev/vcsN 的访问,因此如果您想使用它们,您要么需要特殊权限,要么需要使用 root 权限来更改访问权限设备文件的权限。 (Ubuntu 似乎向 tty 组中的用户提供 rw 访问权限;检查 ls -l/dev/vcs0 以了解您的系统是如何做到的。 ) (当然,您需要找到控制台 :-) 尝试 CtlAlt1; CtlAlt7 可能会把你的 GUI 还给你。)

解决访问问题后,您可以执行类似cp/dev/vcs0 console_memory 的操作来查看它。您会发现它只是一个二维字符数组,没有换行符,也没有显示尺寸。 (您可以使用 ioctl 或查看环境变量 $LINES$COLUMNS 来获取维度。)

您可以使用 /dev/vcsa0 代替;它的格式略有不同,每个字符使用两个字节来存储显示属性(主要是前景色和背景色)以及字符。另外,/dev/vcsaN的前四个字节是屏幕尺寸和光标位置(每个坐标一个字节),这样可以省去查询光标位置的工作。

请注意,控制台不支持完整的 Unicode 字符集。事实上,它一次只能显示 512 个不同的字形。为了最大化可用的字形空间,Linux 可能会将一些代码重新分配给需要的符号,并且这种映射不是控制台内存的一部分。因此,从控制台内存中提取的代码可能没有明显映射到 Unicode 代码,但它应该可以很好地用于标准 ANSI 字符。

关于linux - 如何在bash中查询当前光标位置下或屏幕上任意位置的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27004304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com