perl 如何禁止Term::ReadLine的默认文件名完成?

gev0vcfq  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(167)

我如何禁用Term::ReadLine的默认完成,或者说,使它在某个时候停止建议文件名完成?
例如,我需要用什么替换return()才能从第二个单词开始禁止默认完成?
这两种方法都不起作用:
第一个

kknvjkwl

kknvjkwl1#

定义completion_function而不是attempted_completion_function

$attribs->{completion_function} = \&completion;

如果补全应该停止,则为return undef,如果文件名补全将接管,则为return $term->completion_matches($text, $attribs->{filename_completion_function})
在下面的示例中,没有为第一个参数提供任何建议,但为第二个参数提供了文件名。

use Term::ReadLine;

my $term = new Term::ReadLine 'sample';
my $attribs = $term->Attribs;
$attribs->{completion_function} = \&completion;

sub completion {

  my ( $text, $line, $start ) = @_;

  if ( substr( $line, 0, $start ) =~ /^\s*$/) {

    return 

  } else {

    return $term->completion_matches($text, $attribs->{filename_completion_function})

  }
}

while ( my $input = $term->readline ("> ") ) {
  exit 0 if $input eq "q";
}
tpgth1q7

tpgth1q72#

通过Gnu实现,我发现我可以设置attempted_completion_over来避免在attempted_completion_function没有返回结果时出现文件名补全:

$attribs->{attempted_completion_over} = 1;

Gnu.pm 表示此变量是自“GRL 4.2”起的变量。
请注意,* 每次 * attempted_completion_function运行时,或者至少每次attempted_completion_function没有返回匹配时,都应该设置此变量。我没有看到任何文档说明这一点,但libreadline显然在每次调用后都将变量重置为零。

j2cgzkjk

j2cgzkjk3#

我必须在我的完成处理程序中这样做:

if <no more matches> then
    $attribs->{completion_entry_function} = \&dummy;

即:

sub complete {
    my $text = shift // '';
    my $line = shift // '';
    my $start = shift // 0;
    my $end = shift // 0;
    # msg("$text, $line, $start, $end");
    my @matches = $g->complete($text, $line, $start, $end);
    # msg(vDump(\@matches));
    $attribs->{completion_entry_function} = \&dummy;
    return @matches;
}
$attribs->{attempted_completion_function} = \&complete;

相关问题