php预填充性STDIN进行编辑



我正在编写一个小命令行脚本,用于管理我的应用程序中的某些数据。

我使用fgets()使用STDIN来读取用户输入。

当我添加新的数据时,我可以使用fgets()读取STDIN的新数据,然后将其添加到数据库中。

添加数据的示例CLI接口:

Value: <user input>

我可以使用:

获得此用户输入
$input = trim(fgets(STDIN));

我遇到问题的地方是编辑已经存在的数据的功能。

我想拥有的先前的值已预先填充用户输入。

编辑数据的示例CLI接口:

Value: <previous>

其中 <previous>是旧值,且可编辑。

我尝试使用fwrite()写入STDIN,但所编写的数据不是可编辑的,并且光标始于数据的末尾。

我的尝试:

// Prompt
echo 'Value: ';
// Try and put the old data into STDIN
fputs(STDIN, $old_data);
// Get the new value from STDIN
$new_data = trim(fgets(STDIN));

接口最终看起来像这样:

Value: <old_data>
                 ^
          Cursor Position

<old_data>无法编辑。

然后,来自fgets(STDIN)的返回数据仅给了我从光标启动位置后的数据。

我不确定如果没有任何疯狂的图书馆,PHP是否可行。任何帮助和想法都将不胜感激。

这将取决于您的外壳(我认为(,但是您可以用控制字符大多数XTERM进行操作。

bash的文档在这里:https://www.tldp.org/howto/bash-prompt-howto/x361.html

示例:

echo "foo: bar33[3D";

字符 33[<N>D将在示例3中移动光标向后n列,以将其放在bar的开头。

但是

我认为这不会做您期望的事情。正如您想象的那样,旧数据将不会"可编辑"。用户将无法移动光标,只需键入旧数据即可。另外,按Enter将不会提交"光标之后"。因此,您可能想查看ncurses

另外,通常在Linux世界中所做的是这样的提示:

Value (previous):

表示如果您简单地按" Enter",则使用"上一个"。在您的代码中,如果stdin为空,则只需使用以前的。

最新更新