|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alan Long 2:5030/1082.72 31 Jul 2003 01:06:08 To : Andrey Sapozhnikov Subject : Term::Readline and CLI -------------------------------------------------------------------------------- * Originally from Andrey Sapozhnikov (2:5020/400) to Alan Long. AS> From: Andrey Sapozhnikov <sapa@icb.chel.su> [...] AS> Hу примерно так... функции lccompl и defcompl задел на будущее, AS> когда надумается кроме ключевых слов completion для имен и т.д. AS> вводить. uccompl подставляется вместо (точнее - как враппер, перед) AS> стандартной $attribs->{list_completion_function} для AS> регистронезависимого дополнения. $buffer и связаные с ним AS> манипуляции нужны для накопления незавершеной команды состоящей из AS> нескольких строк. В данном случае я сделал sql-like стиль. Т.е. AS> команда не завершена пока нет ; в конце. Можно легко переделать AS> на shell-style или выкинуть весь этот механизм вообще. Тогда все, AS> что вернет $term->readline будет считаться командой от начала и до AS> конца. AS> ======================== вот оно ============================ AS> #!/usr/bin/perl -w AS> use strict; AS> use Term::ReadLine; AS> my $term = new Term::ReadLine 'myinterface'; AS> my $attribs = $term->Attribs; AS> my $buffer = ''; AS> #my $start_compl = ['ADD', 'DELETE', 'MODIFY']; AS> my $start_compl = [qw(ADD DELETE MODIFY)]; AS> my $add_compl = ['USER', 'GROUP', 'SERVER']; AS> my $add_compl_user = ['NAME', 'LAST', 'UID', 'PASSWORD', 'EMAIL', AS> 'PHONE', 'DESCRIPTION']; AS> sub uccompl { $attribs->{list_completion_function}->(uc shift, @_) AS> } sub lccompl { $attribs->{list_completion_function}->(lc shift, AS> @_) } sub defcompl { $attribs->{list_completion_function}->(@_) } AS> $attribs->{completion_word} = []; AS> $attribs->{completion_entry_function} = \&uccompl; AS> $attribs->{attempted_completion_function} = sub { AS> my ($text, $line, $start, $end) = @_; AS> my $fline = $buffer . substr($line, 0, $start); AS> $attribs->{completion_entry_function} = \&uccompl; AS> if ($fline =~ /^\s*$/) { AS> $attribs->{completion_word} = $start_compl; AS> } elsif ($fline =~ /^\s*ADD\s+$/i) { AS> $attribs->{completion_word} = $add_compl; AS> } elsif ($fline =~ /^\s*ADD\s+USER\s+$/i) { AS> $attribs->{completion_word} = $add_compl_user; AS> } elsif ($fline =~ /^\s*ADD\s+USER\s+(\S.*)$/i) { AS> my $tail = $1; AS> my @pairs = $tail =~ /([^\s"]+|"(?:[^"\\]|\\.)*")\s+/g; AS> if (scalar(@pairs) % 2 == 0) { AS> my %pairs = map uc, @pairs; AS> my @rest = grep {!exists $pairs{$_}} @$add_compl_user; AS> $attribs->{completion_word} = \@rest; AS> } else { AS> $attribs->{completion_word} = []; AS> } AS> } else { AS> $attribs->{completion_word} = []; AS> } AS> return (); AS> }; AS> while (defined ($_ = $term->readline($buffer ? 'prompt+ ' : AS> 'prompt> '))) { $buffer .= $_; AS> unless ($buffer =~ /;\s*$/) { AS> $buffer .= ' ' if length($buffer); AS> next; AS> } AS> $buffer =~ s/;\s*$//; AS> print "Processing $buffer\n"; AS> $buffer = ''; AS> } AS> ======================== конец ========================== В принципе у меня что-то подобное написанно, для нескольких команд достаточно удобно, но если дерево команд достаточно большое, то ... В принципе я спрашивал про готовые наработки в этой области дабы не изобретать велосипед, так весь синтаксис команд хотелось-бы описать как-нибудь так: $commands = { add => { user => { name => 'value', last => 'value', uid => 'value', password => 'value', email => 'value', phone => 'value', }, group => { } }, remove => { user => 'list', group => 'list', }, config => { ldap => { server => 'value', base => 'value', bind => 'value', password => 'value', } } }; Hу а раз нету готвого - пошел изобретать велосипед, хотя тут где-то в гугле видел SQL-клиент написанный на perl+readline, нужно будет посмотреть может-быть там что-нибудь полезное для себя найду... Так-же интересуют продукты на perl использующие readline, и написанные неплохо где можно всему этому (созданию CLI) поучится, пока изучаю psh (или как он называется perl shell) из комплекта поставки Term::Readline::GNU. AS> Андрей -- With best, Ъ-· Ъ Е-ЧLaі\і <alan@x-rays.eu.org> --- timEd/386 1.10+ * Origin: X - Rays Station (2:5030/1082.72) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/4581f2833351.html, оценка из 5, голосов 10
|