Je tu hezký způsob, jak zvládnout vstup víceřádkovou GNU readline?

hlasů
17

Moje aplikace má rozhraní příkazové řádky, a já jsem přemýšlel o použití knihovny GNU Readline poskytnout historii, upravitelnou příkazovou řádku, atd.

Závěs je, že moje příkazy, může být docela dlouhý a složitý (myslím SQL) a rád bych, aby uživatelům rozšířit příkazy přes více řádků, aby byly lépe čitelné v historii.

Je možné to udělat v readline (možná určením rozdílu mezi řádkem a koncem příkazu)?

Jinak bych se lépe, kterým se provádí své vlastní příkazového řádku (ale možná s použitím knihovny GNU historie )?

Položena 02/10/2008 v 10:25
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
16

Jsi si jistý, plechovka.

Můžete definovat volby pro ‚\ r‘ a ‚\ n‘ hodnot s

rl_bind_key('\r', return_func);

Váš return_func nyní může rozhodnout, co dělat s těmito tlačítky.

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

Pokud děláte to uvnitř terminálu UNIX, budete muset naučit o koncových kódů ANSI Chcete-li přesunout kurzor kolem. Je tu začíná odkaz na wikipedii.

Zde je několik ukázkový kód, který používá Readline číst multi-linku a ukončí editaci, když zadáte do středníkem (Nastavil jsem, že jako EOQ nebo zvláštního nebo-dotaz). Readline je velmi silný, je tu spousta věcí se učit.

#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);
}
Odpovězeno 02/10/2008 v 10:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more