【问题标题】:Java Multi-Line Console Input and Cursor HandlingJava 多行控制台输入和光标处理
【发布时间】:2016-05-26 14:50:52
【问题描述】:

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

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

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

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

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

另一个问题是我什至不能在某些控制台(如 Mac 终端)中使用光标。控制台只会在该事件中显示 ANSI 控制代码。


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

【问题讨论】:

    标签: java terminal console console-input


    【解决方案1】:

    问题不在于“JVM”,而在于 JavaRepl 的简单代码。控制台输入(见source)只是从标准输入读取lines

    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() 方法读取一行文本。行被视为由换行符 ('\n')、回车符 ('\r') 或回车符后紧跟换行符中的任何一种来终止。

    要按照您的意愿改进 JavaRepl,必须将其修改为(至少)允许将左箭头和键盘删除发送的转义序列视为“退格”(实际上是删除)。这是可行的(但可能不是 JavaRepl 的开发人员想要的:与旧版本的 Java 的兼容性可能是一个考虑因素)。即使是来自 Java6 的“较新”的 Console 类也被记录在案,但并未暗示它不仅仅是对 BufferedReader 的适度改造以帮助密码提示。

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多