终端:我在哪里?

时间:2011-02-10 15:18:11

标签: perl terminal cursor-position termcap

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

#!/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 个答案:

答案 0 :(得分:4)

您可以使用curses代替。它有getcurx()getcurx()。它有CPAN module(以及Debian或Ubuntu中的libcurses-perl包)。

答案 1 :(得分:3)

我认为您无法使用termcap确定光标位置。

The termutils manual说:

  

如果计划在应用程序中使用相对光标运动命令,则必须知道起始光标位置是什么。为此,您必须跟踪光标位置并在每次输出到终端时更新记录,包括图形字符。

答案 2 :(得分: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开始计算)。

然而,这可能不应该依赖,因为没有很多终端真正支持这一点。

答案 3 :(得分:0)

打印ESC [6n在ANSI兼容终端将为您提供当前光标位置为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";'