|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 29 Jul 2003 18:14:26 To : Alan Long Subject : Re: Term::Readline and CLI -------------------------------------------------------------------------------- Alan Long wrote: > * Created: at Tue, 29-Jul-2002 07:49 by Alan Long using timEd 1.10+. > > Hello All! > > Захотелось спросить у общественности про то, с помошью чего можно написать > следущую вешь. > > Есть Term::Readline::GNU которую я сейсас использую, в принципе удобно, но > хотелось-бы кое-что автоматизировать. > > Есть командная строка которая иммет вид: > > <command> <submenu...> [<key>[ <value]...] > > То есть заведение пользователя выглядит примерно так: > add user name "First" last "Last" uid 1100 password "secRet" email > user@mail.ru Hу и хотелось-бы что-бы дополнение (completition) работало > примерно следующим образом: add <tab> user group server add user <tab> name > last uid password email phone description add user name "First" last "Last" > uid 1100 password <tab> {тут ничего или какой-нибудь поясняющий текст что > нужно ввести имя пользователя} add user name "First" last "Last" uid 1100 > password "SesRet" <tab> email phone description То есть по-образу и подобию > того cli интерфейса что есть в некоторых маршрутизаторах. Может-быть есть > что-то готовое дабы не изобретать велосипед. Hу примерно так... функции lccompl и defcompl задел на будущее, когда надумается кроме ключевых слов completion для имен и т.д. вводить. uccompl подставляется вместо (точнее - как враппер, перед) стандартной $attribs->{list_completion_function} для регистронезависимого дополнения. $buffer и связаные с ним манипуляции нужны для накопления незавершеной команды состоящей из нескольких строк. В данном случае я сделал sql-like стиль. Т.е. команда не завершена пока нет ; в конце. Можно легко переделать на shell-style или выкинуть весь этот механизм вообще. Тогда все, что вернет $term->readline будет считаться командой от начала и до конца. ======================== вот оно ============================ #!/usr/bin/perl -w use strict; use Term::ReadLine; my $term = new Term::ReadLine 'myinterface'; my $attribs = $term->Attribs; my $buffer = ''; #my $start_compl = ['ADD', 'DELETE', 'MODIFY']; my $start_compl = [qw(ADD DELETE MODIFY)]; my $add_compl = ['USER', 'GROUP', 'SERVER']; my $add_compl_user = ['NAME', 'LAST', 'UID', 'PASSWORD', 'EMAIL', 'PHONE', 'DESCRIPTION']; sub uccompl { $attribs->{list_completion_function}->(uc shift, @_) } sub lccompl { $attribs->{list_completion_function}->(lc shift, @_) } sub defcompl { $attribs->{list_completion_function}->(@_) } $attribs->{completion_word} = []; $attribs->{completion_entry_function} = \&uccompl; $attribs->{attempted_completion_function} = sub { my ($text, $line, $start, $end) = @_; my $fline = $buffer . substr($line, 0, $start); $attribs->{completion_entry_function} = \&uccompl; if ($fline =~ /^\s*$/) { $attribs->{completion_word} = $start_compl; } elsif ($fline =~ /^\s*ADD\s+$/i) { $attribs->{completion_word} = $add_compl; } elsif ($fline =~ /^\s*ADD\s+USER\s+$/i) { $attribs->{completion_word} = $add_compl_user; } elsif ($fline =~ /^\s*ADD\s+USER\s+(\S.*)$/i) { my $tail = $1; my @pairs = $tail =~ /([^\s"]+|"(?:[^"\\]|\\.)*")\s+/g; if (scalar(@pairs) % 2 == 0) { my %pairs = map uc, @pairs; my @rest = grep {!exists $pairs{$_}} @$add_compl_user; $attribs->{completion_word} = \@rest; } else { $attribs->{completion_word} = []; } } else { $attribs->{completion_word} = []; } return (); }; while (defined ($_ = $term->readline($buffer ? 'prompt+ ' : 'prompt> '))) { $buffer .= $_; unless ($buffer =~ /;\s*$/) { $buffer .= ' ' if length($buffer); next; } $buffer =~ s/;\s*$//; print "Processing $buffer\n"; $buffer = ''; } ======================== конец ========================== -- Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6577d6bcf366.html, оценка из 5, голосов 10
|