CompletionCommand.php
4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
namespace Stecman\Component\Symfony\Console\BashCompletion;
use Symfony\Component\Console\Command\Command as SymfonyCommand;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class CompletionCommand extends SymfonyCommand
{
/**
* @var CompletionHandler
*/
protected $handler;
protected function configure()
{
$this
->setName('_completion')
->setDefinition($this->createDefinition())
->setDescription('BASH completion hook.')
->setHelp(<<<END
To enable BASH completion, run:
<comment>eval `[program] _completion -g`</comment>.
Or for an alias:
<comment>eval `[program] _completion -g -p [alias]`</comment>.
END
);
}
/**
* {@inheritdoc}
*/
public function getNativeDefinition()
{
return $this->createDefinition();
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->handler = new CompletionHandler($this->getApplication());
$handler = $this->handler;
if ($input->getOption('generate-hook')) {
global $argv;
$program = $argv[0];
$factory = new HookFactory();
$alias = $input->getOption('program');
$multiple = (bool)$input->getOption('multiple');
// When completing for multiple apps having absolute path in the alias doesn't make sense.
if (!$alias && $multiple) {
$alias = basename($program);
}
$hook = $factory->generateHook(
$input->getOption('shell-type') ?: $this->getShellType(),
$program,
$alias,
$multiple
);
$output->write($hook, true);
} else {
$handler->setContext(new EnvironmentCompletionContext());
$output->write($this->runCompletion(), true);
}
}
/**
* Run the completion handler and return a filtered list of results
*
* @deprecated - This will be removed in 1.0.0 in favour of CompletionCommand::configureCompletion
*
* @return string[]
*/
protected function runCompletion()
{
$this->configureCompletion($this->handler);
return $this->handler->runCompletion();
}
/**
* Configure the CompletionHandler instance before it is run
*
* @param CompletionHandler $handler
*/
protected function configureCompletion(CompletionHandler $handler)
{
// Override this method to configure custom value completions
}
/**
* Determine the shell type for use with HookFactory
*
* @return string
*/
protected function getShellType()
{
if (!getenv('SHELL')) {
throw new \RuntimeException('Could not read SHELL environment variable. Please specify your shell type using the --shell-type option.');
}
return basename(getenv('SHELL'));
}
protected function createDefinition()
{
return new InputDefinition(array(
new InputOption(
'generate-hook',
'g',
InputOption::VALUE_NONE,
'Generate BASH code that sets up completion for this application.'
),
new InputOption(
'program',
'p',
InputOption::VALUE_REQUIRED,
"Program name that should trigger completion\n<comment>(defaults to the absolute application path)</comment>."
),
new InputOption(
'multiple',
'm',
InputOption::VALUE_NONE,
"Generated hook can be used for multiple applications."
),
new InputOption(
'shell-type',
null,
InputOption::VALUE_OPTIONAL,
'Set the shell type (zsh or bash). Otherwise this is determined automatically.'
),
));
}
}