Ответ зависит от того, насколько низкоуровневым вы хотите быть.использование readline
или editline
- ответы высокого уровня.Следующим уровнем вниз будет использование libncurses
и вызов getch()
для чтения ввода с клавиатуры, а затем обработка истории / поиска самостоятельно.
Самый низкий уровень (для терминала) обрабатывает фактический поток ввода байтов,Клавиши со стрелками отправляют определенные последовательности символов в зависимости от вашего конкретного терминала.Например, эмулятор vt100 отправит ^ [[A для «стрелки вверх», ^ [[B для «стрелки вниз» и так далее).Чтобы прочитать их, вам нужно установить атрибуты терминала так, чтобы они немедленно возвращали ввод и не ожидали новой строки;Для этого используйте функции termios
для отключения режима канонического ввода.Затем просто прочитайте ввод символа за раз, и посмотрите, получите ли вы символы (27, 91, 65), и вы знаете, что это стрелка вверх и отвечаете соответственно.
Этот низкий уровень утомителен и хрупок и не будет работать, если вы используете другой эмулятор терминала (хотя вы можете использовать terminfo
, чтобы получить соответствующие входные последовательности для других терминалов.)
Если вы находитесь на более низком уровне, чем терминал (последовательная линия, окно X, отображение растрового изображения и т. Д.), Ответы снова меняются.