2016-05-13 7 views
1

Ich weiß, wie benutzerdefinierte Vervollständigungsfunktionen mit Term :: Readline :: Gnu (Perl), z.Begriff :: Readline :: Gnu - wie zu verwenden complete_internal (wenn möglich ..)?

str  list_completion_function(str text, int state) 

http://search.cpan.org/dist/Term-ReadLine-Gnu/Gnu.pm#Custom_Completion https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC47

$attribs->{attempted_completion_function } = sub { 
    my ($text, $line, $start, $end) = @_; 
    my @cmds = ('one', 'two', 'three'); 
    $attribs->{completion_word} = \@cmds; 
    return $term->completion_matches($text, $attribs->{'list_completion_function'}); 
}; 

..aber ich absolut nicht bekommen, wie complete_internal verwenden:

int  rl_complete_internal(int what_to_do = TAB) 

http://search.cpan.org/dist/Term-ReadLine-Gnu/Gnu.pm#Custom_Completion

Von der GNU Readline-Docs:

Ein Wert von ?' means list the possible completions. TAB 'bedeutet, Standardausführung abzuschließen. *' means insert all of the possible completions.! ' einen "cisco-like"/Router-cli Modus bedeutet, alle möglichen Vervollständigungen (...) hat

https://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC47

Das klingt für mich wie Gnu-Readline- angezeigt werden - aber vielleicht etwas völlig i bekommen falsch hier? Und wenn es so etwas gibt; Wie kann ich benutzerdefinierte Abschlussdaten mit Term :: Readline :: Gnu?

Ich suchte SO, GitHub Code, Google usw. pp und bin fast sicher etwas zu verpassen (verstehen). es wäre toll, wenn du mich aufhübst. Hier

Antwort

0

ist ein Beispiel dafür, wie rl_complete_internal zu verwenden:

use feature qw(say); 
use strict; 
use utf8; 
use open qw(:std :utf8); 
use warnings; 
use Term::ReadLine; 

my $term = Term::ReadLine->new('Test', \*STDIN, \*STDOUT); 
$term->ornaments(0); 
my $attribs = $term->Attribs; 
$attribs->{completion_word} = [qw(one two three)]; 
$attribs->{completion_entry_function} = 
    $attribs->{list_completion_function}; 
$term->add_defun('custom-action', \&my_bind_key_func); 
$term->bind_key(ord "\cy", 'custom-action'); 
my $answer = $term->readline('Enter input: '); 
say "You entered: '$answer'"; 

sub my_bind_key_func { 
    my($count, $key) = @_; 
    $term->complete_internal(ord '?'); 
    return 0; 
} 

Wenn Sie t an der Eingabeaufforderung eingeben und dann drückt CTRL-y es die zwei Vervollständigungskandidaten angezeigt werden, nämlich two und three. Dies liegt daran, nach dem GNU Readline-Bibliothek documentation, section 2.6:

int rl_complete_internal (int what_to_do)

komplett das Wort an oder vor dem Punkt. what_to_do sagt, was mit der Fertigstellung zu tun ist. Ein Wert von ? bedeutet, dass die möglichen Vervollständigungen aufgeführt sind. TAB bedeutet do Standard-Abschluss. * bedeutet, dass alle möglichen Vervollständigungen eingefügt werden. ! bedeutet, dass alle möglichen Vervollständigungen angezeigt werden, falls mehr als vorhanden ist, sowie teilweise Fertigstellung. @ ist ähnlich wie !, aber mögliche Vervollständigungen sind nicht aufgeführt, wenn die möglichen Vervollständigungen ein gemeinsames Präfix teilen.

+0

Vielen Dank Håkon! Ich war im Urlaub und habe mich von der Tastatur ferngehalten - werde in den nächsten Tagen deinen Code genauer betrachten und dann Feedback geben. –