我在Ubuntu处理一个问题。我想通过Gcc获得当前键盘光标在终端的位置.
发布于 2022-04-19 17:38:11
“终端”是一种程序,或者更准确地说是对一大类程序的描述,它实现了一个模拟外部终端的图形界面(它本来可以通过串行电缆连接到计算机,或者以某种类似的方式连接到您的计算机)。您的程序通过一种由操作系统实现的双向管道(“伪终端”)与终端仿真器进行通信;在您的程序看来,它像一对普通的流(stdin和stdout)。
Linux本身有一个名为“控制台”的终端仿真器,可以用来代替窗口管理器。现在很少有程序员使用它,但是如果你想实验的话,它仍然存在。控制台是一个“终端”(通常有几个终端可以在使用control+function键之间切换)。正如您从“终端”和“伪终端”这两个词中所期望的那样,它们在您的应用程序中基本上是一样的。
有大量的细节,我跳过了,因为它需要一本书来描述整个事情。
程序和终端(或伪终端)之间的唯一连接是,您可以向它发送一个字符流,并且可以从它接收一个字符流。没有其他的沟通。没有隐藏的操作系统接口,因为终端模拟器不是操作系统的一部分。它甚至不是窗口管理器的一部分。它只是另一个没有特权运行的用户应用程序,就像您的应用程序一样。
您通常希望做的事情不仅仅是将字符发送到输出设备。也许您想要清除屏幕,或将光标移动到另一个位置,或者更改文本或背景的颜色。所有这些事情都是通过发送经过特殊编码的序列来完成的,这些序列与您正在显示的文本交织在一起。操作系统不对这些序列进行中介或验证,对于终端仿真器应该如何解释这些序列也没有明确的标准,但是在某种程度上,大多数终端仿真器都遵循共同的框架,这使得实际编写代码成为可能,而这些代码不需要知道目前使用的是哪个终端仿真器。终端库通常用于描述可用的终端;按照约定,环境变量TERM包含相关终端配置的名称,该配置可用于创建适合配置的终端Note 1的具体控制序列字符串。
现在让我们回到您最初的问题:“如何找到当前的光标位置?”这是少数可能的查询之一,这些查询也是作为控制序列实现的。具体来说,您向终端发送一个控件sequnce,该控件询问游标在哪里(通常是四个字符\x1B[6n),终端最终使用一个类似于\x1B12,7R的控制序列进行应答,这意味着当控制序列被发送到Note 2时,光标位于第7列的第12行。因此,您可以使用terminfo来帮助发送查询,然后尝试解析答复。
请注意,响应与查询不同步,因为用户可能在发送查询时键入。(但是,响应是作为一个连续序列发送的。)因此,解析过程的一部分是将用户输入与查询响应分离。
我猜你其实并不想做所有的工作。在大多数情况下,如果您想要编写一个控制台应用程序,它比将输出顺序写入终端窗口要少一些乏味,那么您应该使用诅咒 (也由Thomas维护)或其他类似的库。Ncurses完全负责维护控制台映像,跳过必要的环与终端仿真器通信;它的一个特性是跟踪当前光标位置注意事项3。
如果您只想提供更好的行编辑和选项卡完成,则另一种选择是使用GNU Readline库或其他操作系统可用的类似接口。
备注
https://stackoverflow.com/questions/71928245
复制相似问题