[Console] Add autocomplete as you type
merged branch lmcd/autocomplete (PR #6391)

This PR was squashed before being merged into the master branch (closes #6391).

Commits
-------

7bad0ef [Console] Add autocomplete as you type

Discussion
----------

[Console] Add autocomplete as you type

Bug fix: no
Feature addition: yes
Backwards compatibility break: no
Symfony2 tests pass: yes
Fixes the following tickets: -
License of the code: MIT

Finally got around to reviving the console autocomplete code.
Is now up to date with Symfony master. Also changed backspace behaviour to remove one character instead of two.

stty stuff is a mystery to a lot of people, so I've commented verbosely.

See also: https://github.com/symfony/symfony/pull/2364

---------------------------------------------------------------------------

by lmcd at 2012-12-17T10:11:16Z

@stof - updated with a better solution

---------------------------------------------------------------------------

by Seldaek at 2012-12-17T10:25:15Z

Seems pretty cool, but could you replace all `/usr/bin/env stty` calls by simply `stty`? That way it would also work on windows - if you have mingw or cygwin installed and stty is in the path at least. I don't see the benefit of doing the /usr/bin/env trick here. That's good for shebang lines because you need an absolute path, but in an exec/shell_exec call, you can rely on the PATH and just type the command name.

---------------------------------------------------------------------------

by lmcd at 2012-12-17T18:33:06Z

@Seldaek makes sense. Changed.

---------------------------------------------------------------------------

by lmcd at 2012-12-17T21:32:17Z

Tested on Mac OS X 10.8 and Ubuntu 12.04. Would be great to hear from people on Windows, cygwin and those with exotic terminal setups.

I'll update my fork of SensioGeneratorBundle a little later with support for this.

@fabpot - is there still time for this to land in 2.2?

---------------------------------------------------------------------------

by fabpot at 2012-12-17T21:34:23Z

If we have good feedback from Windows users, yes it can land in 2.2. ping @pborreli

---------------------------------------------------------------------------

by michelsalib at 2012-12-17T23:39:50Z

A am about to try on windows 7 with cmd, powershell and cygwin. Any other way to test without writing a new command using the helper ?

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:01:42Z

I tried on Windows 7 with cmd, powershell and cygwin and got this error: `Le chemin d'accès spécifié est introuvable.`. You can translate it to `The specified path could not be found`.

---------------------------------------------------------------------------

by lmcd at 2012-12-18T00:01:43Z

I've updated SensioGeneratorBundle to support autocompletion on the `generate:doctrine:entity` command. It autocompletes bundle names, configuration formats and field types. See here: https://github.com/lmcd/SensioGeneratorBundle/commit/c627c67ce7a71dc767ec02532f899632df8fb9e9

@michelsalib ping

---------------------------------------------------------------------------

by lmcd at 2012-12-18T00:03:43Z

@michelsalib - hmm. I imagine it's either a problem locating stty or some configuration issue on your end. Do you have file/line number?

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:04:41Z

Verbose mode did not help. Let me try with some dirty line by line check to see if I can give you a line.

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:09:54Z

My bad, I should have guessed that line 144 `exec('/usr/bin/env stty', $output, $exitcode);` cannot work on regular Windows environment. This should at least fails silently for users using cmd or powershell. Apparently cygwin users can activate stty. Let me investigate.

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:16:30Z

Ok, cygwin comes pre-bundled with stty. I applied the fix recommended by @Seldaek and it fixed the cygwin command.
The only remaining problem is that your redirect the output of the exec call to the console, in this case cmd and powershell output the error telling that stty is not defined in the system: `'stty' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.`.

---------------------------------------------------------------------------

by lmcd at 2012-12-18T00:17:41Z

Ah, I see you're running the unit tests. The `hasSttyAvailable` method was lifted from `DialogHelper` where it is also used in `askHiddenResponse`. Question: is `defined('PHP_WINDOWS_VERSION_BUILD')` true for cygwin?

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:22:14Z

I am not running test, I am actually running a homemade command:
```
$dialog = $this->getHelper('dialog');

$ask = $dialog->ask($output, 'Autocomplete example', null, array(
    'French', 'English', 'Chineese',
));

$output->writeln($ask);
```

`hasSttyAvailable` is called in the ask function at line 80. The incriminated function is here : https://github.com/lmcd/symfony/blob/9ebcd4bac97551d1b6e68d194c7109f5dcdf364a/src/Symfony/Component/Console/Helper/DialogHelper.php#L411.

Also `defined('PHP_WINDOWS_VERSION_BUILD')` is true in the three of my consoles.

---------------------------------------------------------------------------

by lmcd at 2012-12-18T00:27:16Z

@michelsalib see https://github.com/lmcd/symfony/commit/7be142481c06399845ecd9dceec00b5a20054e1c

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:28:20Z

Why keeping `/usr/bin/env` in your calls ? Cygwin cannot interpret it as long a stty is not in this folder.

---------------------------------------------------------------------------

by lmcd at 2012-12-18T00:29:30Z

@michelsalib `/usr/bin/env` was put there by someone else for the `askHiddenResponse` method. I can remove it, so long as it doesn't break something else.

---------------------------------------------------------------------------

by michelsalib at 2012-12-18T00:34:11Z

IMO users who want's to use stty should have it configured in the PATH, as @Seldaek said. Prefixing the folder where the stty "should" be is a nonsense to me. Moreover it might work well on *nix systems, but will never be compatible with cygwin.
I tested it locally (without the `/usr/bin/env` prefix) and now I have a nice autocomplete on Cygwin, and nothing on cmd or powershell. Which is just what I expected.

@lmcd very nice work :)

---------------------------------------------------------------------------

by lmcd at 2012-12-18T05:17:32Z

For anyone interested, you can scroll through available autocomplete options that match typed characters by using up and down arrow keys. This has been implemented in a seperate branch here: https://github.com/lmcd/symfony/tree/autocomplete-arrows

---------------------------------------------------------------------------

by drak at 2012-12-18T19:13:34Z

@lmcd - The console PRs never cease to amaze me. Really well done!

---------------------------------------------------------------------------

by fabpot at 2012-12-19T13:58:33Z

@lmcd Is it mergeable now?

---------------------------------------------------------------------------

by lmcd at 2012-12-19T17:59:09Z

@fabpot Yes.

---------------------------------------------------------------------------

by lmcd at 2012-12-19T20:03:31Z

Edit: commits squashed

---------------------------------------------------------------------------

by lmcd at 2012-12-19T21:29:07Z

@stloyd I have addressed the two things mentioned. I'm now using $i in place of strlen($ret) as it held the same value.

---------------------------------------------------------------------------

by fabpot at 2012-12-20T07:09:27Z

@lmcd: Thanks a lot for finishing this in time for 2.2. Before I can merge, there are two remaining tasks:

 * add a note about the new feature in the CHANGELOG file of the Console component;
 * create a PR on `symfony/symfony-docs` to explain the new feature.

Can you take care of that?

---------------------------------------------------------------------------

by lmcd at 2012-12-20T07:11:15Z

@fabpot sure

---------------------------------------------------------------------------

by stloyd at 2012-12-29T09:15:23Z

@lmcd You should squash your "merge" commit.

---------------------------------------------------------------------------

by lmcd at 2012-12-29T13:49:37Z

Well that screwed up. File Changed: 216 :S
Edit: hard reset to an earlier hash and reapplied the CHANGELOG commit. Should be good now ping @stloyd

---------------------------------------------------------------------------

by stloyd at 2012-12-29T14:33:58Z

@lmcd `ask()` method is quite long now, but in overall looks ok =)

---------------------------------------------------------------------------

by lmcd at 2013-01-02T20:49:49Z

Anything preventing this being merged? Ping @fabpot