Use readline in console when supported

$this->stdin->read(); will use readline if the system is detected to
support it.  In linux, you will be able to use the left and right arrow
keys to edit the current line, use the up and down keys to navigate
history, press ^U to delete the entire line, etc.

Before this, using arrow keys in linux will just spam characters like
^[[C^[[A^[[D^[[C^[[A^.  Useful for "Console/cake console"
This commit is contained in:
Matt Reishus 2013-09-01 16:20:29 -05:00
parent 64cf40558f
commit 916d992162

View file

@ -31,6 +31,16 @@ class ConsoleInput {
* @var resource
*/
protected $_input;
/**
* Can this instance use readline?
* Two conditions must be met:
* 1. Readline support must be enabled.
* 2. Handle we are attached to must be stdin.
* Allows rich editing with arrow keys and history when inputting a string.
*
* @var bool
*/
private $_can_readline;
/**
* Constructor
@ -38,6 +48,7 @@ class ConsoleInput {
* @param string $handle The location of the stream to use as input.
*/
public function __construct($handle = 'php://stdin') {
$this->_can_readline = extension_loaded('readline') && $handle == 'php://stdin' ? true : false;
$this->_input = fopen($handle, 'r');
}
@ -47,6 +58,13 @@ class ConsoleInput {
* @return mixed The value of the stream
*/
public function read() {
if ($this->_can_readline) {
$line = readline('');
if (!empty($line)) {
readline_add_history($line);
}
return $line;
}
return fgets($this->_input);
}