2013-06-21 19 views
5

Her satıra birden fazla komut kullanan bir örnek bulamıyorum. Örneğin, bir satırda birden çok komut düzeyine sahip olabileceğiniz, cisco ios benzeri bir kısayol yazmak istediğimi varsayalım. Örn.,J Hat başına çoklu sözcük komutlarını kullanan satır örneği

örn. ilk kelime "show" olabilir, daha sonra "show" yazıp "hit" sekmesine bastığınızda, bir sonraki seçenekler grubu görüntülenir (cisco exmaple listeyi göstermek için "?" kullanır).

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 

Bir seferde bir karakter okumak ve ben bir boşluk gördüğünüzde sonra bugüne kadar çizgisini ayrıştırmak için readCharacter kullanarak düşünüyorum.

Bu tür bir gereksinimle başka herhangi bir Jline deneyimi oldu mu?

cevap

7

https://github.com/jline/jline2/blob/master/src/test/java/jline/example/Example.java'u referans olarak kullanarak, aşağıdakileri denemek isteyebilirsiniz. Bunun arkasındaki temel fikir, seçeneklerin tümünü birleştirmek için AggregateCompleter sınıfını kullanmaktır.

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

Değiştirilen Example.java'yı yukarıdaki ile çalıştırdıktan sonra, çıktı aşağıdaki gibi görünecektir.

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> 
aşağıda gösterildiği gibi AggregateCompleter kullanılarak yapılabilir
0

:

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