编辑: 我的错,我展示的方法是私有的。尽管如此,这不是一个错误——它是代码在做它应该做的事情。使用 rawPrint 的两个公共方法(我把它们放在最后)仅将它用于屏蔽输出,显然用于打印完成,因此 ConsoleReader 可能不支持您的用例 - 这可能是一个设计错误,但我认为它的意思成为那样。文档中提到了箭头键问题作为终端配置问题。
ConsoleReader.java 在这里:https ://github.com/jline/jline2/blob/master/src/main/java/jline/console/ConsoleReader.java
我认为这是最后一个版本,等等。
您正在做的是创建一个 ConsoleReader 调用 println() 。LF 显示为 ^J。这不是一个错误,因为该方法正在做它应该做的事情:
/*3478*/ public void println(final CharSequence s) throws IOException {
print(s);
println();
}
最终调用
/*3445*/private int print(final CharSequence buff, int start, int end, int cursorPos) throws IOException {
checkNotNull(buff);
for (int i = start; i < end; i++) {
char c = buff.charAt(i);
if (c == '\t') {
int nb = nextTabStop(cursorPos);
cursorPos += nb;
while (nb-- > 0) {
out.write(' ');
}
} else if (c < 32) {
out.write('^');
out.write((char) (c + '@')); //LF -> ^J
这个函数做你想做的,但是是私有的:
/*3510*/ private void rawPrintln(final String s) throws IOException {
rawPrint(s); //
println();
}
/*3499*/ final void rawPrint(final String str) throws IOException {
out.write(str);
cursorOk = false;
}
可以通过第 895 行的公共方法 putString(final CharSequence str) 和第 3715 行的 printColumns(final Collection items) 调用它。 putString 仅在使用掩码输出时调用它,因此对您无用,而 printColumns 似乎用于完成.
也许您应该单独打印行并让 ConsoleReader 向它们添加换行符?从技术上讲,LF 是一个控制代码,禁止 ConsoleReader 按原样打印控制代码是有意义的。只需将您的输入分成几行,一一打印。