linenoise的使用

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键,就会触发这个回调进行补全。

### Linenoise 命令行工具使用方法 Linenoise 是一个轻量级的库,用于实现命令行编辑功能。该库提供了基本的历史记录管理以及自动补全等功能,在 Redis 的 CLI 工具中也有所应用。 #### 安装与配置 为了使用 linenoise 库,通常需要将其集成到应用程序源码内[^1]。然而对于已经编译好的二进制文件,则无需额外安装任何东西即可享受其特性带来的便利。 #### 使用示例 下面是一些典型的场景下如何利用 linenoise 提升用户体验: - **历史命令检索** 当用户按下向上箭头键时,可以依次查看之前输入过的指令;向下箭头则相反方向遍历。这使得重复执行相同操作变得非常方便快捷。 ```bash # 用户可以通过上下箭头来浏览之前的命令 ``` - **命令提示与自动完成** 通过自定义回调函数,可以在敲入部分字符后按 Tab 键触发匹配项列表显示,帮助快速定位目标命令或参数选项。 ```c // C语言中的简单例子展示如何设置自动完成功能 void completer(const char *text, linenoiseCompletions *lc) { if (strncmp(text,"com",3)==0) { linenoiseAddCompletion(lc,"command"); } } ... linenoiseSetCompletionCallback(completer); ``` - **多行模式支持** 允许跨越单行限制编写复杂表达式或多条语句组合而成的任务脚本,并且能够正确处理缩进等问题。 ```python # Python风格的例子说明怎样启用多行输入方式 if condition: do_something() else: handle_other_case() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值