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 に答える