2013-06-21 22 views
5

Tôi dường như không thể tìm thấy ví dụ sử dụng nhiều lệnh trên mỗi dòng.Ví dụ JLine sử dụng các lệnh đa từ trên mỗi dòng

Ví dụ: giả sử tôi muốn viết một cli tương tự như cisco ios, nơi bạn có thể có nhiều cấp lệnh trên một dòng.

ví dụ: từ đầu tiên có thể là "hiển thị", sau đó khi bạn nhập "hiển thị" và nhấn tab, tập hợp các tùy chọn tiếp theo được hiển thị (cisco exmaple sử dụng "?" để hiển thị danh sách).

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 

Tôi đang nghĩ đến việc sử dụng readCharacter để đọc một ký tự cùng một lúc và sau đó phân tích cú pháp dòng cho đến khi tôi nhìn thấy một khoảng trắng.

Có ai khác có bất kỳ trải nghiệm Jline nào với loại yêu cầu này không?

Trả lời

7

Sử dụng https://github.com/jline/jline2/blob/master/src/test/java/jline/example/Example.java làm tham chiếu, bạn có thể muốn thử các bước sau. Ý tưởng chính đằng sau nó là sử dụng lớp AggregateCompleter để làm tất cả việc hợp nhất các tùy chọn cho bạn.

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

Sau khi chạy Example.java đã sửa đổi ở trên, đầu ra sẽ trông giống như sau.

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

Nó có thể được thực hiện bằng cách sử dụng AggregateCompleter như hình dưới đây:

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); 
} 
Các vấn đề liên quan