一个小巧但功能强大的跨平台命令行工具库Crossline

Crossline

Crossline是一个很小的跨平台命令行工具库,类似Linux上的readline。

项目地址:https://github.com/JunchuanWang80/Crossline

因为开发一个项目需要支持跨平台命令行,在Linux上readline是首选,bash/gdb/ftp都使用了这个库,但是Windows上没法直接用。后来搜到了一个开源项目linenoise,这个命令行工具库是Redis的作者开发的,Redis,Andriod和MongoDB都使用了。这个工具库很小,只有1100行左右代码(readline超过3万行代码,并且还依赖ncurses库),但是它只能在Linux上运行,支持的快捷键也很少,功能也少。后来搜到了linenoise-ng,这个项目是ArangoDB开源的,最初是从MongoDB版本的linenoise移植出来的。这个开源项目非常强大,支持Windows/Linux,支持很多快捷键和功能,并且支持Unicode。起初打算用这个库,后来发现这个库依然挺大的,代码大约有4,300行并且挺复杂的,还混合使用了C++和C,还有不少动态内存操作(linenoise也有)。我觉得一个跨平台命令行工具库可以实现的更简单,于是做了原型验证,然后使用了不同的方式实现了这个全新的很小但是功能很多的夸平台命令行工具库。

功能和特色

  • 支持Windows,Linux,vt100和xterm。
  • 支持79个快捷键37个功能
  • 支持大部分readline快捷键(Emacs标准绑定): 移动,修改,剪切粘贴,自动补齐,历史命令行,控制。
  • 支持部分Windows命令行快捷键,增加一些新的方便使用的快捷键。
  • 支持历史命令行浏览,显示,清空,保存到文件以及从文件加载。
  • 支持自动补齐,关键字及帮助显示和语法提示。
  • 支持强大的交互式历史命令行搜索,支持匹配多个包含和排除规则,匹配不区分大小写。
  • 在命令行搜素模式下支持除了自动补齐和历史命令行外的所有快捷键。
  • 支持自动分页功能,用于自动补齐显示,历史命令行显示和搜索显示,帮助信息显示,会根据窗口大小自动调整。
  • 支持方便的内置F1帮助功能,可以在编辑模式和命令行搜索模式下使用,可以随时使用不影响当前已输入命令行。
  • 支持方便的Ctrl-^键盘调试功能,可以看到按下的键产生的字符序列。
  • 支持Ctrl-C退出编辑,Linux下支持Ctrl-Z挂起并恢复编辑,这2个快捷键在编辑模式和命令行搜索模式下都适用。
  • 支持管道作为输入。
  • 纯C代码,没有第三方库依赖。
  • 没有动态内存操作: malloc/free/realloc/new/delete/strdup/etc。
  • 非常小,只有1000行左右代码,逻辑简单容易阅读。
  • 可以很容易的扩展支持新的快捷键和功能。
  • 以后会支持Unicode。

快捷键列表

其他命令

快捷键 功能
F1 显示快捷键帮助
Ctrl-^ 进入键盘调试模式

移动命令

快捷键 功能
Ctrl-B,Left 左移一个字符
Ctrl-F,Right 右移一个字符
Alt-B,ESC+Left,Ctrl-Left,Alt-Left 左移一个单词(Ctrl-Left,Alt-Left只支持Windows/Xterm)
Alt-F,ESC+Right,Ctrl-Right,Alt-Right 右移一个单词(Ctrl-Right,Alt-Right只支持Windows/Xterm)
Ctrl-A,Home 移到行首
Ctrl-E,End 移到行尾
Ctrl-L 清屏并显示当前行

编辑命令

快捷键 功能
Ctrl-H,Backspace 删除光标前字符
Ctrl-D,DEL 删除光标处字符
Alt-U, ESC+Up,Ctrl-Up,Alt-Up 将当前单词改成全大写(Ctrl-Up,Alt-Up只支持Windows/Xterm)
Alt-L,ESC+Down,Ctrl-Down,Alt-Down 将当前单词改成全小写(Ctrl-Down,Alt-Down只支持Windows/Xterm)
Alt-C 将当前单词改成首字母大写
Alt-\ 删除光标左右侧空格
Ctrl-T 交换光标处2个字符

剪切粘贴

快捷键 功能
Ctrl-K,ESC+End,Ctrl-End,Alt-End 从光标处剪切到行尾(Ctrl-End,Alt-End只支持Windows/Xterm)
Ctrl-U,ESC+Home,Ctrl-Home,Alt-Home 从光标处剪切到行首(Ctrl-Home,Alt-Home只支持Windows/Xterm)
Ctrl-X 剪切整行
Alt-Backspace,Esc+Backspace,Clt-Backspace 剪切光标前面的单词(Clt-Backspace only supports Windows/Xterm)
Alt-D,ESC+Del,Alt-Del,Ctrl-Del 剪切光标后面的单词(Alt-Del,Ctrl-Del只支持Windows/Xterm)
Ctrl-W 从光标处向左剪切到空格止
Ctrl-Y,Ctrl-V,Insert 粘贴剪切文本

自动补齐命令

快捷键 功能
TAB,Ctrl-I 自动补齐
Alt-=,Alt-? 列出补齐项

历史命令

快捷键 功能
Ctrl-P,Up 取上一个历史命令行
Ctrl-N,Down 取下一个历史命令行
Alt-<, PgUp 取第一个历史命令行
Alt->, PgDn 取最后一个历史命令行(当前输入)
Ctrl-R,Ctrl-S 进入命令行搜索模式
F4 用当前输入进入命令行搜索模式
F1 在命令行搜索模式下显示搜索匹配语法
F2 显示历史命令行
F3 清空历史命令行(需要确认)

控制命令

快捷键 功能
Enter, Ctrl-J,Ctrl-M 返回当前命令行
Ctrl-C,Ctrl-G 丢弃当前命令行并返回
Ctrl-D 如果当前命令行为空则返回
Alt-R 清空当前命令行
Ctrl-Z 挂起命令行(Linux适用,fg可以继续编辑)

历史命令行搜索功能

原始的readline支持增量搜索(Ctrl-R,Ctrl-S)和非增量搜索(Alt-N,Alt-P)。这2种方式都不方便,效率也不高,所以实现了全新的交互式命令行搜索功能。

匹配语法
使用空格分开多个匹配项,每个匹配项都不区分大小写(小技巧:可以使用Insert插入上次搜索关键字继续编辑)

  • select: 选择包含select的命令行
  • -select: 选择不包含select的命令行
  • "select from": 选择包含select from的命令行
  • -"select from": 选择不包含select from的命令行
  • "select from" where -"order by" -limit : 选择包含select from以及where,但不包含order by或者limit的命令行

例子

SQL> <F2> // show history
   1 hello world
   2 select from user
   3 from select table
   4 SELECT from student
   5 Select from teacher

SQL> <Ctrl+R>
Input Patterns <F1> help: select from
   1 select from user
   2 from select table
   3 SELECT from student
   4 Select from teacher
Input history id: 3
SQL> SELECT from student<Alt+R> // Revert line

SQL> <F4>
Input Patterns <F1> help: <Insert> // paste last history pattern: select from
Input Patterns <F1> help: "select from"
   1 select from user
   2 SELECT from student
   3 Select from teacher
Input history id: 3
SQL> Select from teacher<Alt+R>

SQL> SELECT from<F4> // search with pattern: Select from
Input Patterns <F1> help: SELECT from
Input Patterns <F1> help: "SELECT from" -user -teacher
   1 SELECT from student
Input history id: 1
SQL> SELECT from student

Crossline APIs

// Main API to read a line,return buf if get line,return NULL if EOF。
char* crossline_readline (char *buf,int size,const char *prompt);
// Set move/cut word delimiter,default is all not digital and alphabetic characters
void crossline_delimiter_set (const char *delim);

// History APIs
int crossline_history_save (const char *filename);
int crossline_history_load (const char *filename);
void crossline_history_show (void);
void crossline_history_clear (void);

/* Completion APIs */
// Register completion callback
void crossline_completion_register (crossline_completion_callback pCbFunc);
// Add completion in callback。 Word is must,help for word is optional。
void crossline_completion_add (crossline_completions_t *pCompletions,const char *word,const char *help);
// Set syntax hints in callback
void crossline_hints_set (crossline_completions_t *pCompletions,const char *hints);

简单例子

代码在example.c

static void completion_hook (char const *buf,crossline_completions_t *pCompletion)
{
    int i;
    static const char *cmd[] = {"insert","select","update","delete","create","drop","show","describe","help","exit","history",NULL};

    for (i = 0; NULL != cmd[i]; ++i) {
        if (0 == strncmp(buf,cmd[i],strlen(buf))) {
            crossline_completion_add (pCompletion,cmd[i],NULL);
        }
    }

}

int main ()
{
    char buf[256];

    crossline_completion_register (completion_hook);
    crossline_history_load ("history.txt");

    while (NULL != crossline_readline (buf,sizeof(buf),"Crossline> ")) {
        printf ("Read line: \"%s\"\n",buf);
    }    

    crossline_history_save ("history.txt");
    return 0;
}

SQL解析器例子

代码在example_sql.c,这个例子实现了一个简单的SQL语法分析器,可以解析如下语法,代码较多这里就不放了。

insert into <table> set column1=value1,column2=value2,...
select <* | column1,columnm2,...> from <table> [where] [order by] [limit] [offset]
update <table> set column1=value1,column2=value2 [where] [order by] [limit] [offset]
delete from <table> [where] [order by] [limit] [offset]
create [unique] index <name> on <table> (column1,column2,...)
drop {table | index} <name>
show {tables | databases}
describe <table>
help {insert | select | update | delete | create | drop | show | describe | help | exit | history}

可以用这个例子来测试上面的快捷键

SQL> <TAB> // show autocomplete words and help
insert     Insert a record to table
select     Select records from table
update     Update records in table
delete     Delete records from table
create     Create index on table
drop       Drop index or table
show       Show tables or databases
describe   Show table schema
help       Show help for topic
exit       Exit shell
history    Show history
 *** Press <Space> or <Enter> to continue . . .

SQL> help <TAB> // show autocomplete words list
insert select update delete create drop show
describe help exit history

SQL> create index <TAB> // show autocomplete hints
Please input: index name

编译与测试

Windows MSVC

cl -D_CRT_SECURE_NO_WARNINGS -W4 User32.Lib crossline.c example.c /Feexample.exe
cl -D_CRT_SECURE_NO_WARNINGS -W4 User32.Lib crossline.c example_sql.c /Feexample_sql.exe

Windows Clang

clang -D_CRT_SECURE_NO_WARNINGS -Wall -lUser32 crossline.c example.c -o example.exe
clang -D_CRT_SECURE_NO_WARNINGS -Wall -lUser32 crossline.c example_sql.c -o example_sql.exe

Linux Clang

clang -Wall crossline.c example.c -o example
clang -Wall crossline.c example_sql.c -o example_sql

GCC(Linux, MinGW, Cygwin, MSYS2)

gcc -Wall crossline.c example.c -o example
gcc -Wall crossline.c example_sql.c -o example_sql

其它

这里只列出了部分内容,详细信息请参考项目的README.md
项目地址:https://github.com/JunchuanWang80/Crossline

原文地址:https://www.cnblogs.com/jcwang/p/12071983.html

时间: 2024-11-09 07:24:33

一个小巧但功能强大的跨平台命令行工具库Crossline的相关文章

windows下强大的wmic命令行工具

windows最令网管诟病的地方就是命令行没有unix和linux强大.但这种情况正在不断改观,windows命令行也越来越强大了.其中,微软耗费大量精力打造的wmi就是一例. 获得进程ID与进程名称 代码: wmic process get processid,name 远程创建进程 代码: wmic /node:109.254.2.102 /user:"rdgad\administrator" /password:"梦想成真" process call crea

20个命令行工具监控 Linux 系统性能(转载)

