Term::Readline::Gnu - 如何使用complete_internal(如果可能的话..)?

问题描述 投票:0回答:1

我知道如何使用 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 等,几乎肯定会错过(理解)一些东西。如果你能让我轻松起来那就太好了。

perl command-line-interface readline cisco
1个回答
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 文档,第 2.6 节:

int rl_complete_internalint What_to_do

完成单词 在点或之前。 what_to_do 表示完成后要做什么。 A

?
的值表示列出可能的完成情况。
TAB
表示做 标准完成。
*
表示插入所有可能的补全。
!
表示显示所有可能的完成情况(如果还有更多) 超过一,以及执行部分完成。
@
类似于
!
,但如果可能,则不会列出可能的完成情况 补全共享一个共同的前缀。

© www.soinside.com 2019 - 2024. All rights reserved.