2017-01-16 28 views
0

我在我的tcl终端程序中使用stty raw -echo。 我想要做的只是一些关键的新闻事件,如标签一些行动。因为我想委托给rlwrap或其他默认处理程序的按键事件的其余部分,如将光标移动到左侧,并在光标插入文本,或按Ctrl + Ç到终止程序。有没有办法做到这一点?如何使用tcl将原始模式终端中的按键处理委托给rlwrap

+1

可能不是您想的方式,因为跨程序委派责任使终端连接(和初始化)变得繁琐。 –

回答

0

stty中有一个处理信号的选项,即isig选项。 另外,-opost将“\ n”处理为“\ r \ n”。

stty raw -echo isig 

另一种选择是使用显式的,而不是-icanon min 1 time 0选项raw

0

唉,终端处理系统不能以简单的方式工作。 但这并非不可能。我能想到的最简单的机制(的确是唯一一个不会让我对此感到畏缩的机制)是使用Expect扩展的interact命令的一些更高级的功能。

特别是,interact有效地连接了由Expect编辑的程序spawn,但您也可以添加模式以允许扩展的行为。

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,我想分发这个程序。我猜想没有多少人安装了Expect。当您收到Ctrl + Z时,tcl中有没有办法将程序置于后台? – Herbert

0

GitHub的version的最新rlwraphas a bindable readline commandrlwrap-direct-keypress可以绑定(例如,在你的.inputrc)到任意键要直接传递到您的程序,绕过rlwrap

当编辑输入行时,所有其他按键仍然照常工作(例如移动光标)readline