在linux终端中获取光标位置和终端大小

Getting cursor position and terminal size in linux terminal

本文关键字:终端 位置 获取 linux 光标      更新时间:2023-10-16

在我的基于控制台的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,因此最简单的方法可能是不依赖于能够查询光标位置,而是以绝对的方式执行初始终端寻址,将光标准确地放置在您想要的位置。