【解锁】Linenoise——C命令行处理工具

Linenoise

今天解锁一个开源的REPL工具——Linenoise。Linenoise是可以完全代替readline的,非常轻量级的命令行处理工具。Redis,MongoDB和Android都将Linenoise作为命令行解析工具,那么今天我们就来解锁这个开源的命令行处理工具,也许某一天在你的项目里会派上用场。

特性

  • 支持单行和多行编辑模式,实现了常用的键绑定。
  • 支持历史命令记录
  • 支持命令不全
  • 支持命令提示
  • 超轻量级,大约1100行代码(readline大约30,000行代码)
  • 非常方便的融入你的项目李(一个.h,一个.c)

api简介

Linenoise非常易于使用,阅读该库附带的示例将使您尽快熟悉。以下是API调用及其使用方式。

char *linenoise(const char *prompt);

该接口现实命令提示符如hello> ,并返回用户输入缓冲区,当内存不足活文件结尾是返回NULL。
使用该接口循环接受用户输入命令并现实提示符

while((line = linenoise("hello> ")) != NULL) {
    printf("You wrote: %s\n", line);
    linenoiseFree(line); /* Or just free(line) if you use libc malloc. */
}


单行 or 多行编辑

默认情况下linenoise使用单行编辑,如果需要输入大量内容可以开启多行编辑模式。

linenoiseSetMultiLine(1);

命令历史

Linenoise支持历史记录,因此用户不必一次又一次地键入相同的内容,而是可以使用向下和向上箭头来搜索和重新编辑已经插入的命令。——个人觉得这个功能非常有用。

// 将一条你执行的命令添加到历史,从而你可以通过上下键找到它
int linenoiseHistoryAdd(const char *line);
// 要使用历史记录,您必须设置历史记录的长度(默认情况下为零,因此,如果未设置正确的长度,则将禁用历史记录)
int linenoiseHistorySetMaxLen(int len);
// Linenoise直接支持将历史记录保存到历史记录文件中,通过下面两个接口可以存取历史文件内容
int linenoiseHistorySave(const char *filename);
int linenoiseHistoryLoad(const char *filename);

下面是一段范例代码

    while((line = linenoise("hello> ")) != NULL) {
        /* Do something with the string. */
        if (line[0] != ‘\0‘ && line[0] != ‘/‘) {
            printf("echo: ‘%s‘\n", line);
            linenoiseHistoryAdd(line); /* Add to the history. */
            linenoiseHistorySave("history.txt"); /* Save the history on disk. */
        } else if (!strncmp(line,"/historylen",11)) {
            /* The "/historylen" command will change the history len. */
            int len = atoi(line+11);
            linenoiseHistorySetMaxLen(len);
        } else if (line[0] == ‘/‘) {
            printf("Unreconized command: %s\n", line);
        }
        free(line);
    }

自动补全

Linenoise支持自动补全功能,即用户按下<TAB>键时会自动补全你的命令。
为了实现这一功能,你可以注册并实现你的补全函数。

// 注册自动补全函数completion
linenoiseSetCompletionCallback(completion);

注册的补全必须是一个void返回值函数,需要传入一个const char指针(该指针是用户到目前为止已键入的命令字符)和一个linenoiseCompletions对象指针,该对象指针用作是linenoiseAddCompletion将回调添加到补全中的参数。一个例子将使其更加清楚:

void completion(const char *buf, linenoiseCompletions *lc) {
    if (buf[0] == ‘h‘) {
        linenoiseAddCompletion(lc,"hello");
        linenoiseAddCompletion(lc,"hello there");
    }
}

用户输入‘h‘是会现实补全列表"hello","hello there"。

命令提示

Linenoise具有称为提示的功能,当你使用Linenoise实现REPL时,这个功能非常有用。
当用户键入时,该功能会在光标的右侧显示可能有用的提示。提示可以使用与用户键入的颜色不同的颜色显示,也可以加粗。
例如,当用户开始输入"git remote add"提示时,可以在提示的右侧显示字符串<name> <url>
改接口与自动补全功能类似:

linenoiseSetHintsCallback(hints);

回调函数实现如下:

