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

时间:2016-05-13 22:57:09

标签: perl command-line-interface readline cisco

我知道如何使用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等,并且几乎肯定会错过(理解)某些东西。如果你可以照亮我的话会很棒。

1 个答案:

答案 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,则会显示两个完成候选项,即twothree。这是因为根据GNU Readline Library documentation, section 2.6

  

int rl_complete_internal int what_to_do

     

完成这个词   在点之前或之前。 what_to_do 说明如何处理完成。一个   值?表示列出可能的完成量。 TAB意味着做   标准完成。 *表示插入所有可能的完成。   !表示显示所有可能的完成次数(如果有更多)   不止一个,以及执行部分完成。 @类似于   !,但如果可能,则不会列出可能的完成情况   完成共享一个共同的前缀。