Как делегировать обработку нажатия клавиш в rlwrap в терминале raw mode с помощью tcl
Я использую stty raw -echo
в моей программе терминала tcl. Я хочу выполнить некоторые действия только для нескольких событий нажатия клавиш, таких как Tab. Для остальных событий нажатия клавиш я хочу передать их в rlwrap или другую программу обработки по умолчанию, такую как ←, чтобы переместить курсор в левую часть и вставить текст в том месте, где находится курсор, или Ctrl+C, чтобы завершить программу. Есть ли способ сделать это?
3 ответа
В stty есть опция, которая обрабатывает сигналы для вас, которая является isig
вариант. Также, -opost
обработайте "\n" для "\r\n" для вас.
stty raw -echo isig
Другой выбор заключается в использовании явного -icanon min 1 time 0
вместо raw
вариант.
Последняя версия GitHub rlwrap
имеет привязываемую команду readline rlwrap-direct-keypress
это может быть связано (например, в вашем .inputrc
) на любую клавишу, которую вы хотите передать непосредственно в вашу программу, минуя rlwrap
Все остальные клавиши будут работать как обычно (например, перемещение курсора) при редактировании строки ввода с помощью readline
Увы, системы обработки терминалов не работают так легко. Но это не невозможно. Самый простой механизм, который я могу придумать (действительно, единственный, который не заставляет меня задуматься) - это использовать некоторые из более продвинутых функций расширения Expect. interact
команда.
Особенно, interact
эффективно подключает программу spawn
ed by Expect для внешнего мира, но вы также можете добавить шаблоны для расширенного поведения.
package require Expect
spawn /your/program yourarguments...
interact {
"\t" {
# Do something special here as we've got a Tab
send "special special special\r"
}
}
Вы можете использовать rlwrap для порожденного процесса:
spawn rlwrap /your/program yourarguments...