我知道如何使用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-like”/ router-cli模式 - 但也许我在这里得到了一些完全错误的东西?如果有这样的事情;如何使用Term :: Readline :: Gnu?
将自定义完成数据传递给它我搜索了SO,GitHub Code,Google等,并且几乎肯定会错过(理解)某些东西。如果你可以照亮我的话会很棒。
答案 0 :(得分:0)
以下是如何使用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 documentation, section 2.6:
int rl_complete_internal ( int what_to_do )
完成这个词 在点之前或之前。 what_to_do 说明如何处理完成。一个 值
?
表示列出可能的完成量。TAB
意味着做 标准完成。*
表示插入所有可能的完成。!
表示显示所有可能的完成次数(如果有更多) 不止一个,以及执行部分完成。@
类似于!
,但如果可能,则不会列出可能的完成情况 完成共享一个共同的前缀。