Como posso personalizar a conclusão de tabulação no Termo de Perl :: Shell?
-
19-09-2019 - |
Pergunta
Eu estou usando Term :: pacote Shell para implementar uma ferramenta CLI. Este pacote fornece uma API:. comp_CMD
Esta função é chamado sempre que o usuário pressiona a TAB. Minha exigência aqui é:
shell> stack
TAB
over under
`shell> pilha sobre TAB
flow sample junk
Mas o comp_CMD
padrão fornece apenas um conjunto de opções TAB como
shell> stack
TAB
over under
`shell> pilha sobre TAB
over under
### O PROBLEMA ESTÁ AQUI
Em vez de sobre o sob aqui, eu quero ficar fluir junk amostra .
Solução
Com os manipuladores de estilo comp_*
só se pode combinar com um de completação contra a última palavra incompleta. Felizmente, no entanto, você pode obter o resultado desejado, substituindo a função catch_comp como abaixo; ele permite que um jogo contra linha de comando inteiro:
my %completion_tree = (
stack => { under => [],
over => [qw(flow sample junk)] }
);
sub catch_comp {
my $o = shift;
my ($cmd, $word, $line, $start) = @_;
my $completed = substr $line, 0, $start;
$completed =~ s/^\s*//;
my $tree = \%completion_tree;
foreach (split m'\s+', $completed) {
last if ref($tree) ne 'HASH';
$tree = $tree->{$_};
}
my @completions;
$_ = ref($tree);
@completions = @$tree if /ARRAY/;
@completions = keys %$tree if /HASH/;
@completions = ($tree)if /SCALAR/;
return $o->completions($word, [@completions]);
}
Outras dicas
Mais uma coisa eu quero adicionar aqui ..
Depois de substituir sub-rotina rl_complete, nós também temos que substituir comp__ (sub-rotina padrão chamado para TAB) para evitar repetidas impressão do subcomando.