【问题标题】:How can I get case-insensitive completion with Term::ReadLine::Gnu?如何使用 Term::ReadLine::Gnu 获得不区分大小写的完成?
【发布时间】:2011-11-09 18:52:28
【问题描述】:

使用Term::ReadLine::Gnu 时,我似乎无法获得不区分大小写的完成。以这个示例脚本为例:

use strict;
use warnings;
use 5.010;
use Term::ReadLine;

my $term = Term::ReadLine->new('test');
say "Using " . $term->ReadLine;

if (my $attr = $term->Attribs) {
  $term->ornaments(0);
  $attr->{basic_word_break_characters}     = ". \t\n";
  $attr->{completer_word_break_characters} = " \t\n";
  $attr->{completion_function} = \&complete_word;
} # end if attributes

my @words = qw(apple approve Adam America UPPER UPPERCASE UNUSED);

sub complete_word
{
  my ($text, $line, $start) = @_;
  return grep(/^$text/i, @words);
} # end complete_word

while (1) {
  $_ = $term->readline(']');
  last unless /\S/;             # quit on empty input
} # end while 1

请注意,complete_word 进行不区分大小写的匹配。如果我用Term::ReadLine::Perl(通过PERL_RL=Perl perl script.pl)运行它,它会按我的预期工作。键入 a<TAB><TAB> 会列出所有 4 个单词。输入 u<TAB><TAB> 会将 u 转换为 U 并列出 3 个单词。

当我改用Term::ReadLine::GnuPERL_RL=Gnu perl script.pl 或只是perl script.pl)时,它只执行区分大小写的补全。输入 a<TAB> 会得到 app。键入 u<TAB><TAB> 不会列出任何完成。

我的/etc/inputrc 中什至有set completion-ignore-case on,但它在这里仍然不起作用。 (不过,它在 bash 中运行良好。)

有没有办法让Term::ReadLine::Gnu 进行不区分大小写的补全?

【问题讨论】:

    标签: perl readline case-insensitive


    【解决方案1】:

    看来问题出在Term::ReadLine::Gnu::XS::_trp_completion_function()(用户定义完成函数的包装器)中。

    您的匹配项已从您的 complete_word() 函数中正确检索,但随后来自包装器的以下 sn-p 执行其自己的区分大小写的匹配:

    for (; $_i <= $#_matches; $_i++) {
        return $_matches[$_i] if ($_matches[$_i] =~ /^\Q$text/);
    }
    

    其中@_matches 是您的complete_word() 的结果,而$text 是到目前为止完成的文本。

    所以看起来答案是,没有支持的方法可以让Term::ReadLine::Gnu 进行不区分大小写的补全。您将不得不覆盖私有 Term::ReadLine::Gnu::XS::_trp_completion_function(可以肯定的是一个丑陋的 hack)——或者直接修改 XS.pm(可以说是一个更丑陋的 hack)。

    编辑: Term::ReadLine::Gnu 使用的版本:1.20

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多