Термин :: Cap: "ключ вверх" не работает - PullRequest
2 голосов
/ 15 ноября 2011
#!/usr/bin/env perl
use warnings;
use 5.014;
use Term::Cap;
use POSIX;

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

my $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed };
$terminal->Trequire("ku");  # move cursor up
my $UP = $terminal->Tputs("ku");
my $t = 500;
while ($t > 0) {
    printf "Hour: %d    \n", $t/3600;
    printf "Minute: %d    \n", ($t/60)%60;
    printf "Second: %d    \n", $t%60;
    print $UP,$UP,$UP;
    sleep 5;
    $t -= 5;
}

Когда я пытаюсь это сделать (найдено здесь: Как я могу обновить значения на экране, не очищая его в Perl? ), я получаю этот вывод:

Hour: 0    
Minute: 8    
Second: 20    
AAAHour: 0    
Minute: 8    
Second: 15    
AAAHour: 0    
Minute: 8    
Second: 10    
AAAHour: 0    
Minute: 8    
Second: 5 

это значит, что key-up не работает с моим терминалом?

1 Ответ

4 голосов
/ 15 ноября 2011

Вы неправильно поняли возможность ku. Это последовательность символов, генерируемая, когда пользователь нажимает клавишу стрелки вверх на терминале. Чтобы на самом деле переместить курсор вверх на экране, вы печатаете возможность up. (Кроме того, лучше избегать синтаксиса косвенных объектов, хотя это не имеет никакого отношения к вашей проблеме.)

Вот исправленная версия:

#!/usr/bin/env perl
use warnings;
use 5.014;
use Term::Cap;
use POSIX;

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

my $terminal = Term::Cap->Tgetent({ TERM => undef, OSPEED => $ospeed });
$terminal->Trequire("up");  # move cursor up
my $UP = $terminal->Tputs("up");

my $t = 500;
while ($t > 0) {
    printf "Hour: %d    \n", $t/3600;
    printf "Minute: %d    \n", ($t/60)%60;
    printf "Second: %d    \n", $t%60;
    print $UP,$UP,$UP;
    sleep 5;
    $t -= 5;
}

Может оказаться полезным руководство Termcap . Он объясняет, что означают все возможности .

...