Domanda

La mia applicazione ha un'interfaccia a riga di comando e sto pensando di utilizzare Libreria GNU Readline per fornire cronologia, una riga di comando modificabile, ecc.

Il problema è che i miei comandi possono essere piuttosto lunghi e complessi (pensate a SQL) e vorrei consentire agli utenti di distribuire comandi su più righe per renderli più leggibili nella cronologia.

È possibile farlo in readline (forse specificando una differenza tra una nuova riga e una fine del comando)?

O sarebbe meglio implementare la mia riga di comando (ma forse usando Libreria GNU History )?

È stato utile?

Soluzione

Sicuro.

Puoi definire le opzioni per i valori '\ r' e '\ n' con

rl_bind_key('\r', return_func);

Il tuo return_func ora può decidere cosa fare con quelle chiavi.

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

Se lo fai all'interno di un terminale UNIX, dovrai conoscere i codici del terminale ANSI se vuoi spostare il cursore. C'è un riferimento iniziale su wikipedia.

Ecco un codice di esempio che utilizza readline per leggere multilinea e interromperà la modifica quando si inserisce un punto e virgola (l'ho impostato come EOQ o end-or-query). Readline è estremamente potente, ci sono molte cose da imparare.

#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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top