linenoise是一个line editing library,即命令行编辑库,地址是https://github.com/antirez/linenoise
官方介绍如下,
使用起来有点像dos终端,本文讲述如何使用linenoise
一 使用 1. 下载linenoise
github上没有release的库,只有tag库,地址是https://github.com/antirez/linenoise/tags,进入后点击zip下载,
新建目录linenoise_test,然后把下载下来的linenoise库解压到该目录下,并重命名为linenoise,同时创建build目录,src目录和src/main.c,以及CMakeLists.txt,最后结构如下
main.c内容如下,
#include#include #include "linenoise.h" int main() { char* line = NULL; while ((line = linenoise("hello> ")) != NULL) { printf("Your wrote: %sn", line); free(line); } return 0; }
CMakeLists.txt的内容如下,
cmake_minimum_required(VERSION 3.5)
project(demo)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/linenoise)
set(SRC_FILE
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
${CMAKE_CURRENT_SOURCE_DIR}/linenoise/linenoise.c
)
add_executable(demo ${SRC_FILE})
3. 测试
cd到build目录,然后执行下面命令进行编译,
cmake .. && make
最后运行build目录下的demo,如下,
可以看到使用这个库可以创造出一个终端,给用户使用,"hello>"是终端提示符,英文叫prompt
可以给终端提示符加上颜色,main.c修改如下,
#include#include #include "linenoise.h" #define NONE " 33[m" #define GREEN " 33[0;32;32m" int main() { char* line = NULL; while ((line = linenoise(GREEN"hello> "NONE)) != NULL) { printf("Your wrote: %sn", line); free(line); } return 0; }
最后运行如下,
linenoise同时支持tab补全,即在提示符后输入一个字符,然后按tab键可以自动补全,linenoise目录里有一个example.c,把它加入到编译工程里,CMakeLists.txt改成如下,
cmake_minimum_required(VERSION 3.5)
project(demo)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/linenoise)
set(SRC_FILE
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
${CMAKE_CURRENT_SOURCE_DIR}/linenoise/linenoise.c
)
set(EXAMPLE_SRC_FILE
${CMAKE_CURRENT_SOURCE_DIR}/linenoise/example.c
${CMAKE_CURRENT_SOURCE_DIR}/linenoise/linenoise.c
)
add_executable(demo ${SRC_FILE})
add_executable(example ${EXAMPLE_SRC_FILE})
最后编译生成example,然后运行,接着在提示符后输入h,如下,
此时按tab键,就会自动补全为"hello",
再按一次tab,又会自动补全为"hello there",
如果再按tab,就会回到"h",开始循环
example.c里定义了一个回调函数completion,
void completion(const char *buf, linenoiseCompletions *lc) {
if (buf[0] == 'h') {
linenoiseAddCompletion(lc,"hello");
linenoiseAddCompletion(lc,"hello there");
}
}
在main函数里会使用linenoiseSetCompletionCallback()注册这个回调,这样输入“h”然后按tab键,就会触发这个回调进行补全。



