jline tetap cepat di bagian bawah

Saya menggunakan jline dan saya memiliki ConsoleReader yang rapi dan semuanya berfungsi dengan baik. Namun, jika Anda mengetik sesuatu ke dalam prompt dan ada keluaran di stdout (dari thread lain), keluarannya akan membagi kata/perintah yang Anda ketikkan.

Bagaimana cara menyimpan prompt jline di bagian bawah terminal?

Saya menggunakan jline 1, tapi saya terbuka untuk menggunakan jline 2 jika cukup stabil.


person Alec Gorge    schedule 25.01.2012    source sumber
comment
Perpustakaan ini konon dirancang untuk menangani input konsol; Saya tidak mengerti bagaimana ia dapat menangani keluaran konsol. Masalahnya adalah peristiwa I/O konsol tidak sinkron (dalam kasus Anda). Mungkin, Anda perlu menyimpan keluaran konsol dalam buffer sementara saat melakukan masukan dan menampilkan keluaran dari buffer setelah masukan selesai.   -  person ee.    schedule 26.01.2012
comment
Mungkin Anda perlu mencari perpustakaan Kutukan untuk Java sourceforge.net/projects/javacurses, sourceforge.net/projects/enigma-shell, atau javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html yang memungkinkan Anda mengubah posisi kursor input/output konsol Anda   -  person ee.    schedule 26.01.2012


Jawaban (1)


Akhirnya menemukan jawabannya... inilah yang Anda lakukan. Pertama, tentukan fungsi-fungsi ini:

private ConsoleReader console = ...;
private CursorBuffer stashed;

private void stashLine() {
    this.stashed = this.console.getCursorBuffer().copy();
    try {
        this.console.getOutput().write("\u001b[1G\u001b[K");
        this.console.flush();
    } catch (IOException e) {
        // ignore
    }
}

private void unstashLine() {
    try {
        this.console.resetPromptLine(this.console.getPrompt(),
          this.stashed.toString(), this.stashed.cursor);
    } catch (IOException e) {
        // ignore
    }
}

Kemudian ketika Anda ingin mengeluarkan data baru, pertama-tama panggil stashLine() untuk menyimpan masukan konsol saat ini, lalu keluarkan baris keluaran baru apa pun, lalu panggil unstashLine() untuk memulihkannya.

person Archie    schedule 09.12.2014
comment
Anda tuan, pantas mendapatkan medali. - person Joa Ebert; 17.12.2014