2011-11-09 4 views
4

Term::ReadLine::Gnuを使用すると、大文字と小文字を区別しない補完ができないようです。次のスクリプトの例をご覧ください: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::PerlPERL_RL=Perl perl script.plを実行することによって)を実行すると、期待どおりに動作します。 a<TAB><TAB>と入力すると、すべての4ワードがリストされます。 u<TAB><TAB>と入力するとuUに変換され、3語が表示されます。

代わりにTerm::ReadLine::GnuPERL_RL=Gnu perl script.plまたはちょうどperl script.pl)を使用すると、大文字と小文字が区別されます。 a<TAB>と入力すると、appとなります。 u<TAB><TAB>と入力すると補完物は表示されません。

私もにset completion-ignore-case onがありますが、それでもここでは機能しません。 (ただし、bashでは正常に動作します)

Term::ReadLine::Gnuには大文字と小文字を区別しない補完を行う方法はありますか?

答えて

3

Term::ReadLine::Gnu::XS::_trp_completion_function()(ユーザー定義の完了関数のラッパー)に問題があるようです。

あなたのマッチはあなたのcomplete_word()関数から正常に取得されたが、その後ラッパーから次のスニペットは、独自の大文字と小文字を区別した一致を行います。

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(醜いハック)を無効にするか、直接XS.pm(おそらくもっと醜いハック)を修正する必要があります。

EDIT:使用Term::ReadLine::Gnuバージョン:1.20

+1

私は[パッチと一緒に(https://rt.cpan.org/Ticket/Display.html?id=72378)[このバグを報告]しましたそれを修正する](https://rt.cpan.org/Ticket/Attachment/998813/520214/completion.patch)。 – cjm

+2

私のパッチは 'Term :: ReadLine :: Gnu'バージョン[1.21](https://metacpan.org/changes/distribution/Term-ReadLine-Gnu)に適用されました。 – cjm

関連する問題