用过 Bash 命令行的一定知道,Bash 有几个特性:
TAB
键可以用来命令补全↑
或↓
键可以用来快速输入历史命令- 还有一些交互式行编辑快捷键:
C-A
/C-E
将光标移到行首/行尾C-B
/C-F
将光标向左/向右移动一个位置C-D
删除光标下的一个字符C-K
删除光标及光标到行尾的所有字符C-U
删除光标到行首的所有字符- ...
同样的操作在很多交互式程序都有类似的操作,例如 ftp、gdb 等等,那么你是否想过这些是如何实现的呢?如果我们要做一个命令行下的交互式开源软件,是否希望也能有这些命令补全、搜索历史命令、行编辑快捷键等等这些人性化的交互方式呢?
要想实现这些,你有两种途径:可以自己写程序实现,或者调用开源的库 Readline Lib。例如上面介绍的 bash、ftp、gdb 等等软件都使用了 GNU 的开源跨平台库,为其提供交互式的文本编辑功能。当然需要注意的是,Readline Library 是 GNU 自由软件,在 GNU GPL V3 协议下发布,因此如果你的程序中需要用到该库,也必须遵守相关协议。
本文首先简单介绍一下该库的基本使用方法,后面会稍微详细介绍下如何使用 Readline 来自定义命令补全功能。
Readline 基本操作
很多命令行交互式程序交互方式都差不多,输出提示符,等待用户输入命令,用户输入命令之后按回车,程序开始解析命令并执行。那么这里面有个动作是读入用户的输入,以前我们也许使用 gets()
这样的函数来实现,当我们使用 Readline 库时,可以使用 readline()
函数来替换它,该函数在 ANSI C 中定义如下:
char *readline (char *prompt);
该函数带有一个参数 prompt,表示命令提示符,例如 ftp 中就是 "ftp>",用户在后面可以输入命令,当按下回车键时,程序读入该行(不包括最后的换行符)存入字符缓冲区中,readline
的返回值就是该行文本的指针。注意