linenoise是一个line editing library,即命令行编辑库,地址是https://github.com/antirez/linenoise
官方介绍如下,
使用起来有点像dos终端,本文讲述如何使用linenoise
一 使用
1. 下载linenoise
github上没有release的库,只有tag库,地址是https://github.com/antirez/linenoise/tags,进入后点击zip下载,
2. 创建工程
新建目录linenoise_test,然后把下载下来的linenoise库解压到该目录下,并重命名为linenoise,同时创建build目录,src目录和src/main.c,以及CMakeLists.txt,最后结构如下
main.c内容如下,
#include <stdio.h>
#include <stdlib.h>
#include "linenoise.h"
int main()
{
char* line = NULL;
while ((line = linenoise("hello> ")) != NULL)
{
printf("Your wrote: %s\n", 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
4. 彩色提示符
可以给终端提示符加上颜色,main.c修改如下,
#include <stdio.h>
#include <stdlib.h>
#include "linenoise.h"
#define NONE "\033[m"
#define GREEN "\033[0;32;32m"
int main()
{
char* line = NULL;
while ((line = linenoise(GREEN"hello> "NONE)) != NULL)
{
printf("Your wrote: %s\n", line);
free(line);
}
return 0;
}
最后运行如下,
5. tab补全
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键,就会触发这个回调进行补全。