Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Term::Readline and CLI   Alan Long   29 Jul 2003 07:49:27 
 Re: Term::Readline and CLI   Andrey Sapozhnikov   29 Jul 2003 18:14:26 
 Term::Readline and CLI   Alan Long   31 Jul 2003 01:06:08 
 Term::Readline and CLI   Alan Long   06 Aug 2003 08:22:58 
Архивное /ru.perl/6577d6bcf366.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional