【问题标题】:How can I customize tab completion in Perl's Term::Shell?如何在 Perl 的 Term::Shell 中自定义选项卡完成?
【发布时间】:2009-07-24 12:02:09
【问题描述】:

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

只要用户按下 TAB,就会调用此函数。 我的要求是:

shell> stackTAB

over under

`shell>堆叠在TAB

flow sample junk

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

shell> stackTAB

over under

`shell>堆叠在TAB

over under ### 问题就在这里

这里不是over under,而是flow sample junk。

【问题讨论】:

  • 好吧,既然我已经看过 Term::Shell,我注意到你需要写 sub comp_stack。我错了吗?你的comp_stack 里有什么?

标签: perl tab-completion


【解决方案1】:

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

【讨论】:

  • 感谢 Inshalla ...我是 Perl 的新手。我已将您的代码复制到我的中。现在的问题是我不知道应该对示例代码进行哪些更改并获得预期的输出..对不起,如果我要求太多..你能为我写comp_CMD模块吗?..
  • 您可以直接复制/粘贴上面的函数,无需修改。只有 $completion_tree 需要修改。如果语法给您带来问题,请查看 perldoc.perl.org/perldata.html 。实际上如何修改它应该是相当明显的,因为上面的示例正是您期望的完成类型;只需将“堆栈”更改为您的命令即可; “under”和“over”是你的第一个参数; “flow”等是第二个参数,但只有在“over”是第一个参数时才可用。您可以将树增长到任意大小。
  • 我现在可以使用它了.. 非常感谢 Inshalla :) :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多