2016-05-13 7 views
1

Я знаю, как использовать пользовательские функции завершения с помощью Term :: Readline :: Gnu (Perl), например.Термин :: Readline :: Gnu - как использовать complete_internal (если возможно ..)?

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

..но я абсолютно не понимаю, как использовать complete_internal:

int  rl_complete_internal(int what_to_do = TAB) 

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

С GNU Readline Docs:

Значение ?' means list the possible completions. TAB 'означает выполнить стандартное завершение. *' means insert all of the possible completions.! ' означает, что для отображения всех возможных завершений (...)

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

Это звучит для меня как Гну-Readline имеет «CISCO типа»/маршрутизатор-кли режим - но, возможно, я полностью получить что-то Неправильно здесь? И если есть что-то подобное; как я могу передать данные пользовательского завершения, используя Term :: Readline :: Gnu?

Я искал SO, код GitHub, Google и т. Д., И я почти наверняка пропустил (понял) что-то. было бы здорово, если бы вы могли осветить меня.

ответ

0

Вот пример того, как использовать 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; 
} 

Если вы наберете t в командной строке, а затем нажмите CTRL-y он покажет два кандидата завершения, а именно two и three. Это происходит потому, что в соответствии с GNU Readline библиотеки documentation, section 2.6:

INT rl_complete_internal (INT what_to_do)

Полное слово в или до точки. what_to_do говорит, что делать с завершением. A Значение ? означает, что список вариантов завершен. TAB способ есть стандарт полнота. * означает вложение всех возможных завершений. ! означает отображение всех возможных завершений, если существует больше , чем один, а также выполнение частичного завершения. @ похож на !, но возможные доработки не указаны, если возможное завершение имеет общий префикс.

+0

Большое спасибо Håkon! Я был в отпуске и держался подальше от клавиатуры - внимательно рассмотрю ваш код в течение следующих дней, а затем дадим обратную связь. –

 Смежные вопросы

  • Нет связанных вопросов^_^