Пример JLine с использованием команд из нескольких слов в строке

Кажется, я не могу найти пример, в котором используется более одной команды в строке.

Например, скажем, я хочу написать кли, похожую на cisco ios, где у вас может быть несколько уровней команд в одной строке.

например. первым словом может быть «показать», затем, когда вы набираете «показать» и нажимаете вкладку, отображается следующий набор параметров (в примере cisco для отображения списка используется «?»).

eg:
gw1#show ?
  aaa                   Show AAA values
  access-expression     List access expression
  access-lists          List access lists
  accounting            Accounting data for active sessions
  adjacency             Adjacent nodes
  ..

gw1#show ip ?
  access-lists         List IP access lists
  accounting           The active IP accounting database
  admission            Network Admission Control information
  aliases              IP alias table
  arp                  IP ARP table
  ..

gw1#show ip interface ?
  ATM                 ATM interface
  Async               Async interface
  BVI                 Bridge-Group Virtual Interface
  CDMA-Ix             CDMA Ix interface
  ..

gw1#show ip interface

Я думаю использовать readCharacter для чтения одного символа за раз, а затем анализировать строку до тех пор, пока не увижу пробел.

У кого-нибудь еще был опыт Jline с такими требованиями?


person user2507605    schedule 21.06.2013    source источник


Ответы (2)


Используя https://github.com/jline/jline2/blob/master/src/test/java/jline/example/Example.java в качестве справки, вы можете попробовать следующее. Ключевая идея заключается в том, чтобы использовать AggregateCompleterclass для объединения всех параметров за вас.

List<Completer> completors = new LinkedList<Completer>();
                    completors.add(
                            new AggregateCompleter(
                                    new ArgumentCompleter(new StringsCompleter("show"), new NullCompleter()),
                                    new ArgumentCompleter(new StringsCompleter("show"), new StringsCompleter("aaa", "access-expression", "access-lists", "accounting", "adjancey"), new NullCompleter()),
                                    new ArgumentCompleter(new StringsCompleter("show"), new StringsCompleter("ip"), new StringsCompleter("access-lists", "accounting", "admission", "aliases", "arp"), new NullCompleter()),
                                    new ArgumentCompleter(new StringsCompleter("show"), new StringsCompleter("ip"), new StringsCompleter("interface"), new StringsCompleter("ATM", "Async", "BVI"), new NullCompleter())
                                    )
                            );
            for (Completer c : completors) {
                reader.addCompleter(c);
            }

После запуска модифицированного Example.java с приведенным выше выводом будет выглядеть следующее.

prompt> show 
show    
prompt> show 
aaa                 access-expression   access-lists        accounting          adjancey            ip                  
prompt> show ip 
ip    
prompt> show ip 
access-lists   accounting     admission      aliases        arp            interface      
prompt> show ip interface 
ATM     Async   BVI     
prompt> show ip interface A
ATM     Async   
prompt> show ip interface A
ATM     Async   
prompt> show ip interface ATM 
======>"show ip interface ATM "
prompt> 
person Doraemon    schedule 09.01.2014

Это можно сделать с помощью AggregateCompleter в качестве показано ниже:

ConsoleReader reader = new MultiWordConsoleReader();
List<Completer> completers = new ArrayList<Completer>();

completors.add(new AggregateCompleter(new StringsCompleter("show"), new StringsCompleter("aaa", "access"), new NullCompleter()));
completors.add(new AggregateCompleter(new StringsCompleter("show"), new StringsCompleter("ip"), new StringsCompleter("accounting", "arp"), new NullCompleter()));

for (Completer c : completors) {
    reader.addCompleter(c);
}
person Maciek Burek    schedule 11.09.2017