如何使用 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
选项。
我在我的 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
选项。