如何使用PHP-CLI获取光标位置?

使用在CLI模式下运行的PHP脚本,我想以一种可移植的方式获取光标位置。


带有代码:


// Query Cursor Position

echo "\033[6n";

在终端中,此代码报告光标位置,如下所示:


wb ?> ./script.php 

^[[5;1R

wb ?> ;1R 

但是,我无法在代码中检索两个值(行:5,列:1)。


经过对输出缓冲的一些测试之后:


ob_start();

echo "\033[6n";

$s = ob_get_contents();

file_put_contents('cpos.txt',$s);

我在cpos.txt文件中输入了“ \ 033 [6n”,而不是设备的答案。


并阅读STDIN:


$timeout = 2;

$sent = false;

$t = microtime(true);

$buf = '';

stream_set_blocking(STDIN,false);

while(true){

    $buf .= fread(STDIN,8);

    if(!$sent){

        echo "\033[6n";

        $sent = true;

    }

    if($t+$timeout<microtime(true))

        break;

}

var_dump($buf);

缓冲区为空,但终端显示设备答案:


wb ?> ./script.php 

^[[5;1R

string(0) ""

wb ?>

有没有一种方法可以无误地获得光标位置?


慕尼黑的夜晚无繁华
浏览 223回答 2
2回答

qq_花开花谢_0

与“便携式”相比,使用硬编码的终端序列还有很长的路要走。尽管当前可用的大多数终端仿真器将支持具有共同基础的ANSI,vt100或xterm代码,但是有一个定义非常明确的API用于访问称为“ curses”的交互式终端。一个PHP扩展的PECL可用。这只是curses系统的存根接口-存在于任何Unix / Linux系统上。尽管可以使用cygwin或pdcurses在mswindows上进行设置,但这并不容易。您没有提及您正在使用的操作系统。(mswindows控制台使用ANSI序列)有一个基于termcap(curses的前身)的工具包(hoa)可能会有用。要“检索”您只需要从stdin中读取的数据(尽管建议对此使用非阻塞)。
打开App,查看更多内容
随时随地看视频慕课网APP