Я использую stty raw -echo
в моей программе терминалов tcl. Я хочу сделать некоторые действия только для нескольких событий нажатия клавиш, таких как Вкладка. Для остальных ключевых пресс-мероприятий, которые я хочу делегировать rlwrap или другую программу обработки по умолчанию, такие как ←, чтобы переместить курсор к левой стороне и вставить текст в котором находится курсор, или Ctrl + C в прекратите выполнение программы. Есть ли способ сделать это?Как передать управление нажатием клавиши для обращения в терминале необработанного режима с tcl
ответ
Существует опция в stty, которая обрабатывает сигналы для вас, что является опцией isig
. Кроме того, -opost
обрабатывает «\ n» на «\ r \ n» для вас.
stty raw -echo isig
Другой вариант заключается в использовании явного -icanon min 1 time 0
вместо raw
опции.
Увы, терминальные системы обработки не работают таким образом, чтобы это было легко. Но это не невозможно. Простейший механизм, который я могу придумать (действительно, единственный, который не заставляет меня съеживаться при мысли), - это использовать некоторые из более продвинутых функций команды interact
расширения Expect.
В частности, 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...
Спасибо. Но я не устанавливал Expect, и я хочу распространять программу. У меня не так много ожиданий. Есть ли способ в tcl поставить программу в фоновом режиме, когда вы получаете Ctrl + Z? – Herbert
Последнего GitHub version из rlwrap
has a bindable readline commandrlwrap-direct-keypress
, которые могут быть связаны (например, в ваш .inputrc
) на любую клавишу вы хотите передать непосредственно к вашей программе, минуя rlwrap
Все остальные клавиши будут работать как обычно (например, перемещение курсора) при редактировании строки ввода с помощью readline
, вероятно, не так, как вы думаете, поскольку делегирование ответственности между программами делает терминальное соединение (и инициализацию) громоздким. –