如何区分终端回复和用户输入?

如何区分终端回复和用户输入?

例如,在程序中我想获取终端上的当前光标位置tput u7\E[6n在 xterm 上)

CSI P s n

P s = 6 → Report Cursor Position (CPR) [row;column] as CSI r ; c R

我将此序列写入程序中的标准输出。之后,我在标准输入上读取了终端的回复。 (在此期间 tty 处于原始模式)

问题是:如果用户恰好在发送请求后但在发送回复之前或在回复中间输入转义序列(通过按某个键)或数字或任何内容,该怎么办?这个功能应该如何运作?这个机制有缺陷吗,还是我遗漏了什么?

答案1

报告光标位置和键盘输入都来自您的终端。如果终端收到这样的转义序列,则应在发送缓冲的键盘输入之前对其进行解释。只有在发送光标位置后,才应将键盘输入发送到程序。我不能说这里的所有终端是否都能正常工作。如果终端中有客户端软件,您就无法控制这一点。

答案2

根据我的测试,它适用于单键按下。但如果您粘贴文本,例如hello,所有位置报告都出现在第二个字母 ( e) 之后:

例子

我假设您需要首先对所有缓冲输入进行排队,然后才能询问光标位置。

相关内容