Terminal 如何使用tcl在原始模式终端中将按键处理委托给rlwrap

Terminal 如何使用tcl在原始模式终端中将按键处理委托给rlwrap,terminal,tcl,stty,rlwrap,Terminal,Tcl,Stty,Rlwrap,我在我的tcl终端程序中使用stty raw-echo。 我想要的是只对一些按键事件(如Tab)执行一些操作。对于其余的按键事件,我希望委托给rlwrap或其他默认处理程序,例如← 将光标移到左侧并在光标所在位置插入文本,或按Ctrl+C键终止程序。有没有办法做到这一点?唉,终端处理系统的工作方式并不能让这变得简单。但这并非不可能。我能想到的最简单的机制(事实上,唯一一个不会让我畏缩的机制)是使用Expect扩展的interact命令的一些更高级的功能 特别是,interactive有效地将Ex

我在我的tcl终端程序中使用
stty raw-echo

我想要的是只对一些按键事件(如Tab)执行一些操作。对于其余的按键事件,我希望委托给rlwrap或其他默认处理程序,例如← 将光标移到左侧并在光标所在位置插入文本,或按Ctrl+C键终止程序。有没有办法做到这一点?

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

特别是,
interactive
有效地将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...
rlwrap
rlwrap direct keypress
的最新GitHub,可以绑定(例如在
.inputrc
中)到要直接传递到程序的任何键,绕过
rlwrap


当使用
readline

编辑输入行时,所有其他键仍将正常工作(例如移动光标)。stty中有一个选项为您处理信号,即
isig
选项。 另外,
-opost
为您处理“\n”到“\r\n”


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

可能不是您的想法,因为跨程序委派责任会使终端连接(和初始化)变得麻烦。谢谢。但是我没有安装Expect,我想分发这个程序。我想没有多少人希望安装。在tcl中,当您收到Ctrl+Z时,是否有办法将程序置于后台?
stty raw -echo isig