如何在Perl';s术语::Shell?

如何在Perl';s术语::Shell?,perl,tab-completion,Perl,Tab Completion,我正在使用软件包实现一个CLI工具。此软件包提供一个API:comp\u CMD 每当用户按下选项卡时,就会调用此函数。 我的要求是: shell>stackTAB 在下面 `shell>堆栈overTAB flow sample junk 但是默认的comp_CMD只提供一组选项卡选项,如 shell>stackTAB 在下面 `shell>堆栈overTAB 问题就在这里 我想用comp.*样式处理程序获取流样本垃圾,而不是下面的,,,只能将自己的完成与最后一个不完整的单词进行匹配。不过,幸

我正在使用软件包实现一个CLI工具。此软件包提供一个API:
comp\u CMD

每当用户按下选项卡时,就会调用此函数。 我的要求是:

shell>stack
TAB

在下面

`shell>堆栈overTAB

flow sample junk

但是默认的
comp_CMD
只提供一组选项卡选项,如

shell>stack
TAB

在下面

`shell>堆栈overTAB

问题就在这里


我想用
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]);
}

还有一件事我想补充一下


在重写rl_complete子例程之后,我们还必须重写comp_(为TAB调用的默认子例程),以避免重复打印子命令。

好的,现在我已经看过Term::Shell,我注意到您需要编写
子comp_堆栈
。我错了吗?您的
组件堆栈中有什么?谢谢您的帮助。。。我是Perl的新手。。我已将你的代码复制到我的中。。现在的问题是,我不知道应该对示例代码进行哪些更改,以获得预期的输出。。对不起,如果我要求太多的话。。你能帮我写下comp_CMD模块吗?你可以复制/粘贴上面的函数,不做任何修改。只需修改$completion_树。如果语法给您带来了问题,请查看。实际上,如何修改它应该是相当明显的,因为上面的示例正好代表了您期望的完成类型;只需将“stack”更改为任何命令即可;“低于”和“超过”是您的第一个参数;“流量”等是第二个参数,但仅当“结束”是第一个参数时才可用。你可以把树长到任意大小。我现在可以用它了。。非常感谢你(莎拉:):)