Пример JLine с использованием многословных команд в строке
Я не могу найти пример, который использует более одной команды в строке.
Например, скажем, я хочу написать cli, похожий на cisco ios, где у вас может быть несколько уровней команд в одной строке.
например. первое слово может быть "show", затем, когда вы набираете "show" и нажимаете "tab", отображается следующий набор опций (в примере 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 с этим типом требований?
2 ответа
Используя 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, как показано ниже:
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);
}