php exec多条命令怎么拼接_PHP--手摸手,教你撸一个会自动补全的命令行工具1

前言

一次在使用symfony的时候,发现使用命令行的时候有些关键字会自动提示。

eef9b0483f123b564e096e3570bf2cb6.gif

介绍

随着laravel,symfony等框架的流行,命令行工具越来越流行,但是很多时候命令太多,根本无法记住所有参数,或者参数太长输入太不方便。
这时是否也想拥有一个像IDE中的自动补全功能?

手摸手,一起撸一个自动补全工具

获取命令行字符串

想自动补全,必须获取命令行输入的数据,那么如何获取数据呢?
具体可以参考官方文档 PHP获取命令输入,这里我们使用一种写法

$c = fread(STDIN, 1);

这样我们就可以获取每次输入的按键。

e39a2a63851a49a4d906aa3b5c3fec0e.gif

获取单个字符

进行了上面的操作以后,我们已经可以获取到输入的内容,但是发现一个问题,我们必须按下回车以后才可以获取到输入的内容,即使我们设置了fread最大读取的长度,那么究竟是什么问题的?
原来Linux终端中,默认是必须按下回车的。那么我们必须关闭这个功能。为了防止我们使用其他软件出现问题,我们不需要该功能后需要将其关闭。

//执行如下命令后,就可以一个字符一个字符的获取了
$sttyMode = shell_exec('stty -g');
shell_exec('stty -icanon -echo');

//恢复原来的状态
shell_exec(sprintf('stty %s', $sttyMode));

这时,我们在进行测试

66c2acd429f139f7da311319c2654dac.gif
$sttyMode = shell_exec('stty -g');
shell_exec('stty -icanon -echo');
$c = fread(STDIN, 1);
var_dump($c);
shell_exec(sprintf('stty %s', $sttyMode));

简易自动补全

<?php
 $sttyMode = shell_exec('stty -g');
shell_exec('stty -icanon -echo');
$autoComplete = [
    "Auto",
    "Complete"
];
$inputStream = STDIN;
while (!feof($inputStream)) {
    $c = fread($inputStream, 1);

    //是不是空
    if (false === $c || empty($c)) {
        throw new Exception('Aborted.');
    } elseif ("177" === $c) { // 删除按键
        //printf(177);
    } elseif ("033" === $c) {
        // printf(033);
        // $c .= fread($inputStream, 2);
        // printf($c);
    } elseif (ord($c) < 32) {
        // if ("t" === $c || "n" === $c) {
        //     if ("n" === $c) {
        //         break;
        //     }
        // }
        continue;
    } else {
        if ("x80" <= $c) {
            $c .= fread($inputStream, ["xC0" => 1, "xD0" => 1, "xE0" => 2, "xF0" => 3][$c & "xF0"]);
        }
        printf("r033[k");

        foreach($autoComplete as $one){
            if (strpos($one,$c)===0){
                printf($one);
            }
        }
    }
}


shell_exec(sprintf('stty %s', $sttyMode));

4fe59f87a795be34536446386cd74bcb.gif

下面我们在优化一下,当输入A以后,让光标在A的后边

49e2c38d0750ed1ebe6d9a2195f724ad.gif


这样一个简易的自动补全工具就诞生了。下文,我们一起来优化这个工具。

备注:Windows不支持自动补全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值