2012-09-04 6 views
6

Mit JLine (oder JLine2), ist es möglich, einen Anruf an readline auf einem ConsoleReader und haben, zusätzlich zu der Standard-Eingabeaufforderung, den Puffer mit einer Zeichenfolge meiner Wahl ausgefüllt werden ?Prefill eine Zeile mit jline

ich versucht habe zu tun, z.B .:

reader.getCursorBuffer().write("Default"); 
reader.readLine("Prompt> "); 

Dies scheint in der Tat in den Puffer zu schreiben, aber die Zeile zeigt nur die Eingabeaufforderung. Wenn ich Enter drücke, gibt readLine"Default" zurück, wie ich erwarten würde. Wenn ich den Bildschirm lösche, wird der Puffer neu gezeichnet und korrekt angezeigt.

Mein Verständnis ist, dass ich gleich reader.redrawLine() direkt nach dem Anruf an readLine anrufen sollte. Dieser letzte blockiert jedoch, was es schwierig macht (nicht unmöglich, aber es fühlt sich definitiv falsch an, einen zweiten Thread dafür zu verwenden).

Antwort

0

Ich denke, Sie wollen entweder resetPromptLine oder putStream, wenn Sie bereits die Eingabeaufforderung haben.

Um Ihre Frage nicht zu überlisten, aber ich kann nicht herausfinden, wie man einfach eine Zeile druckt, die die Eingabeaufforderung ersetzt (scheinbar oder visuell drückt die Eingabeaufforderung mit einer Nachricht darüber).

1

Ich lief heute genau in diesem Anwendungsfall.

Es ist ein bisschen wie ein Hack, aber ich war in der Lage Text in den jline Puffer vorzuladen und dann den Benutzer bearbeiten lassen Sie es, indem Sie diese:

String preloadReadLine(ConsoleReader reader, String prompt, String preload) 
    throws IOException 
{ 
    reader.resetPromptLine(prompt, preload, 0); 
    reader.print("\r"); 
    return reader.readLine(prompt); 
} 

Ja, das Drucken von \r ein Hack ist, aber es scheint zu funktionieren.

Ich benutze JLine-2.13.

1

Ich schaffte das mit einem Thread (ja, es fühlt sich falsch an, aber ich habe keinen anderen Weg gefunden).

Ich nahm die Inspiration von Code gefunden in JLine itself, die auch einen Thread für ähnliche Zwecke verwendet.

In Scala:

 val thr = new Thread() { 
     override def run() = { 
      reader.putString("Default") 
      reader.flush() 
      // Another way is: 
      // reader.getCursorBuffer.write("Default") // writes into the buffer without displaying 
      // out.print("D*f*ult") // here you can choose to display something different 
      // reader.flush() 
     } 
     } 
     thr.setPriority(Thread.MAX_PRIORITY) 
     thr.setDaemon(true) 
     thr.start() 
Verwandte Themen