Frage

Meine Anwendung verfügt über eine Befehlszeilenschnittstelle, und ich denke über die mit GNU Readline-Bibliothek Geschichte zur Verfügung zu stellen, um eine bearbeitbare Befehlszeile, etc.

Der Haken ist, dass meine Befehle ziemlich lang sein können und komplexe (man denke SQL), und ich möchte den Benutzern ermöglichen, Befehle über mehrere Zeilen verteilt sie besser lesbar in der Geschichte zu machen.

Ist es möglich, dies in Readline- zu tun (vielleicht durch einen Unterschied zwischen einem Newline und einem Ende des Befehls unter Angabe)?

Oder wäre ich besser dran, meine eigene Kommandozeile Implementierung (aber vielleicht mit dem GNU History Bibliothek )?

War es hilfreich?

Lösung

Sicher kann.

Sie können Optionen für die '\ r' definieren und '\ n' Werte mit

rl_bind_key('\r', return_func);

Ihre return_func können nun entscheiden, was mit diesen Tasten zu tun.

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

Wenn Sie tun dies in einem UNIX-Terminal, müssen Sie über ANSI-Terminal-Codes lernen, wenn Sie den Cursor bewegen möchten. Es gibt ein Referenz auf wikipedia starten.

Hier ist ein Beispielcode, die Readline- nutzt Multi-line zu lesen und wird die Bearbeitung beendet, wenn Sie in einem Semikolon eingeben (ich habe festgelegt, dass als EOQ oder End-oder-Abfrage). Readline- ist extrem leistungsfähig, es gibt viele Sachen zu erlernen.

#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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top