我想创建一个控制台,并在按tab键时更改自动补全功能,但我想区分两种情况:
- 如果我按tab键并且命令的开头与我在数组中提供的列表匹配,则自动完成将根据该数组。
- 如果我按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);
}
}