使用在CLI模式下运行的PHP脚本,我想以一种可移植的方式获取光标位置。带有代码:// Query Cursor Positionecho "\033[6n";在终端中,此代码报告光标位置,如下所示:wb ?> ./script.php ^[[5;1Rwb ?> ;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;1Rstring(0) ""wb ?>有没有一种方法可以无误地获得光标位置?
2 回答
qq_花开花谢_0
TA贡献1835条经验 获得超7个赞
与“便携式”相比,使用硬编码的终端序列还有很长的路要走。尽管当前可用的大多数终端仿真器将支持具有共同基础的ANSI,vt100或xterm代码,但是有一个定义非常明确的API用于访问称为“ curses”的交互式终端。一个PHP扩展的PECL可用。这只是curses系统的存根接口-存在于任何Unix / Linux系统上。尽管可以使用cygwin或pdcurses在mswindows上进行设置,但这并不容易。您没有提及您正在使用的操作系统。(mswindows控制台使用ANSI序列)
有一个基于termcap(curses的前身)的工具包(hoa)可能会有用。
要“检索”您只需要从stdin中读取的数据(尽管建议对此使用非阻塞)。
- 2 回答
- 0 关注
- 220 浏览
添加回答
举报
0/150
提交
取消