2016-05-13 2 views
1

Je sais comment utiliser les fonctions d'achèvement personnalisées avec Term :: Readline :: Gnu (Perl), par ex.Term :: Readline :: Gnu - comment utiliser complete_internal (si possible ..)?

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'}); 
}; 

..mais je ne suis absolument pas obtenir comment utiliser complete_internal:

int  rl_complete_internal(int what_to_do = TAB) 

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

De la GNU Readline Docs:

Une valeur de ?' means list the possible completions. TAB 'signifie l'achèvement standard. *' means insert all of the possible completions.! ' signifie pour afficher toutes les commandes possibles (...)

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

Cela me semble gnu-readline a une "cisco-like"/routeur en mode cli - mais peut-être que je reçois quelque chose de complètement mal ici? Et s'il y a quelque chose comme ça; comment puis-je passer des données d'achèvement personnalisées à l'aide de Term :: Readline :: Gnu? Je ai cherché SO, GitHub Code, Google etc pp et je suis presque certain de manquer (comprendre) quelque chose.

ce serait génial si tu pouvais m'éclaircir.

Répondre

0

Voici un exemple de la façon d'utiliser rl_complete_internal:

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; 
} 

Si vous tapez t à l'invite, puis appuyez sur CTRL-y il affichera les deux candidats d'achèvement, à savoir two et three. En effet, selon la bibliothèque GNU Readline documentation, section 2.6:

int rl_complete_internal (int what_to_do)

Remplissez le mot à ou avant le point. what_to_do dit quoi faire avec l'achèvement. Une valeur de ? signifie la liste des complétions possibles. TAB signifie faire achèvement standard. * signifie insérer toutes les finitions possibles. ! signifie d'afficher tous les compléments possibles, s'il y a plus de qu'un seul, tout en effectuant une complétion partielle. @ est similaire à !, mais les complétions possibles ne sont pas répertoriées si les complétions possibles partagent un préfixe commun.

+0

Merci beaucoup Håkon! J'étais en vacances et je suis resté à l'écart du clavier - je regarderai de plus près votre code au cours des prochains jours, puis je ferai des commentaires. –