我知道如何使用 Term::Readline::Gnu (Perl) 的自定义完成函数,例如
str list_completion_function(str text, int state)
http://search.cpan.org/dist/Term-ReadLine-Gnu/Gnu.pm#Custom_Completion https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC47
$attribs->{attempted_completion_function } = sub {
my ($text, $line, $start, $end) = @_;
my @cmds = ('one', 'two', 'three');
$attribs->{completion_word} = \@cmds;
return $term->completion_matches($text, $attribs->{'list_completion_function'} );
};
..但我绝对不知道如何使用complete_internal:
int rl_complete_internal(int what_to_do = TAB)
http://search.cpan.org/dist/Term-ReadLine-Gnu/Gnu.pm#Custom_Completion
来自 GNU Readline 文档:
值为
?' means list the possible completions.
TAB' 表示执行标准完成。 *' means insert all of the possible completions.
!”表示显示所有可能的完成情况(...)
https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC47
这对我来说听起来像 gnu-readline 有一个“类似 cisco”/router-cli 模式 - 但也许我在这里得到了完全错误的东西?如果有这样的事情;我如何使用 Term::Readline::Gnu 将自定义完成数据传递给它?
我搜索了SO、GitHub Code、Google 等,几乎肯定会错过(理解)一些东西。如果你能让我轻松起来那就太好了。
这是如何使用
rl_complete_internal
的示例:
use feature qw(say);
use strict;
use utf8;
use open qw( :std :utf8 );
use warnings;
use Term::ReadLine;
my $term = Term::ReadLine->new('Test', \*STDIN, \*STDOUT);
$term->ornaments( 0 );
my $attribs = $term->Attribs;
$attribs->{completion_word} = [qw(one two three)];
$attribs->{completion_entry_function} =
$attribs->{list_completion_function};
$term->add_defun('custom-action', \&my_bind_key_func );
$term->bind_key(ord "\cy", 'custom-action');
my $answer = $term->readline( 'Enter input: ' );
say "You entered: '$answer'";
sub my_bind_key_func {
my($count, $key) = @_;
$term->complete_internal( ord '?' );
return 0;
}
如果您在提示符处输入
t
,然后按 CTRL-y
,它将显示两个完成候选,即 two
和 three
。这是因为根据 GNU Readline Library 文档,第 2.6 节:
int rl_complete_internal(int What_to_do)
完成单词 在点或之前。 what_to_do 表示完成后要做什么。 A
的值表示列出可能的完成情况。?
表示做 标准完成。TAB
表示插入所有可能的补全。*
表示显示所有可能的完成情况(如果还有更多) 超过一,以及执行部分完成。!
类似于@
,但如果可能,则不会列出可能的完成情况 补全共享一个共同的前缀。!