18

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

问题是我的命令可能很长而且很复杂(想想 SQL),我希望允许用户将命令分布在多行上,以使它们在历史记录中更具可读性。

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

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

4

1 回答 1

18

你当然可以。

您可以使用 '\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);
}
于 2008-10-02T09:56:11.713 回答