C 获取哪个端子列I';我在写
在我的C程序中,我想知道光标在终端中的位置。例如,另一个程序可能在我之前写了一些东西,我想知道在终端的最后一列之前还有多少空间,或者我不知道终端对一些特殊序列的反应(比如颜色:我可以写,但它们没有显示) 有什么建议吗 编辑:最好避免像ncurses这样过于复杂的解决方案(ncurses不直接知道光标在哪里:它计算光标的位置) 编辑2:我找到了一种方法,但它只适用于非图形终端:C 获取哪个端子列I';我在写,c,terminal,C,Terminal,在我的C程序中,我想知道光标在终端中的位置。例如,另一个程序可能在我之前写了一些东西,我想知道在终端的最后一列之前还有多少空间,或者我不知道终端对一些特殊序列的反应(比如颜色:我可以写,但它们没有显示) 有什么建议吗 编辑:最好避免像ncurses这样过于复杂的解决方案(ncurses不直接知道光标在哪里:它计算光标的位置) 编辑2:我找到了一种方法,但它只适用于非图形终端: 编辑3:代码不错,运行良好,但它使用了/dev/vcsaN(与编辑2的问题相同):您可以尝试使用ncurses”。ncu
编辑3:代码不错,运行良好,但它使用了/dev/vcsaN(与编辑2的问题相同):您可以尝试使用ncurses”。ncurses是一个用于创建基于终端的文本界面的强大库
tputs
是一个简单的低级通用函数,用于操作终端功能
任何一个都可以满足您的需要。此解决方案不是最佳解决方案,因为它引用了/dev/vcsa*。希望这能帮助其他人
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
int fd;
char *device = "/dev/vcsa2";
struct {unsigned char lines, cols, x, y;} scrn;
fd = open(device, O_RDWR);
if (fd < 0) {
perror(device);
exit(EXIT_FAILURE);
}
(void) read(fd, &scrn, 4);
printf("%d %d\n", scrn.x, scrn.y);
exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
内部主(空)
{
int-fd;
char*device=“/dev/vcsa2”;
结构{无符号字符行,cols,x,y;}scrn;
fd=开路(装置,O_RDWR);
如果(fd<0){
perror(装置);
退出(退出失败);
}
(无效)读取(fd和scrn,4);
printf(“%d%d\n”,scrn.x,scrn.y);
退出(退出成功);
}
通常,您应该记住光标的位置
然而,大多数终端确实响应DSR;设备状态请求。发送
CSI 6 n
您将收到CPR
;光标位置报告,格式为
CSI Pl;Pc R
其中,
Pl
和Pc
给出光标行和列号,从1开始索引。int get\u column(){printf(“\n\r”);return 0;}
bash不是终端。@H2CO3我需要在它所在的位置,不以新的方式移动光标line@n.m.根据Shell修复没有列或光标。tput
很好,但我不知道如何使用它来获取当前位置。我的记忆失败了,是tput,不是tput,它比我想象的要复杂一些,而且它是ncurses的一部分。因此,使用它不会带来任何好处。坚持使用getyx可能是明智的。顺便说一下,使用tput是可能的<代码>stty-回波;tput u7;read-drpos;stty回波;echo${pos#??}如果我使用echo-ne“\e[6n”
同样可以工作,现在我必须了解如何在C程序中获取这些数据。tput是一个可执行命令,tputs是库中的函数。终端功能是数据库,u7
是键,tigetstr
是查找运算符,\e[6n
是值。数据库通常位于/usr/share/terminfo
,但请参阅人诅咒
的环境部分。数据库格式在人terminfo
中描述,很容易解析。它似乎只能在ncurses程序中使用,而我需要查看比赛。也许我错了(我不使用ncurses)。@FrancescofRasinelli:对于终端处理,curses
是最简单的选择。printf()
是向终端发送内容的传统方式。但是,您通常会读取终端输入。有很多方法。完全手动使用termios
+read
,或某种包装库。例如,我的libtermkey
,我主要是为类似的内容编写的。我可以使用read使用bash来完成这项工作(正如你在另一条评论中看到的),但不是在虚拟终端的C语言中。你能提供一个例子吗?