3

我正在使用Term::Shell包来实现 CLI 工具。这个包提供了一个 API:comp_CMD.

每当用户按下 TAB 时都会调用此函数。我这里的要求是:

shell> stackTAB

over under

`shell>堆叠TAB

flow sample junk

但默认comp_CMD只提供一组 TAB 选项,如

shell> stack TAB

over under

`shell>堆叠TAB

over under###问题就在这里

而不是 这里,我想得到flow sample junk

4

2 回答 2

3

使用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]);
}
于 2009-07-24T14:59:28.847 回答
0

我想在这里添加一件事..

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

于 2009-07-27T08:03:29.383 回答