2012-09-04 17 views
6

Używając JLine (lub JLine2), możliwe jest wywołanie readline na ConsoleReader i oprócz standardowej zachęty bufor zostanie wstępnie wypełniony wybranym przeze mnie ciągiem znaków ?Wypełnij linijkę za pomocą jline

Próbowałem robić, np .:

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

Wydaje się to rzeczywiście pisać do bufora, ale linia wyświetla tylko wiersz. Jeśli naciśnie klawisz Enter, readLine zwróci "Default", jak można się spodziewać. Jeśli wyczyścisz ekran, bufor zostanie przerysowany i wyświetlony poprawnie.

Moje zrozumienie polega na tym, że powinienem jakoś zadzwonić pod numer reader.redrawLine() zaraz po połączeniu z numerem readLine. Ten ostatni jednak blokuje, co sprawia, że ​​jest trudny (nie jest niemożliwy, ale na pewno nie można użyć do tego drugiego wątku).

Odpowiedz

0

Myślę, że chcesz albo resetPromptLine lub putStream, jeśli już masz zestaw podpowiedzi.

Aby nie porwać twojego pytania, ale nie mogę wymyślić, jak po prostu wydrukować linię zastępującą znak zachęty (ostentacyjnie lub wizualnie popychając znak zachęty w dół, wyświetlając nad nim wiadomość).

1

Wpadłem dziś dokładnie na ten przypadek użycia.

Jest to bit hack, ale udało mi się wczytywać tekst do bufora JLine i pozwól edytować użytkownika w ten sposób:

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

Tak, drukowanie \r jest hack, ale wydaje się, że to działa.

Używam JLine-2.13.

1

Udało mi się to zrobić za pomocą wątku (tak, to źle się dzieje, ale nie znalazłem innej drogi).

Inspirację czerpałem z kodu znalezionego pod numerem in JLine itself, który również wykorzystuje wątek do podobnych celów.

W 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()