Строковый ввод Java Shell в Windows

Линейный ввод Java Shell REPL в Windows ведет себя не так, как линейный ввод в большинстве других консольных приложений Windows:

  1. Комбинация клавиш Ctrl+Стрелка влево не переходит к началу предыдущей строки.
  2. Символ конца файла — Ctrl+D (как в Unix) вместо Ctrl+Z.
  3. Курсор исчезает при прокрутке с помощью клавиш горизонтальной стрелки.
  4. Во время набора есть небольшая задержка (около 0,1 с), пока не появится каждая набранная буква.

Это происходит как с Java 9, так и с Java 10. Напротив, Kotlin REPL не демонстрирует такого странного поведения. Как и методы Java BufferedReader.readLine() или Scanner.nextLine() при использовании System.in или System.console().readLine().

Мои вопросы:

  • Почему Java Shell использует такой тип ввода строки? (Я имею в виду, дает ли это какое-то особое преимущество, чтобы компенсировать сложность его использования?)

  • Есть ли конфигурация, позволяющая использовать обычный метод пользовательского ввода?

  • Какой метод Java API он использует для чтения пользовательского ввода (просто чтобы я мог не использовать его сам)?


person DodgyCodeException    schedule 22.05.2018    source источник
comment
Похоже, вы видите то же самое: «[JDK-8191640: [Windows] JShell неправильно переносит строки и искажает ввод в JDK9](bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8191640)" ошибка, о которой я сообщил около года назад.   -  person deduper    schedule 19.12.2018


Ответы (1)


Инструмент JShell использует JLine для редактирования строк. Таким образом, он ведет себя одинаково независимо от того, используется ли он в Windows, Mac или Linux. Например, сочетания клавиш ctrl-b и ctrl-f перемещают курсор вперед и назад.

Одним из преимуществ является то, что он дает вам настраиваемые нажатия клавиш (в основном завершение табуляции и некоторые другие вещи). Вы можете получить список этих нажатий клавиш, используя следующую команду:

/help shortcuts

Недостатки указаны в ОП. Я не думаю, что можно изменить REPL, чтобы использовать другой метод линейного ввода.

person Klitos Kyriacou    schedule 19.12.2018