1. top — Linux 系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具.Top 命令可以定期显示所有正在运行和实际运行并且更新到列表中,它显示出 CPU 的使用.内存的使用.交换内存.缓存大小.缓冲区大小.过程控制.用户和更多命令.它也会显示内存和 CPU 使用率过高的正在运行的进程.当我们对 Linux 系统需要去监控和采取正确的行动时,top 命令对于系统管理员是非常有用的.让我们

最常用的20个监控Linux系统性能的命令行工具

2015-12-27 iOS开发 对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行. 为此,我们编写了对于 Linux/Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具.这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因.这些监控命令足够你选择适合你的监控场景. 1.top — Linux 系统进程监控 top 命令是性能监控程序

20个命令行工具监控 Linux 系统性能【转载】

对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行.为此,我们编写了对于 Linux/Unix 系统管理员非常有用的并且最常用的20个命令行系统监视工具.这些命令可以在所有版本的 Linux 下使用去监控和查找系统性能的实际原因.这些监控命令足够你选择适合你的监控场景. 1. top -Linux系统进程监控 top 命令是性能监控程序,它可以在很多 Linux/Unix

cmdline —— 轻量级的C++命令行解析库

平时用C++写一些命令行工具,需要解析命令行的输入参数,这是一项繁琐并且容易出错的工作,我们不应该将主要精力放在这上面,可以考虑使用开源的库,下面的cmdline就是其中非常好用的一款. cmdline介绍 cmdline 是一个非常简单好用的C++命令行解析库,其基于模板,所以使用很简单,写出的代码也很优雅.由于其只包含一个头文件,所以很容易集成到自己的项目中. cmdline项目托管地址Github:https://github.com/tanakh/cmdline cmdline使用 下面

【C++】cmdline —— 轻量级的C++命令行解析库

平时用C++写一些命令行工具,须要解析命令行的输入參数,这是一项繁琐而且easy出错的工作,我们不应该将主要精力放在这上面.能够考虑使用开源的库.以下的cmdline就是当中很好用的一款. cmdline介绍 cmdline 是一个非常easy好用的C++命令行解析库,其基于模板.所以使用非常easy,写出的代码也非常优雅. 因为其仅仅包括一个头文件.所以非常easy集成到自己的项目中. cmdline项目托管地址Github:https://github.com/tanakh/cmdline

Scrapy命令行工具简介

Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 在最初使用Scrapy时,使用编辑器或IDE手动编写模块来创建爬虫(Spider)程序,然后使用scrapy crawl命令执行Spider. 这种方式很初级.繁琐,不适合更大型的项目. 很好的是,Scrapy提供了 命令行工具(Command line tool),通过这套工具,开发者可以轻松建立 Scrapy项目,而不仅仅是一个一个的Spider程序. 初见Scrapy命

Cmder命令行工具在Windows系统中的配置

一.Cmder简介 Cmder:一款用于Windows系统中,可增强传统cmd命令行工具的控制台模拟器(类似于Linux系统中的终端控制窗口) 特点: 无需安装,解压即用 可使用较多Linux命令,如:vi.vim.ls.pwd.grep.unzip.bash.perl.ssh 可在窗口内外自由使用常规的复制和粘贴操作 支持多Tab页的cmd窗口 提供了对命令窗口中的字符串进行快速搜索定位的功能 在传统cmd命令行工具的基础上,增加了Monokai配色方案,界面美观 命令窗口尺寸大小可自由调整

分享体积小巧,功能强大的网络嗅探和分析工具SnifferView 版本-1.0.0.25

SnifferView是一个体积小巧,功能强大的网络分析工具,能有效的帮助你查看和分析网络数据和排查网络问题,它的特点如下: 1.体积小巧,200k左右,只有一个文件,运行和数据分析速度很快. 2.支持类似著名抓包工具Wireshark的封包过滤语句,并进行了优化,更加易于使用,具体的规则可以参见过滤规则帮助文档. 3.支持传输层协议Tcp,Udp,Icmp协议,应用层Http协议的分析. 4.支持网络数据的导出和导入,比如可以将在客户那里捕获到的封包数据保存成文件带回来通过SnifferVie