Java多行控制台输入和光标处理

时间:2016-02-15 15:56:42

标签: java terminal console console-input

在为编程语言构建REPL控制台应用程序时出现以下问题。从本质上讲,语言依赖于您能够编写多行文本。但是,ENTER键也可用于评估表达式。

> 1 + 1<enter>
int int1 = 2
> <cursor>

为了允许多行输入,我使用的算法计算括号,括号,括号和引号的数量,因此如果它们中的任何一个是不平衡的,它会插入换行符:

> if (int1 < 3) {<enter>
|     println "ok"<enter>
|     }<enter>
ok
> <cursor>

这种方法的主要问题是,只要我在一行上按Enter键,就不能再编辑该行了。在BACKSPACE符号处反复按}将首先将其删除,然后停留在该位置,而不删除换行符并允许我删除println行。这使得程序非常容易出错并且编辑非常繁琐。

另一个问题是我甚至无法在某些控制台(如Mac终端)中使用光标。控制台将在该事件中显示ANSI控制代码。

有没有办法解决这两个问题,可能是通过向我的REPL前端引入自定义游标处理? JVM带给我多少访问封闭控制台?我可以强制控制台将所有按键重定向到程序吗?而且,我是否必须针对不同的IDE控制台/终端/操作系统使用不同的技术?

1 个答案:

答案 0 :(得分:0)

问题不在于JVM&#34;,而是JavaRepl的简单代码。控制台输入(参见source)只是从标准输入读取

private static Mapper<Sequence<String>, String> readFromConsole() {
    return new Mapper<Sequence<String>, String>() {
        private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        public String call(Sequence<String> lines) throws Exception {
            return reader.readLine();
        }
    };
}

BufferedReader真的没有做太多。它的文档也没有帮助。关于TutorialsPoint的说明有帮助;

  

java.io.BufferedReader.readline()方法读取一行文本。一条线被认为是换行(&#39; \ n&#39;),回车(&#39; \ r&#39;)或回车后紧接着换行符中的任何一条终止

要根据需要改进JavaRepl,必须将其修改为(至少)允许处理由左箭头和键盘删除发送的转义序列 - 与#34;退格&#34; (实际上删除)。它是可行的(但可能不是JavaRepl的开发人员想要的:与旧版本的Java的兼容性可能是一个考虑因素)。即使是&#34;更新的&#34;记录了来自Java6的Console类,但没有暗示它只是对BufferedReader进行适度的重写以帮助提供密码提示。

有关读取转义序列的信息,请参阅

要进行多行编辑,需要另一个步骤来更改其界面以允许检索前一行并编辑它们。我认为这超出了JavaRepl设计的范围(但你可能会向开发人员提出建议)。