Pregunta

Mi aplicación tiene una interfaz de línea de comandos, y estoy pensando en usar Biblioteca GNU Readline para proporcionar un historial, una línea de comando editable, etc.

El problema es que mis comandos pueden ser bastante largos y complejos (creo que SQL) y me gustaría permitir que los usuarios distribuyan los comandos en varias líneas para hacerlos más legibles en la historia.

¿Es posible hacer esto en readline (tal vez especificando una diferencia entre una nueva línea y un final del comando)?

O estaría mejor implementando mi propia línea de comandos (pero tal vez use GNU History library )?

¿Fue útil?

Solución

Seguro que puedes.

Puede definir opciones para los valores '\ r' y '\ n' con

rl_bind_key('\r', return_func);

Su return_func ahora puede decidir qué hacer con esas teclas.

int return_func(int cnt, int key) { ... }

Si está haciendo esto dentro de un terminal UNIX, tendrá que aprender sobre los códigos de los terminales ANSI si desea mover el cursor. Hay una referencia de inicio en wikipedia.

Aquí hay un código de ejemplo que usa readline para leer multilínea y que dejará de editar cuando ingrese un punto y coma (lo he establecido como EOQ o end-or-query). Readline es extremadamente poderoso, hay muchas cosas que aprender.

#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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top