char *hints(const char *buf, int *color, int *bold) {
    if (!strcasecmp(buf,"git remote add")) {
        *color = 35;
        *bold = 0;
        return " <name> <url>";
    }
    return NULL;
}


颜色编码:

red = 31
green = 32
yellow = 33
blue = 34
magenta = 35
cyan = 36
white = 37;

清屏

有时候你可能想通过输入某条命令来清屏,比如hello> clear,那么可以使用下面的接口:

void linenoiseClearScreen(void);

总结

今天主要解锁了Linenoise的用法,Linenoise非常简单,且很容易嵌入到你的项目里。希望对有REPL需求的小伙伴有些帮助。后续将继续解锁Linenoise的进化版Linenoise-NG(Linenoise Next Generation)。尽请期待~

Linenoise代码托管地址

原文地址:https://blog.51cto.com/14670895/2468370

时间: 2024-10-09 09:50:24

【解锁】Linenoise——C命令行处理工具的相关文章

Linux上超酷的命令行扩展工具Oh My Zsh

Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命令行. 什么是 Oh My ZshOh My Zsh 这个名字听起来就很有意思~, 它是基于 zsh 命令行的一个扩展工具集,提供了丰富的扩展功能. Oh My Zsh 的主页上,对它的定义有了明确的解释:http://ohmyz.sh 关于 zsh,它是一种命令行程序.我们 MAC 系统上默认使用

libvirt 命令行交互工具之virsh

libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知识libvirt大体上主要有3个组件,分别是: 1. libvirt daemon进程 2. 命令行工具virsh 3. libvirt API virsh命令使用 virsh <command> <domain-id> [OPTIONS] virsh既有命令行模式,也有交互模式,在命令行直接输入vir

PowerCmd(命令行增强工具) 2.2 免费版

软件名称: PowerCmd(命令行增强工具) 2.2 免费版 软件语言: 英文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 1.8MB 图片预览: 软件简介: 一款Windows CMD软件的增强工具,可以比普通CMD工具提供更多选项 软件下载页面:http://www.bkill.com/download/9020.html 软件下载地址:电信下载 联通下载

12款最佳Linux命令行终端工具

12款最佳Linux命令行终端工具 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端软件,可以用来替代debian系的Linux原生终端. Tilda tilda 这是一款可配置的雷神之锤风格的终端工具,也就是说,当用户敲击配置好的热键(缺省是F1)时,这个终端会从屏幕的顶端滑出,就跟雷神之锤游戏中的效果一样. 它的安装方法: apt-get install tilda Tilda跟其

[转]12款最佳Linux命令行终端工具

摘要 “工欲善其事必先利其器”,作为菜鸟,也是从别人那里偷学来的一些东东.今天看到同事用到一个终端命令行工具,觉得自己弱爆了.然后在网上搜了下该工具.发现类似的工具还是挺多的,只是自己不知道罢了. 原文链接:12款最佳Linux命令行终端工具 内容 如果你跟我一样,整天要花大量的时间使用 Linux 命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端软件,可以用来替代 debian 系的 Linux 原生终端. Tilda 这是一款可

iOS系统提供开发环境下命令行编译工具:xcodebuild

iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件. 使用Workspace的好处有: 1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出.Workspace会负责各个Project

命令行开发工具

android 1.全局选项: -s    --silent : Silent mode,show errors only -v    --verbose : Verbose mode,show errors,warnings and all messages         --clear-cache:Clear the SDK Manager repository manifest cache -h   --help : Help on a specific command 2.子命令: s

python之命令行解析工具argparse

以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效果还不错. argparse的官方文档请看 https://docs.python.org/2/howto/argparse.html#id1 from argparse import ArgumentParser p = ArgumentParser(usage='it is usage tip'

命令行下载工具wget

wget是一个简单而强大的跨平台命令行下载工具,包括Windows也有对应的版本.全称GNU Wget,属于GNU计划的一部分,自由软件.支持HTTP.HTTPS和FTP协议,可在后台运行. 命令格式 wget [options] [URL] 最常用操作 直接下载一个文件 wget [URL] 下载一个文件并以自定义文件名保存 wget -O [URL] filename 断点续传 wget -c [URL] wget使用参数很多,可直接将自身帮助信息输出到一个文档随时查阅学习,很多网络教程实际