我的目标是设置一个终端,其中命令行界面程序将按照键盘输入的预期运行(该程序最初是用xharbour编写的,用于Windows,但现在我想将其移植到linux)。我选择了 xterm 开始,因为它更简单,无需禁用默认的终端组合键。
使用腻子,大多数字符都可以很好地工作,对于那些不工作的角色,我使用自动热键,一个ahk脚本,可以完成这项工作。例如,对于 Ctrl+F1: ^F1::SendInput ^[O5P
我尝试并修改,重新编译terminfo,更改它并更改键盘类型,但无法在终端中按Ctrl + F1获得^[O5P响应。如果您知道进行此更改的任何方法,请告诉我...我已经阅读了数百页,据说可以这样做,但所有这些更改都没有产生任何效果或不是预期的效果。
所以我离开了尝试修改终端设置以实现我的 Ctrl+F1 到 ^[O5P 目标,并尝试了一些类似于 autohotkey 的命令和程序:
-
xmodmap
,但对于组合键它不起作用 -
xdotool
窗口激活 xyz 类型 ^[O5P,这将返回单个字符的字符代码 -
xmacro
,它不会将击键发送到其他窗口 -
ironahk
,我在尝试运行 example.ahk 时一开始就遇到了错误,并且在其轻型手册中找不到我想要的命令。 -
bind 'e[1;5P":"e[O5P"'
,这里的第一个键代码是我目前在键入 ctrl+f1 时获得的,在我希望通过此组合获得的键码之后。没有效果。 -
xbindkeys
+xvkbd
,也无济于事。
如果您已经知道,请帮助我,以某种方式设法实现这一目标(更改为组合键返回的键代码)。
我使用最新的 CentOS 和 Ubuntu 进行测试。
xterm可以通过修改其转换表配置为在按下某些键时发送自定义字符串。转换表是由 xrdb
命令管理的 X 资源数据库的一部分。
这里有一个为 xterm 自定义转换表的很好的例子。它可以复制到您的$HOME/.Xdefaults
或$HOME/.Xresources
,并在您下次登录时加载。要立即将其加载到当前会话中,请xrdb -merge $HOME/.Xresources
。这不会影响任何已经在运行的 xterms。(您可以使用 editres
更改正在运行的 xterm 的转换表,但这比它的价值更麻烦。
要为 xterm 的单个实例提供自定义转换表,请使用 -xrm
选项,如
xterm -xrm 'XTerm.VT100.translations: #override Ctrl<Key>Left: string(0x1b) string("b") n Ctrl<Key>Right: string(0x1b) string("f")'
不直接回答问题,但对于终端发送来说ESC O 5 P
是一件完全错误的事情。
简而言之:ESC O
,也称为 SS3
单班 3 的缩写,是一个修改发送的下一个字符的序列,将其放在 G3 图形区域而不是标准图形区域中。这将修改 5 并直接发送 P。这不是,也从来都不是一个好主意。
发送Ctrl-F1
的正确内容是 CSI 1;5 P
,一种CSI P
形式(是 F1 键),第二个参数设置为 5(作为修饰符位掩码)。