以前没有认真的总结readline,发现它的功能还是很赞的,这次记录一下,方便日后查看
安装
在deepin下可以用这个命令(Ubuntu和deepin一样)
sudo apt-get install libreadline6-dev
原型
#include <readline/readline.h>
#include <readline/history.h>
①char *readline (const char *prompt);//返回值就是读取的字符串
②void add_history(const char *string);//用来返回历史
③typedef char *rl_compentry_func_t(const char *text, int state);
④char **rl_completion_matches(const char *text, rl_compentry_func_t *entry_func);
实现功能
①tab补全
typedef char *rl_compentry_func_t(const char *text, int state);
char **rl_completion_matches(const char *text, rl_compentry_func_t *entry_func);
该函数返回一个字符串数组,即参数text的补全列表;若没有补全项,则函数返回NULL。
该数组以空指针结尾,首个条目将替换text,其余条目为可能的补全项。函数指针entry_func指向一个具有两个参数的函数。
其中参数state在首次调用时为零,后续调用时为非零。未匹配到text时,entry_func返回空指针。
注:typedef char *rl_compentry_func_t(const char *text, int state);
这个typedef相当于把返回值为char*,参数为char*和int类型的函数,定义为rl_compentry_func_t,就是函数指针
相当于定义一个函数
char *func(const char *a, int b) {
return nullptr;
}
②查询历史记录
void add_history(const char *string);//用来返回历史
char *p = readline("myshell:");
add_history(p);
按上键就可以看到历史记录
③光标回退
使用
因为readline是动态链接库,gcc记得加-lreadline。
顺便提一句,如果想要知道动态链接库的地址,可以使用
ldconfig -p | grep readline
具体ldconfig的使用可以参考下面的博客
https://www.cnblogs.com/lyongde/p/4190588.html
完整代码
#include<iostream>
#include <readline/readline.h>
#include <readline/history.h>
using namespace std;
int main()
{
while(true)
{
char * p =readline("myshell:") ;
add_history(p);//加入历史列表
p = readline("myshell:");
}
}