繁体   English   中英

如何在Linux终端获取当前键盘cursor position

[英]How to get current keyboard cursor position in Linux terminal

我正在处理 Ubuntu 中的一个问题。我想通过 Gcc 在终端中获取当前键盘 cursor position 任何帮助...

“终端”是一个程序,或者更准确地说是对 class 大程序的描述,它实现了一个模拟外部终端的图形界面(它可以通过串行电缆或以某种类似的方式连接到您的计算机)。 您的程序通过操作系统实现的一种双向 pipe(“伪终端”)与终端仿真器通信; 对于您的程序,它看起来像是一对普通的流( stdinstdout )。

Linux 本身有一个终端仿真器,称为“控制台”,可以用来代替 window 管理器。 现在很少有程序员使用它,但如果您想试验,它仍然存在。 控制台是一个“终端”(通常有几个终端,您可以使用 control+function 键在它们之间切换)。 正如您对“终端”和“伪终端”这两个词所期望的那样,它们对您的应用程序来说基本上是一样的。

有很多细节,我跳过了,因为需要一本书来描述整个事情。

您的程序和终端(或伪终端)之间的唯一联系是您可以向它发送一个 stream 个字符,并且您可以从它接收一个 stream 个字符。 没有其他交流。 没有隐藏的操作系统界面,因为终端仿真器不是操作系统的一部分。 它甚至不是 window 经理的一部分。 它只是另一个没有特殊权限运行的用户态应用程序,就像您的应用程序一样。

除了将字符发送到 output 设备之外,您通常还想做其他事情。 也许您想清除屏幕,或将 cursor 移动到另一个位置,或更改文本或背景的颜色。 所有这些事情都是通过发送散布在您正在显示的文本中的特殊编码序列来完成的。 操作系统不调解或验证这些序列,终端仿真器应该如何解释它们也没有明确的标准,但是大多数终端仿真器在某种程度上都遵循一个通用框架,这使得实际编写代码成为可能它不需要确切知道目前正在使用哪个终端仿真器。 terminfo 库通常用于描述可用的终端; 按照惯例,环境变量TERM包含相关 terminfo 配置的名称,该配置可用于创建适用于已配置终端的具体控制序列字符串 [注 1]。

现在让我们回到您最初的问题:“我如何找到当前的 cursor 位置?” 这是少数可能的查询之一,它们也被实现为控制序列。 具体来说,您向终端发送一个控制序列,询问 cursor 在哪里(通常是四个字符\x1B[6n ),终端最终回复一个可能类似于\x1B12,7R的控制序列,这意味着 cursor 已打开发送控制序列时第 12 行第 7 列 [注 2]。 因此,您可以使用terminfo来帮助您发送查询,然后在收到回复时尝试解析该回复。

请注意,响应与查询不同步,因为用户可能在发送查询时正在键入。 (但是,响应是作为连续序列发送的。)因此,解析过程的一部分是将用户输入从查询响应中分离出来。

我的猜测是您实际上并不想完成所有这些工作。 在大多数情况下,如果你想编写一个控制台应用程序来做一些比将 output 顺序写入终端 window 更简单的事情,你应该使用ncurses (也由 Thomas Dickey 维护)或其他类似的库。 Ncurses全面负责维护控制台图像,跳过必要的环节与终端仿真器进行通信; 它的功能之一是跟踪当前 cursor position [注 3]。

如果您只是想提供更好的行编辑和制表符补全,另一种选择是使用GNU Readline库或其他操作系统可用的类似接口。


笔记

  1. 这可能是也可能不是您实际使用的终端,因为TERM只是一个环境变量。 如果你愿意,你可以自己设置。

  2. 我从man 4 console_codes中获取了这些代码; 另一个很好的信息来源是Thomas Dickey 的xterm理解的代码序列的简洁列表

  3. 据我所知,Ncurses 不使用光标位置查询来确定 cursor 在屏幕上的位置。 它维护自己正在显示的屏幕副本,其中包括当前的 cursor position。您可以使用宏getyx()来询问它认为当前的 cursor position。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM