有没有一种使用GNU readline处理多行输入的好方法?
时间:2020-03-06 15:01:01 来源:igfitidea点击:
我的应用程序具有命令行界面,我正在考虑使用GNU Readline库来提供历史记录,可编辑的命令行等。
问题是我的命令可能会很长很复杂(请考虑使用SQL),我想允许用户将命令分布在多行上,以使它们在历史记录中更具可读性。
是否可以在readline中执行此操作(可能通过指定换行符和命令结尾之间的区别)?
还是我会更好地实现自己的命令行(但也许使用GNU History库)?
解决方案
你当然可以。
我们可以使用以下命令定义" \ 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); }