2017-01-16 3 views
0

Я использую stty raw -echo в моей программе терминалов tcl. Я хочу сделать некоторые действия только для нескольких событий нажатия клавиш, таких как Вкладка. Для остальных ключевых пресс-мероприятий, которые я хочу делегировать rlwrap или другую программу обработки по умолчанию, такие как , чтобы переместить курсор к левой стороне и вставить текст в котором находится курсор, или Ctrl + C в прекратите выполнение программы. Есть ли способ сделать это?Как передать управление нажатием клавиши для обращения в терминале необработанного режима с tcl

+1

, вероятно, не так, как вы думаете, поскольку делегирование ответственности между программами делает терминальное соединение (и инициализацию) громоздким. –

ответ

0

Существует опция в stty, которая обрабатывает сигналы для вас, что является опцией isig. Кроме того, -opost обрабатывает «\ n» на «\ r \ n» для вас.

stty raw -echo isig 

Другой вариант заключается в использовании явного -icanon min 1 time 0 вместо raw опции.

0

Увы, терминальные системы обработки не работают таким образом, чтобы это было легко. Но это не невозможно. Простейший механизм, который я могу придумать (действительно, единственный, который не заставляет меня съеживаться при мысли), - это использовать некоторые из более продвинутых функций команды 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... 
+0

Спасибо. Но я не устанавливал Expect, и я хочу распространять программу. У меня не так много ожиданий. Есть ли способ в tcl поставить программу в фоновом режиме, когда вы получаете Ctrl + Z? – Herbert

0

Последнего GitHub version из rlwraphas a bindable readline commandrlwrap-direct-keypress, которые могут быть связаны (например, в ваш .inputrc) на любую клавишу вы хотите передать непосредственно к вашей программе, минуя rlwrap

Все остальные клавиши будут работать как обычно (например, перемещение курсора) при редактировании строки ввода с помощью readline

Смежные вопросы