这是一段简单的代码,它绘制一个绿色条几乎与屏幕一样长,并在最后写一个数字,定期刷新(代码是PHP,但它只是常规的ascii代码):
function update($x)
{
// get the console width
$width = exec('tput cols');
// go back up a line if this isn't the first line
if($x) {
echo "\033[1A";
}
// print a green bar with a number at the end
echo "\033[42m" . str_repeat(' ', $width - 4) . "$x ";
// reset formatting and add a new line for next time
echo "\033[0m\n";
}
for($i = 0; $i < 100; ++$i) {
update($i);
// sleep for 0.1 seconds
usleep(100000);
}
当窗口调整大小时,会按预期填充新空间,但是然后您尝试缩小窗口,布局会全部损坏。
我不想重置整个窗口,只需确保该行始终是控制台的宽度(末尾的数字)。这可能吗?
答案 0 :(得分:1)
您可以为SIGWINCH
事件注册信号处理程序。如果窗口大小发生变化,将发出此事件。
在信号处理程序代码中,您将重新绘制绿色条:
declare(ticks = 1);
// Called if the window will get resized
function sig_handler($signo)
{
update(123);
}
function update($x)
{
// Restore Cursor
echo "\033[u";
// Erase line
echo "\033[1K";
// Get the console width
$width = exec('tput cols');
// Go back up a line if this isn't the first line
if($x) {
echo "\033[1A";
}
// Print a green bar with a number at the end
echo "\033[42m" . str_repeat(' ', $width - 4) . "$x ";
// Reset formatting and add a new line for next time
echo "\033[0m\n";
}
// Register Signal handler
pcntl_signal(SIGWINCH, "sig_handler");
// Save cursor position
echo "\033[s";
update(123);
// Your program ...
while(true) {
sleep(1);
}
您可以使用ANSI terminal reference关注我使用的终端代码。