在linux终端中获取光标位置和终端大小
Getting cursor position and terminal size in linux terminal
在我的基于控制台的Linux C++应用程序中,我想获得终端的大小(行+列)和当前光标位置。对于后者,我认为我可以使用ANSI代码,但我不确定如何正确解析它。我也不知道怎样才能得到窗户的大小?
由于其他原因,目前无法选择切换到ncurses。
获取大小的旧方法是使用libtermcap进行termcap。新的是terminfo(+lib)。我建议使用一个将这些(以及所有其他与终端相关的东西)抽象掉的库,并使用像(n)curses这样的终端输出库。
此外,这也适用于其他Unix系统。
要获取大小,正确的方法是调用TIOCGWINSZ
ioctl()
。我的代码中的一个例子:
struct winsize ws = { 0, 0, 0, 0 };
if(ioctl(tt->outfd, TIOCGWINSZ, &ws) == -1)
return;
/* ws.ws_row and ws.ws_col now give the size */
您最初需要这样做,然后在收到SIGWINCH
信号后再次这样做,该信号通知WINdow CHange。
至于获得光标的位置,这有点困难。一些终端允许通过DSR6(设备状态报告)进行查询
$ echo -ne "e[6n"; cat -v
^[[62;1R
DSR的回复来自CSI R,这里告诉我(基于1)第62行,第1列。
然而,由于并非所有终端都支持DSR6,因此最简单的方法可能是不依赖于能够查询光标位置,而是以绝对的方式执行初始终端寻址,将光标准确地放置在您想要的位置。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 如何在linux终端中同时编译和运行c++代码
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 终端不会为C++文件创建.exe文件吗
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 在linux终端中获取光标位置和终端大小
- 鼠标位置/控制终端,OSX