Проблемы со скан-кодом на клавиатуре Linux: например, СТРЕЛКА ВВЕРХ дает ^ [[A

Некоторое время мы пытались понять поведение скан-кода клавиатуры в Linux.

Когда мы открываем обычную оболочку bash, клавиши со стрелками работают как положено: UP показывает предыдущий элемент в истории и т. д. Однако, когда вы запускаете процесс, стрелки больше не работают, как ожидалось. Например, UP печать ^ [[A вместо предыдущей команды.

Чтобы продемонстрировать это, сделайте что-то вроде:

bash $ ping www.google.com

Теперь нажмите UP или же ВНИЗ и т.д., и вы увидите неправильно назначенные коды клавиш во время выполнения процесса. Однако, когда вы завершите процесс, клавиши со стрелками снова будут работать.

Мы протестировали его на CentOs, Ubuntu, Mac и даже в разных оболочках (bash, sh, zsh), и везде это происходит одинаково. Я также пробовал разные режимы клавиатуры, используя kbd_mode где мы тестировали с режимами RAW и XLATE.

Самое близкое, что я мог видеть при поиске ответов, было то, что пользователи IPython испытывали то же самое поведение, когда IPython не был построен против readline. Однако это не связано с нашим делом, насколько я могу судить.

Мы разрабатываем консольное приложение на основе C ++ Tcl, которое использует cin и cout для связи и получения информации от пользователя. У нас возникают проблемы с клавишами со стрелками, когда мы пытаемся получить доступ к истории ранее введенных команд. Это серьезная проблема для нас, так как 99% людей ожидают, что символы стрелок просто сработают.

Любые идеи о том, как мы могли бы преодолеть это, будут высоко оценены.

5

Решение

Вы должны установить терминал в сырой режим, чтобы получить коды сканирования и обработать их (то есть: отключите ICANON, вам нужен неканонический режим). Вы, вероятно, также хотите отключить ECHO (чтобы он не печатал ваш ввод на терминале).

Что это Readline или же linenoise делают. Увидеть Вот для некоторого кода. Особенно увидеть функцию linenoiseEnableRawMode, Другой простой пример кода Python Вот где я написал простой консольный медиаплеер, который проверяет нажатия клавиш слева («\ x1b [D») и справа («\ x1b [C»).

Соответствующие звонки должны tcgetattr (чтобы получить текущее состояние терминала и изменить эту структуру состояний, чтобы перейти в сырой режим и включить некоторые другие полезные вещи поведения) и tcsetattr (установить состояние).

readline, libedit или linenoise — это некоторые библиотеки, которые делают все, что работает для вас, и предоставляют вам историю, автозаполнение и т. д.

В конце вы должны восстановить прежнее состояние, иначе вы получите поведение, которое вы описываете в своей оболочке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]