Up to step 21
This commit is contained in:
parent
10369accac
commit
e0a9d066ca
29
kilo
29
kilo
@ -5,41 +5,20 @@ namespace Kilo;
|
||||
|
||||
require_once __DIR__ . '/src/constants.php';
|
||||
require_once __DIR__ . '/src/functions.php';
|
||||
require_once __DIR__ . '/src/editor.php';
|
||||
|
||||
function main(): int
|
||||
{
|
||||
global $ffi;
|
||||
|
||||
enableRawMode();
|
||||
|
||||
$editor = new Editor();
|
||||
|
||||
// Input Loop
|
||||
while (true)
|
||||
{
|
||||
$char = read_stdin(1);
|
||||
$c = ord($char);
|
||||
|
||||
if (empty($char))
|
||||
{
|
||||
continue;
|
||||
$editor->processKeypress();
|
||||
}
|
||||
|
||||
if ($ffi->iscntrl($c))
|
||||
{
|
||||
printf("%d\r\n", $c);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%d ('%c')\r\n", $c, $c);
|
||||
}
|
||||
|
||||
if ($char === 'q')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
disableRawMode();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
27
src/editor.php
Normal file
27
src/editor.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Kilo;
|
||||
|
||||
class Editor {
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function processKeypress(): void
|
||||
{
|
||||
$c = $this->readKey();
|
||||
|
||||
switch($c)
|
||||
{
|
||||
case chr(ctrl_key('q')):
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function readKey(): string
|
||||
{
|
||||
return read_stdin(1);
|
||||
}
|
||||
}
|
@ -12,6 +12,8 @@ function enableRawMode(): void
|
||||
global $ffi;
|
||||
global $original_termios;
|
||||
|
||||
register_shutdown_function('Kilo\\disableRawMode');
|
||||
|
||||
// Populate the original terminal settings
|
||||
$ffi->tcgetattr(STDIN_FILENO, FFI::addr($original_termios));
|
||||
|
||||
@ -45,3 +47,8 @@ function read_stdin(int $len = 128): string
|
||||
|
||||
return $input;
|
||||
}
|
||||
|
||||
function ctrl_key(string $char): int
|
||||
{
|
||||
return ord($char) & 0x1f;
|
||||
}
|
Loading…
Reference in New Issue
Block a user