当前位置:  开发笔记 > 数据库 > 正文

使用GNU readline处理多行输入有一种很好的方法吗?

如何解决《使用GNUreadline处理多行输入有一种很好的方法吗?》经验,为你挑选了1个好方法。

我的应用程序有一个命令行界面,我正在考虑使用GNU Readline库来提供历史记录,可编辑的命令行等.

问题是我的命令可能很长而且复杂(想想SQL),我想让用户在多行上传播命令,使它们在历史记录中更具可读性.

是否可以在readline中执行此操作(可能通过指定换行符和命令结尾之间的差异)?

或者我会更好地实现自己的命令行(但可能使用GNU历史库)?



1> Philip Reyno..:

你确定可以.

您可以使用定义'\ 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 
#include 
#include 
#include 

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);
}

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有