Como posso personalizar a conclusão de tabulação no Termo de Perl :: Shell?

StackOverflow https://stackoverflow.com/questions/1177227

  •  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 .

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top