Linux - Bewegen des Konsolencursors visuell

Ich entwerfe derzeit eine CLI-Oberfläche für Linux und aus verschiedenen GründenIch kann ncurses nicht verwenden. Ich benutze ausschließlich C ++ und das Qt-Framework.

Um eine benutzerfreundliche Oberfläche zu haben, muss diese Getch-Schleife in einem separaten Thread ausgeführt werden:

https: //stackoverflow.com/a/912796/360568

Was im Grunde bedeutet, dass ich alle grundlegenden Funktionen (wie z. B. die Rücktaste) selbst implementieren muss. Ich habe bereits die Befehlsvervollständigung und den Befehlsverlauf implementiert (z. B. wenn Sie unter Linux die Tabulatortaste oder uparrow / downarrow drücken), kann aber nicht herausfinden, wie leftarrow / rightarrow implementiert werden soll (auch bekannt als Durchsuchen der Schreibspitze).

Normalerweise implementiere ich es so: Auf jedem gech, das nicht gleich -1 ist, überprüfe ich, ob der Benutzer eine spezielle Taste gedrückt hat (eine, die den Typeahead irgendwie modifiziert). Ich lösche dann die stdout mit der folgenden Funktion:

void inputobject::clear_line(int nletters)
{
    QTextStream(stdout) << "\033[2K";

    for(int i = 0; i < nletters;i++){
        QTextStream(stdout) << "\b";
    }

    rewind(stdout);
}

Und ersetzen Sie es durch etwas anderes, um den Druckkopf effektiv zu simulieren. Zum Beispiel würde ich im Fall der Rücktaste den Befehl call @ speicherclear_line, und drucken Sie den Befehl erneut mit einem Buchstaben weniger aus, und verhalten Sie sich dabei genauso wie bei einer normalen Konsolenanwendung.

Mein echtes Problem ist mit dem Cursor, im Fall von left / rightarrow muss ich den Cursor visuell bewegen, um angeben zu können, wo im Text der Benutzer sucht:

Aufgrund der Art, wie ich die angegebene Standardzeile umschreibe, um den Typeahead zu simulieren, spielt es keine Rolle, wo sich der Cursor WIRKLICH befindet, solange er in derselben Zeile bleibt - es kommt nur auf die visuelle Darstellung an. Wie kann ich den Cursor unter Linux visuell bewegen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage