Fixed line scrolling, prompt style
This commit is contained in:
@ -4,6 +4,7 @@ namespace NoccyLabs\React\Shell;
|
||||
|
||||
use Evenement\EventEmitterInterface;
|
||||
use Evenement\EventEmitterTrait;
|
||||
use PgSql\Lob;
|
||||
use React\EventLoop\Loop;
|
||||
use React\Stream\ReadableResourceStream;
|
||||
use React\Stream\ReadableStreamInterface;
|
||||
@ -34,6 +35,8 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
|
||||
|
||||
private int $promptWidth = 0;
|
||||
|
||||
private string $promptStyle = "35;1";
|
||||
|
||||
public function __construct(?ReadableStreamInterface $input=null, ?WritableStreamInterface $output=null)
|
||||
{
|
||||
$this->istream = $input ?? new ReadableResourceStream(STDIN);
|
||||
@ -97,8 +100,11 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
|
||||
break;
|
||||
|
||||
case "\e[H": // home
|
||||
$this->cursorPos = 0;
|
||||
break;
|
||||
case "\e[F": // end
|
||||
break;
|
||||
$this->cursorPos = mb_strlen($this->buffer);
|
||||
break;
|
||||
|
||||
case "\e[D": // left
|
||||
if ($this->cursorPos < 1) return;
|
||||
@ -121,6 +127,13 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ($this->cursorPos < $this->scrollOffset) {
|
||||
$this->scrollOffset = $this->cursorPos;
|
||||
}
|
||||
$availWidth = $this->termWidth - $this->promptWidth;
|
||||
if ($this->cursorPos - $this->scrollOffset >= $availWidth) {
|
||||
$this->scrollOffset = abs($availWidth - $this->cursorPos) + 2;
|
||||
}
|
||||
$this->updatePrompt();
|
||||
}
|
||||
|
||||
@ -129,7 +142,7 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
|
||||
{
|
||||
$this->hidePrompt();
|
||||
$this->ostream->write($data);
|
||||
$this->redrawPrompt();
|
||||
Loop::futureTick($this->redrawPrompt(...));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -175,7 +188,7 @@ class Shell implements WritableStreamInterface, EventEmitterInterface
|
||||
|
||||
$pos = $this->promptWidth + $this->cursorPos - $this->scrollOffset + 1;
|
||||
|
||||
$obuf = "\r" . "\e[1m" . $this->prompt . "\e[22m";
|
||||
$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";
|
||||
|
Reference in New Issue
Block a user