我的应用程序有一个命令行界面,我正在考虑使用GNU Readline 库来提供历史记录、可编辑的命令行等。
问题是我的命令可能很长而且很复杂(想想 SQL),我希望允许用户将命令分布在多行上,以使它们在历史记录中更具可读性。
是否可以在 readline 中执行此操作(可能通过指定换行符和命令结尾之间的差异)?
或者我会更好地实现自己的命令行(但也许使用GNU 历史库)?
我的应用程序有一个命令行界面,我正在考虑使用GNU Readline 库来提供历史记录、可编辑的命令行等。
问题是我的命令可能很长而且很复杂(想想 SQL),我希望允许用户将命令分布在多行上,以使它们在历史记录中更具可读性。
是否可以在 readline 中执行此操作(可能通过指定换行符和命令结尾之间的差异)?
或者我会更好地实现自己的命令行(但也许使用GNU 历史库)?
你当然可以。
您可以使用 '\r' 和 '\n' 值定义选项
rl_bind_key('\r', return_func);
您的 return_func 现在可以决定如何处理这些键。
int return_func(int cnt, int key) { ... }
如果您在 UNIX 终端中执行此操作,如果您想移动光标,则需要了解 ANSI 终端代码。维基百科上有一个起始参考。
这是一些使用 readline 读取多行的示例代码,当您输入分号时将停止编辑(我已将其设置为 EOQ 或 end-or-query)。Readline 非常强大,有很多东西要学。
#include <stdio.h>
#include <unistd.h>
#include <readline/readline.h>
#include <readline/history.h>
int my_startup(void);
int my_bind_cr(int, int);
int my_bind_eoq(int, int);
char *my_readline(void);
int my_eoq;
int
main(int argc, char *argv[])
{
if (isatty(STDIN_FILENO)) {
rl_readline_name = "my";
rl_startup_hook = my_startup;
my_readline();
}
}
int
my_startup(void)
{
my_eoq = 0;
rl_bind_key('\n', my_bind_cr);
rl_bind_key('\r', my_bind_cr);
rl_bind_key(';', my_bind_eoq);
}
int
my_bind_cr(int count, int key) {
if (my_eoq == 1) {
rl_done = 1;
}
printf("\n");
}
int
my_bind_eoq(int count, int key) {
my_eoq = 1;
printf(";");
}
char *
my_readline(void)
{
char *line;
if ((line = readline("")) == NULL) {
return NULL;
}
printf("LINE : %s\n", line);
}