linenoise
是一个命令行编辑库( line editing library ),由 Redis 设计者 Antirez 发布的一个用于替代 readline 的工具库。目前 linenoise 已经使用在 Redis、MongoDB、Android 等 应用上了
我们平时在使用 redis-cli 等工具的时候经常会发现输入命令的时候会有一些提示信息,这就是 linenoise 这个库比较直观的功能。我们这次主要探讨 linenoise 的 使用示例
以及 源码解析
特点
linenoise 有很多比较显著的特点,其中比较吸引我们的是:
- 及其简练,无需配置,直接调用
- 单行/多行 编辑模式都支持,并且实现了常用的快捷键绑定
- history 历史记录
- 兼容性
- 源码可读性好,而且只有 1100+ 行
项目地址:https://github.com/antirez/linenoise
使用示例
示例:example.c,代码比较简单,这里就不展示运行结果了,可以下载一下自行运行尝试
核心 API 主要为(根据使用顺序)
linenoiseSetMultiLine
设置多行模式linenoisePrintKeyCodes
键盘检测模式linenoiseSetCompletionCallback
设置信息自动补全回调函数,tab 效果linenoiseAddCompletion
添加补全信息linenoiseSetHintsCallback
设置命令提示内容以及显示样式linenoiseHistoryLoad
历史命令加载linenoise
命令动态监控linenoiseHistoryAdd
添加命令至历史列表linenoiseHistorySave
保存命令至历史文件linenoiseHistorySetMaxLen
设置命令最大保存个数
|
|
源码解析
由于有些方法里的代码量比较大,我们这里按照 典型的代码片段进行解析,同志们可以根据文章提示的代码位置 和 代码里面的关键词 在源码中搜素,可能数据结构一些元素 看不太懂什么意思,没关系,先混个脸熟,后面看完回头再看过来就明白了
linenoise
源码结构比较简单,主要就是 linenoise.c
文件,由于源码比较简单,我们主要对 char *linenoise(const char *prompt);
这一个 API 进行剖析…
|
|
linenoiseRaw函数的 核心处理逻辑为 linenoiseEdit
,用来处理用户交互运算
TAB 命令信息自动补全处理逻辑 completeLine()
本文作者: wettper
本文链接: http://www.web-lovers.com/c-linenoise.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!