2013-06-21 11 views
5

Ich kann kein Beispiel finden, das mehr als einen Befehl pro Zeile verwendet.JLine-Beispiel mit mehreren Wortbefehlen pro Zeile

Zum Beispiel sagen, ich möchte einen CLI ähnlich wie Cisco IOS schreiben, wo Sie mehrere Ebenen von Befehlen auf der einen Linie haben können.

z. Das erste Wort könnte "show" sein, dann, wenn Sie "show" eingeben und die Tabulatortaste drücken, wird der nächste Satz von Optionen angezeigt (das Cisco-Beispiel verwendet "?", um die Liste anzuzeigen).

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 

Ich denke readCharacter der Verwendung eines Zeichens zu einer Zeit, zu lesen und dann die Zeile parsen so weit, wenn ich einen Raum zu sehen.

Hat jemand anderes Jline Erfahrung mit dieser Art von Anforderung gehabt?

Antwort

7

Wenn Sie https://github.com/jline/jline2/blob/master/src/test/java/jline/example/Example.java als Referenz verwenden, möchten Sie vielleicht Folgendes versuchen. Die Schlüsselidee dahinter ist die Verwendung der Klasse AggregateCompleter, um alle Optionen für Sie zusammenzuführen.

Nach dem Ausführen der modifizierten Beispiel.java mit dem oben genannten würde die Ausgabe wie folgt aussehen.

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> 
0

Es kann AggregateCompleter unter Verwendung erfolgen, wie unten dargestellt:

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