在Term::ReadLine::Gnu中使用补全函数

  • 本文关键字:函数 Term ReadLine Gnu perl
  • 更新时间 :
  • 英文 :


我想创建一个控制台,并在按tab键时更改自动补全功能,但我想区分两种情况:

  1. 如果我按tab键并且命令的开头与我在数组中提供的列表匹配,则自动完成将根据该数组。
  2. 如果我按tab键,命令不能从我提供的列表中识别出来,我希望通用补全函数工作,这样它就会自动完成当前目录中的目录和文件名。

有可能吗?非常感谢。

编辑:我正试图在perl脚本中做它。我看到了这个例子:

rl_attempted_completion_function

对创建匹配的替代函数的引用。

函数通过TEXT, LINE_BUFFER, START和END调用。LINE_BUFFER是当前输入的缓冲区字符串。START和END是LINE_BUFFER中的索引,表示TEXT的边界。

如果该函数存在并且返回空列表或undef,或者如果该变量被设置为undef,则内部函数rl_complete()将调用$rl_completion_entry_function的值来生成匹配,否则将使用返回的字符串数组。

该变量的默认值为undef。您可以这样使用它:

use Term::ReadLine;
...
my $term = new Term::ReadLine 'sample';
my $attribs = $term->Attribs;
...
sub sample_completion {
    my ($text, $line, $start, $end) = @_;
    # If first word then username completion, else filename completion
    if (substr($line, 0, $start) =~ /^s*$/) {
        return $term->completion_matches($text,
                                         $attribs->{'username_completion_function'});
    } else {
        return ();
    }
}
...
$attribs->{attempted_completion_function} = &sample_completion;

completion_matches(文本、ENTRY_FUNC)

我想做的是,如果按下tab键,它会从我提供的数组中识别子字符串,自动完成将来自该数组(如果有多个匹配,它会像常规unix控制台一样给出所有匹配)。否则,我希望自动完成为文件识别。

Term::ReadLine::Gnu内部用来提供默认补全的子例程是filename_completion_function,您可以从自定义子例程直接调用它:

use Term::ReadLine;
my $term = new Term::ReadLine 'MyTerm';
$term->Attribs->{'completion_entry_function'} = &my_completion;
my $ans = $term->readline('How can I help you? ');
sub my_completion {
    my ($text, $state) = @_;
    if (my_test) {
        return my_custom_stuff;
    }
    else {
        return Term::ReadLine::Gnu->filename_completion_function($text, $state);
    }
}

最新更新