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

How to delegate key press handling to rlwrap in raw mode terminal with tcl

我在我的 tcl 终端程序中使用 stty raw -echo。 我想要的是只对少数按键事件执行一些操作,例如 Tab。对于其余的按键事件,我想委托给 rlwrap 或其他默认处理程序,例如 将光标移动到左侧并在光标所在的位置插入文本,或者Ctrl+C终止程序。有办法吗?

唉,终端处理系统的工作方式并不容易。 但这并非不可能。我能想到的最简单的机制(事实上,唯一不会让我感到畏缩的机制)是使用一些更高级的功能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...

最新的 GitHub version of rlwrap has a bindable readline command rlwrap-direct-keypress 可以绑定(例如在你的 .inputrc 中)到你想直接传递给你的程序的任何键,绕过rlwrap

当使用 readline

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

stty 中有一个选项可以为您处理信号,即 isig 选项。 此外,-opost 为您处理“\n”到“\r\n”。

stty raw -echo isig

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