Styling, abbreviated commands
This commit is contained in:
		@@ -13,6 +13,8 @@ class CommandHandler implements EventEmitterInterface
 | 
			
		||||
 | 
			
		||||
    private array $commands = [];
 | 
			
		||||
 | 
			
		||||
    private bool $allowAbbreviatedCommands = true;
 | 
			
		||||
 | 
			
		||||
    public function add(string $command, callable $handler, array $signature=[]): self
 | 
			
		||||
    {
 | 
			
		||||
        $this->commands[$command] = [ 'handler' => $handler, 'signature' => $signature ];
 | 
			
		||||
@@ -28,6 +30,19 @@ class CommandHandler implements EventEmitterInterface
 | 
			
		||||
    {
 | 
			
		||||
        $command = array_shift($line);
 | 
			
		||||
 | 
			
		||||
        if ($this->allowAbbreviatedCommands) {
 | 
			
		||||
            $candidates = array_filter(
 | 
			
		||||
                array_keys($this->commands),
 | 
			
		||||
                fn($c)=>str_starts_with($c,$command)
 | 
			
		||||
            );
 | 
			
		||||
            if (count($candidates)>2) {
 | 
			
		||||
                $this->emit("candidates", [ $candidates, $shell ]);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (count($candidates)==1) {
 | 
			
		||||
                $command = array_shift($candidates);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (!array_key_exists($command, $this->commands)) {
 | 
			
		||||
            $this->emit("command", [ $command, $line, $shell ]);
 | 
			
		||||
            return;
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,9 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
 | 
			
		||||
    private int $promptWidth = 0;
 | 
			
		||||
 | 
			
		||||
    private string $promptStyle = "35;1";
 | 
			
		||||
    private string $promptStyle = "36;1";
 | 
			
		||||
 | 
			
		||||
    private string $inputStyle = "36";
 | 
			
		||||
 | 
			
		||||
    public function __construct(?ReadableStreamInterface $input=null, ?WritableStreamInterface $output=null)
 | 
			
		||||
    {
 | 
			
		||||
@@ -191,8 +193,8 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
 | 
			
		||||
        $obuf = "\r" . "\e[{$this->promptStyle}m" . $this->prompt . "\e[0m";
 | 
			
		||||
        $ostr = mb_substr($this->buffer, $this->scrollOffset) . " ";
 | 
			
		||||
        $ostr = mb_substr($ostr, 0, $this->termWidth - $this->promptWidth);
 | 
			
		||||
        $obuf .= $ostr . "\e[K\e[" . $pos . "G";
 | 
			
		||||
        $obuf .= "\e[{$this->inputStyle}m" . $ostr . "\e[K\e[0m\e[" . $pos . "G";
 | 
			
		||||
 | 
			
		||||
        $this->ostream->write($obuf);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user