2012-04-23 10 views
0

Term::ReadKeyはそれを行うことができ、同様の方法でTerm::TermKeyとカーソル位置のホールドを取得することが可能です:Term :: TermKeyでカーソルの位置を捕まえることがどうにかできますか?

#!/usr/bin/env perl 
use warnings; 
use 5.12.0; 
use Term::ReadKey; 

ReadMode 4; 

system('clear') == 0 or die $?; 
print "Hello world\n" x 4; 
print "go to column 21 -> |"; 

print "\e[6n"; 
my ($x, $y) = getch(); 
say "Col: $x - Row: $y"; 

ReadMode 0; 

sub getch { 
    my $c = ReadKey 0; 
    if ($c eq "\e") { 
     my $c = ReadKey 0.10; 
     if ($c eq '[') { 
      my $c = ReadKey 0; 
      if ($c =~ /\A\d/) { 
       my $c1 = ReadKey 0; 
       if ($c1 ne '~') { 
        my $y = 0 + $c; 
        while (1) { 
         last if $c1 eq ';'; 
         $y = 10 * $y + $c1; 
         $c1 = ReadKey 0; 
        } 
        my $x = 0; 
        while (1) { 
         $c1 = ReadKey 0; 
         last if $c1 eq 'R'; 
         $x = 10 * $x + $c1; 
        } 
        return $x, $y; 
       } 
      } 
     } 
    } 
} 

答えて

2

まだ、私はそれのための計画に取り組んでいます。

use Term::TermKey; 

my $tk = Term::TermKey->new; 

syswrite STDOUT, "\e[6n"; 

while($tk->waitkey(my $key)) { 
    if($key->type_is_position) { 
    printf "The cursor is at %d, %d\n", $key->line, $key->col; 
    } 
} 

は、他のCSIシーケンスをフックする機能など、最初の基礎となるCライブラリのいくつかの余分なサポートが必要です:そうのようなものを探して、新しいイベントタイプとして報告されます。それが終わってしまえば、CSIを通じた他の多くのステータスレポートなど、今後もっと多くのものをサポートするほうがはるかに簡単であるはずです。


編集2012年4月26日:私は今libtermkey 0.15とTerm::TermKey 0.14をリリースしましたが、前述したように、このAPIを持っています。

+0

libtermkey 0.15(私はAlien :: libtermkeyアップデートを期待しています:)をインストールする方法がわからないので、まだ試してみることができませんでした。 –

+0

あなたは元のアップストリームのtarballからインストールできます...;) また、Alien :: libtermkeyのアップデートもあります。 – LeoNerd

+0

'is_position'を' type_is_position'に置き換えると動作します。 –

関連する問題