Как мне принять ввод стрелок влево / вправо / вверх / вниз в оболочке Linux? - PullRequest
6 голосов
/ 08 января 2011

Я написал Java-приложение, которое имеет некоторое время (input.readLine ()), которое продолжает читать ввод, пока пользователь не введет команду выхода. У меня есть скрипт .bat для запуска в Windows и .sh для запуска в Linux. Приложение отлично работает в обоих случаях.

Если в Windows вы наберете команду типа «проверить электронную почту» и нажмете клавишу ввода, она выполнит команду. Затем при следующем запросе (то есть при следующем чтении приложением Java строки ввода) вы можете нажать стрелку вверх, и она вызовет вашу команду «проверить электронную почту». Вы можете нажать клавишу со стрелкой влево, чтобы переместить курсор влево и т. Д. Это все, как я хочу.

Однако в Linux нажатие клавиши вверх приводит к появлению ^ [[D. Клавиши со стрелками влево и вправо производят похожий вывод ASCII, например ^ [[C.

Я слышал о stty и просматривал man-страницы, но не могу понять, что мне нужно изменить в скрипте .sh при запуске моего Java-приложения. Кто-нибудь может мне помочь?

Ответы [ 2 ]

4 голосов
/ 08 января 2011

Самое простое решение - использовать внешнюю оболочку, которая читает строку с возможностями редактирования, а затем отправляет ее в вашу программу. Хорошая обертка это rlwrap .

Использование отдельного инструмента согласуется с философией Unix об использовании отдельных инструментов для отдельных целей (линейное издание и все, что делает ваша программа). Это также просто: просто включите оболочку rlwrap myprogram вместо myprogram.

Базовая библиотека readline (никакого отношения к какому-либо методу readLine в Java не имеет; вам понадобится обертка Java, такая как Java-Readline ), больше работы для интеграции, и ограничивает вашу программу быть GPL. Делайте это только в том случае, если вы хотите большего, чем может предоставить оболочка, - прежде всего, для конкретных приложений.

1 голос
/ 08 января 2011

Функция readline используется для этой вещи в Unices, но это функция C.

Здесь вы можете найти Java-оболочку для него. (Я никогда не использовал его)

...