我们都知道,软件的用户界面无非分为 GUI (图形用户界面)和 CLI (命令行用户界面)。对于我们经常使用 Linux 的人来说,命令行界面一定非常熟悉。无论是 Shell 里输入命令的界面,还是如 GDB 等软件的内部交互界面,都是命令行界面。而当我们开发自己的软件,要写认真写一个 CLI 的时候,却发现要手写做出一个好用的命令行界面其实非常困难。因为一个好的命令行界面,在输入/输出之外,还要支持一些常见的命令行功能。
对我而言,一个合格的命令行软件界面应该支持这三个功能:
- 自动补全:当按下 TAB 键时,在当前光标处进行内容补全。根据上下文信息,补全可能是对命令的补全,也可能是对文件路径的补全。
- 命令历史:当按上/下方向键时,可以显示上一条/下一条命令。
- 行编辑 (line editing):可以使用 Emacs 快捷键进行行内的编辑功能,例如 Ctrl+A 移动光标至行首,Ctrl+E 移动光标至行尾。
熟悉 Linux 的人会发现,上面这三个功能都是 GNU Readline 的功能。我们不需要在软件中手写这几个功能,只要用这样一个库就可以了。实际上,GNU/Linux 中使用 GNU Readline 库的软件非常多,这使得 GNU Readline 同时也成为了一个事实上的命令行交互标准。GNU Readline 是 C 语言的库。我们用其他语言的时候,就要找对应功能的库(这往往是封装了底层的 GNU Readline 的库)。对 Java 语言来说,JLine 就是这样一个帮助你搭建一个命令行交互界面的库。
本文是想通过一个例子介绍 JLine3 的基本用法。JLine3 并没有一个 “Hello, world!” 的例子,它的 wiki 也写得非常简略。虽然有一个示例的程序 Example.java,但这个示例比较复杂,难以理解。希望本文的内容能对你理解 JLine3 的用法有所帮助。
基本框架
我们尝试为软件 Fog 设计一个命令行用户界面。用户可以输入四种命令:
1 | CREATE [FILE_NAME] |