Я пишу небольшую оболочку в Rust для Linux в качестве упражнения, и я хотел реализовать историю команд, а также перемещение курсора (т.е. перемещение курсора назад для редактирования опечатки в команде).
Я не нашел способа в стандартной библиотеке Rust обрабатывать события клавиш со стрелками, но нашел ящик Termion , который обрабатывает ключевые события.
Однако обработка ключевых событий с помощью Termion означает ввод «необработанного режима» для stdout, который переопределяет «устаревшие» функции, как описано в этой статье о ящике :
Без режима raw вы не можете написать правильное интерактивное приложение TTY. Режим Raw дает вам полный контроль над TTY:
- Он отключает буферизацию строки: как вы могли заметить, ваше приложение командной строки имеет тенденцию вести себя как командная строка. Программы сначала получат ввод, когда пользователь наберет \ n. Режим Raw позволяет программе получать ввод после каждого нажатия клавиши.
- Отключает отображение ввода: без режима ввода текст, который вы вводите, появляется на экране, что делает его недостаточным для большинства интерактивных приложений TTY, где клавиши могут представлять элементы управления, а не текстовый ввод.
- Отключает канонизацию выходных данных: например, \ n означает «перейти на одну ячейку вниз», а не «разбить строку», для разрывов строки необходимо \ n \ r.
- Отключает прокрутку.
Я нахожу это решение немного излишним, так как хочу сохранить большинство «устаревших» функций ввода / вывода. Есть ли другой способ обработки ввода с помощью клавиш со стрелками, или мне нужно будет использовать режим raw?