Как делегировать обработку нажатия клавиш в 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 эффективно подключает программу spawned 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...
Другие вопросы по тегам