【问题标题】:terminal: where am I?终端:我在哪里?
【发布时间】:2011-06-24 22:33:18
【问题描述】:

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

#!/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?

【问题讨论】:

    标签: perl terminal cursor-position termcap


    【解决方案1】:

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

    The termutils manual 说:

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

    【讨论】:

    • 但这是一个很大的“如果” - 如果您打算将自己限制为相对光标移动命令(对于旧终端,您可能需要这样做,或打印机),那么还有其他可用选项,尤其是在现代终端上 - 例如query cursor position 序列。 (“现代”在这里的意思是“或多或少自 1980 年以来生产的任何东西”:-)。
    • @psmears 已授予。有办法实际上做到这一点。不过,sid_com 将其标记为 termcap。有了它,这是不可能的。
    • 实际上(至少在某些版本的 Linux 中分发的 termcap 至少 - 由 Eric Raymond 维护的那个)“u7”字符串是“查询光标位置”序列,而“ u8" 字符串是描述响应的格式字符串(有关描述,请参阅/etc/termcap)。
    【解决方案2】:

    您可以改用curses。它有getcurx()getcurx()。它有一个 CPAN module (以及 Debian 或 Ubuntu 中的 libcurses-perl 包)。

    【讨论】:

    • OP 将其标记为 termcap。不过,为替代方案 +1。
    • getcurx()getcury() 只需返回 curses 光标所在位置的想法。他们实际上并没有询问真正的终端。
    【解决方案3】:

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

    $ echo -e "\e[6n"; xxd
    
    ^[[4;1R
    0000000: 1b5b 343b 3152 0a                      .[4;1R.
    

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

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

    【讨论】:

      【解决方案4】:

      在 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";'
      

      【讨论】:

        猜你喜欢
        • 2016-09-07
        • 1970-01-01
        • 2020-11-15
        • 2013-02-12
        • 1970-01-01
        • 2010-12-29
        • 2015-12-06
        • 1970-01-01
        • 2010-11-08
        相关资源
        最近更新 更多