如何在Perl';s术语::Shell?
我正在使用软件包实现一个CLI工具。此软件包提供一个API:如何在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.*样式处理程序获取流样本垃圾,而不是下面的,,,只能将自己的完成与最后一个不完整的单词进行匹配。不过,幸
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”更改为任何命令即可;“低于”和“超过”是您的第一个参数;“流量”等是第二个参数,但仅当“结束”是第一个参数时才可用。你可以把树长到任意大小。我现在可以用它了。。非常感谢你(莎拉:):)