Как я могу настроить завершение табуляции в Perl Term :: Shell? - PullRequest
3 голосов
/ 24 июля 2009

Я использую пакет Term :: Shell для реализации инструмента CLI. Этот пакет предоставляет API: comp_CMD.

Эта функция вызывается всякий раз, когда пользователь нажимает клавишу TAB. Мое требование здесь:

shell> stack TAB

over under

`shell> поверх TAB

flow sample junk

Но по умолчанию comp_CMD предоставляет только один набор параметров TAB, например

shell> stack TAB

over under

`shell> стек поверх TAB

over under ### ПРОБЛЕМА ЗДЕСЬ

Вместо ниже здесь, я хочу получить ненужный образец потока .

Ответы [ 2 ]

3 голосов
/ 24 июля 2009

С помощью обработчиков в стиле comp_* можно сопоставлять только свои завершения с последним неполным словом. К счастью, однако, вы можете получить желаемый результат, переопределив функцию catch_comp, как показано ниже;это позволяет одно совпадение против всей командной строки:

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]);
}
0 голосов
/ 27 июля 2009

Еще одну вещь, которую я хочу добавить здесь ..

После переопределения подпрограммы rl_complete, мы также должны переопределить comp__ (Подпрограмма по умолчанию, вызываемая для TAB), чтобы избежать повторной печати подкоманд.

...