2013-06-21 3 views
5

한 줄에 하나 이상의 명령을 사용하는 예제를 찾을 수 없습니다.한 줄에 여러 단어 명령을 사용하는 JLine 예제

예를 들어, 한 줄에 여러 수준의 명령이있는 cisco ios와 비슷한 CLI를 작성하고 싶다고 가정 해 봅시다.

예 : 첫 번째 단어는 "표시"될 수 있으며, "show"를 입력하고 탭을 누르면 다음 옵션 집합이 표시됩니다 (cisco exmaple은 목록을 표시하기 위해 "?"를 사용합니다).

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 경험이있는 사람이 있습니까?

답변

7

https://github.com/jline/jline2/blob/master/src/test/java/jline/example/Example.java을 참조로 사용하면 다음을 시도 할 수 있습니다. 그 뒤에있는 핵심 아이디어는 AggregateCompleter 클래스를 사용하여 옵션을 모두 병합하는 것입니다.

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> 
아래와 같이이 AggregateCompleter을 사용하여 수행 할 수
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); 
}