linenoise是一个命令行编辑库(line editing library),由redis数据库设计者Antirez发布一个用于颠覆“一个命令行编辑库需要20000行C代码”的观点。目前linenoise已经使用在Redis, MongoDB,Android等应用上。其支持特性如下:
1) 尽可能简小,无配置,支持BSD license。
2) 单行或多行编辑模式,使用常用的快捷键绑定实现。
3)支持历史键入文本查询。
4)兼容性。
5)大约只有1100行代码,支持BSD license。
6)只使用VT100 escapes键码的子集。
我阅读了linenoise源码,非常简单,非常简练,其中也有很多值得学习的东西,于是将这些东西记录下来,供自己使用,也供各位参考。
一、 文件构成:
linenoise库文件非常少,没有子目录,其中的核心文件仅仅是linenoise.c 和linenoise.h,还有一个example.c,作为使用的教学程序。当然,还有一个makefile和README.markdown,此处我只分析核心的linenoise.c和linenoise.h。
二、数据结构:
(1)linenoiseCompletions:
typedef struct linenoiseCompletions {
size_t len;
char **cvec;
} linenoiseCompletions;
此结构用于帮助实现用户输入自动补全功能。就像我们使用linux命令行终端一样,当我们键入命令头几个字母,使用tab键便可以完成自动补全或查找匹配,或者我们指定cd路径,输入路径头几个字符,tab后完成后面的补全工作。而linenoise实现的也是这个功能,但真正的匹配工作需要你注册函数完成,就是linenoise中的completionCallback。
此结构体只有两个导出方法,第一个是: