首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当jline2在telnet控制台上打印"\n“时打印"^J”

当jline2在telnet控制台上打印"\n“时打印"^J”
EN

Stack Overflow用户
提问于 2015-12-25 23:46:36
回答 1查看 542关注 0票数 8

我使用JLine 2 (v2.13)与Socket一起为我的应用程序创建一个管理控制台,它可以通过普通的telnet客户端访问。然而,我发现它打印出奇怪的符号时,它应该打印一个断线:

代码语言:javascript
复制
act.app.restart  restart app^Jact.job.list  List jobs

正确的输出应该是:

代码语言:javascript
复制
act.app.restart  restart app
act.job.list     List jobs

我在代码中进行了跟踪,发现了引起问题的以下代码行:

另一件奇怪的事情是,当我按向上箭头获取历史记录时,控制台会打印出^[[A,其他任何事情都不会发生。

有人知道吗?

更新:添加了相关源代码

  1. 接受传入telnet连接的代码:

  1. 创建ConsoleReader并分发命令的代码:

更新2

抱歉我消失了一段时间。只要回来,我的项目让我呼吸新鲜空气。下面是所发生的事情:我创建了一个PrintWriter,并将它用作解决^J问题的方法:

但是,当jline2与telnet会话一起使用时,还有许多其他问题:

  1. 键入<TAB>将显示选项卡,而不是激活完整列表。然而,在我点击enter键后,它会给出一个完整的列表和一个错误消息:

  1. 键入<UP>箭头,显示^[[A,按enter键,它将执行我的最后一个命令。但是,我失去了命令行编辑功能。

问题仍然存在,我认为应该有办法解决它,只是需要一些指导.

EN

回答 1

Stack Overflow用户

发布于 2016-01-03 11:01:02

编辑:我的错,我展示的方法是私有的。尽管如此,这并不是一个bug,而是代码在做它应该做的事情。使用rawPrint的两个公共方法(我将它们放在末尾)只将其用于屏蔽输出和显然用于打印完成,因此ConsoleReader可能不支持您的用例-it可能是一个设计错误,但我认为应该是这样。在传递为终端配置问题时,文档中会提到箭头键问题。

ConsoleReader.java在这里:https://github.com/jline/jline2/blob/master/src/main/java/jline/console/ConsoleReader.java

我想这是最后一个版本,等等。

您要做的是创建一个调用println()的ConsoleReader。LF显示为^J,从某种意义上说,这不是一个bug,因为该方法正在执行它应该做的事情:

代码语言:javascript
复制
/*3478*/ public void println(final CharSequence s) throws IOException {
    print(s);
    println();
}

这最终呼唤

代码语言:javascript
复制
/*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

这个函数可以做您想做的事情,但是是私有的:

代码语言:javascript
复制
/*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( CharSequence str)和第3715行的printColumns(最终集合项)调用。putString只在使用屏蔽输出时才调用它,因此对您来说它是无用的,而且printColumns似乎是用于完成的。

也许你应该单独打印行,让ConsoleReader给它们添加新行?从技术上讲,LF是一种控制代码,禁止ConsoleReader按原样打印控制代码是有意义的。把你的输入分成几行,一个一个地打印出来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34467383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档