Styling, abbreviated commands
This commit is contained in:
parent
17064e7e43
commit
ba27d840ea
@ -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,7 +193,7 @@ 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user