2012-01-25 45 views
2

我使用jline,我有一個整潔的ConsoleReader,一切都很好。但是,如果您在提示中輸入了某些內容並在stdout上輸出(來自另一個線程),則輸出會拆分您輸入的單詞/命令。jline保持提示在底部

如何在終端底部保持jline提示?

我正在使用jline 1,但如果足夠穩定,我願意使用jline 2。

+0

該庫據稱設計用於處理控制檯輸入;我看不出它是如何處理控制檯輸出的。問題是控制檯I/O事件是異步的(在你的情況下)。也許,您需要在執行輸入時將控制檯輸出存儲在臨時緩衝區中,並在輸入完成後顯示來自緩衝區的輸出。 –

+0

也許您需要查找Java的Curses庫http://sourceforge.net/projects/javacurses/,http://sourceforge.net/projects/enigma-shell/或http://www.javaworld.com/ javaworld/javaqa/2002-12/02-qa-1220-console.html它允許您重新定位您的控制檯輸入/輸出光標 –

回答

5

終於明白了這一點...這就是你所做的。當你想輸出新的數據然後

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 
    } 
} 

,首先調用stashLine()保存當前控制檯輸入,然後再輸出的輸出任何新的線路,然後調用unstashLine()恢復它:首先,定義這些功能。

+1

您的主席,值得一枚獎章。 –