4

是否有变量或函数可以告诉我光标的实际位置?

#!/usr/bin/env perl
use warnings;
use 5.012;

use Term::ReadKey;
use Term::Cap;
use POSIX;

my( $col, $row ) = GetTerminalSize();

my $termios = new POSIX::Termios;
$termios->getattr;
my $ospeed = $termios->getospeed;

my $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };

# some movement ...

# at which position (x/y) is the cursor now?
4

4 回答 4

4

你可以curses改用。它有getcurx()getcurx()。它有一个CPAN 模块(以及libcurses-perlDebian 或 Ubuntu 中的软件包)。

于 2011-02-10T16:14:33.533 回答
3

我认为您无法使用termcap.

termutils 手册说:

如果您打算在应用程序中使用相对光标移动命令,您必须知道起始光标位置是什么。为此,您必须跟踪光标位置并在每次向终端输出任何内容(包括图形字符)时更新记录。

于 2011-02-10T15:23:47.310 回答
1

部分终端可能支持查询位置,如CSI 6 n. 如果支持,该位置将报告为CSI Pl;Pc R。例如

$ echo -e "\e[6n"; xxd

^[[4;1R
0000000: 1b5b 343b 3152 0a                      .[4;1R.

这会报告光标位于第 4 行的第 1 列(从 1 开始计数)。

但是,这可能不应该依赖,因为实际上支持这一点的终端并不多。

于 2012-04-21T23:07:36.677 回答
0

在 ANSI 兼容终端打印 ESC[6n 将为您提供当前光标位置为 ESC[n;mR,其中 n 是行,m 是列

因此,请尝试使用终端转义字符来阅读它。像这样的东西:

perl -e '$/ = "R";' -e 'print "\033[6n";my $x=<STDIN>;my($n, $m)=$x=~m/(\d+)\;(\d+)/;print "Current position: $m, $n\n";'
于 2013-05-03T14:56:56.990 回答