diff --git a/src/Symfony/Component/Console/CHANGELOG.md b/src/Symfony/Component/Console/CHANGELOG.md index 07254c6720..4e29d2ed45 100644 --- a/src/Symfony/Component/Console/CHANGELOG.md +++ b/src/Symfony/Component/Console/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +2.8.0 +----- + + * use readline for user input in the question helper when available to allow + the use of arrow keys + 2.6.0 ----- diff --git a/src/Symfony/Component/Console/Helper/QuestionHelper.php b/src/Symfony/Component/Console/Helper/QuestionHelper.php index 9e4fa02f2c..dc68fe6e71 100644 --- a/src/Symfony/Component/Console/Helper/QuestionHelper.php +++ b/src/Symfony/Component/Console/Helper/QuestionHelper.php @@ -77,7 +77,7 @@ class QuestionHelper extends Helper } /** - * Returns the helper's input stream + * Returns the helper's input stream. * * @return resource */ @@ -127,11 +127,7 @@ class QuestionHelper extends Helper } if (false === $ret) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); + $ret = $this->readFromInput($inputStream); } } else { $ret = trim($this->autocomplete($output, $question, $inputStream)); @@ -150,7 +146,7 @@ class QuestionHelper extends Helper * Outputs the question prompt. * * @param OutputInterface $output - * @param Question $question + * @param Question $question */ protected function writePrompt(OutputInterface $output, Question $question) { @@ -222,7 +218,7 @@ class QuestionHelper extends Helper // Backspace Character if ("\177" === $c) { if (0 === $numMatches && 0 !== $i) { - $i--; + --$i; // Move cursor backwards $output->write("\033[1D"); } @@ -275,7 +271,7 @@ class QuestionHelper extends Helper } else { $output->write($c); $ret .= $c; - $i++; + ++$i; $numMatches = 0; $ofs = 0; @@ -423,6 +419,30 @@ class QuestionHelper extends Helper return self::$shell; } + /** + * Reads user input. + * + * @param resource $stream The input stream + * + * @return string User input + * + * @throws \RuntimeException + */ + private function readFromInput($stream) + { + if (STDIN === $stream && function_exists('readline')) { + $ret = readline(); + } else { + $ret = fgets($stream, 4096); + + if (false === $ret) { + throw new \RuntimeException('Aborted'); + } + } + + return trim($ret); + } + /** * Returns whether Stty is available or not. *