java - 每行使用多字命令的 JLine 示例

标签 java command-line-interface jline

我似乎找不到每行使用多个命令的示例。

例如,假设我想编写一个类似于 cisco ios 的 cli,您可能在一行中有多个级别的命令。

例如。第一个词可能是“show”,然后当您键入“show”并点击 Tab 键时,将显示下一组选项(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 有其他人有过此类需求的经验吗?

最佳答案

使用 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> 

关于java - 每行使用多字命令的 JLine 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227703/

上一篇:Java图形布局算法

下一篇:Java RTF 解析器

相关文章:

java - 有没有办法在字符串上使用 replaceAll 但调用方法在每次匹配项出现时替换文本

java - 套接字服务器: should provide shell like interface

command-line-interface - 为什么可以在未装箱的值类型(没有基类)上调用虚拟 System.Object 成员?

command - PHP Composer,命令行(CLI)添加类路径以在 composer.json 中自动加载 PSR-4/PSR-0/文件

linux - "Bad File Descriptor"异常因为使用nohup

java - 如何使用java api更新elasticsearch中的嵌套字段值

java - 当我在 netbeans 上使用 Maven 创建 Java Web 项目时,应该忽略哪些文件和文件夹?

java - Android 工具栏无法正常工作

java - 如何使用 JLine 将值添加到键并保存自动完成功能?

java - 为什么我的命令提示符显示未输入任何字符?