【问题标题】:Change the escape sequence generated by xterm for key combinations更改 xterm 为组合键生成的转义序列
【发布时间】:2012-08-14 04:26:03
【问题描述】:

我的目标是设置一个终端,其中命令行界面程序的行为与键盘输入的预期一样(该程序最初是用 xharbour 为 Windows 编写的,但现在我想将它移植到 linux)。 我选择 xterm 开始,因为它更简单,无需禁用默认终端组合键。

使用 putty 时,大多数角色都可以很好地工作,而对于那些不使用的角色,我使用 autohotkey,一个 ahk 脚本就可以了。例如,对于 Ctrl+F1: ^F1::SendInput ^[O5P

我尝试并修改,重新编译 terminfo,更改它并更改键盘类型,但无法获得 ^[O5P 在终端中按 Ctrl+F1 的响应。 如果您知道进行此更改的任何方式,请告诉我...我已经阅读了数百页据称可以执行此操作的页面,但所有这些更改都没有产生任何效果或没有达到预期的效果。

所以我尝试修改终端设置以实现我的 Ctrl+F1 到 ^[O5P 目标,并尝试了一些类似于自动热键的命令和程序:

  • xmodmap,但是对于组合键它不起作用
  • xdotoolwindowactivate xyz type ^[O5P,这里返回单个字符的char码
  • xmacro,它不会将击键发送到其他窗口
  • ironahk,我刚开始尝试运行 example.ahk 时遇到错误,并且在其简易手册中找不到我想要的命令。
  • bind '\e[1;5P":"\e[O5P"',这里的第一个键码是我当前在键入 ctrl+f1 时得到的,然后是我希望通过这个组合得到的键码。没有效果。
  • xbindkeys + xvkbd,也没有帮助。

如果您已经知道,请帮助我,以某种方式实现了这一点(更改为组合键返回的键码)。

我使用最新的 CentOS 和 Ubuntu 进行测试。

【问题讨论】:

  • 我不明白您在做什么,但是如果您想更改 xterm 为某个键生成的转义序列,您需要修改其转换表。我在in-ulm.de/~mascheck/X11/xterm/XTerm 找到了一个很好的例子
  • 您链接中的翻译表看起来很有趣...我必须找出它在 Centos 中的位置...可能我以复杂的方式告诉它我在做什么,但你明白了我想做的是:更改 xterm 为 KEY COMBINATION 生成的转义序列。
  • 我链接到的示例文件是一个 X 资源文件。这些通常放在/etc/X11/app-defaults/ 中用于系统范围的配置,或$HOME/.Xresources$HOME/.Xdefaults 用于单个用户配置。如果你把它放在正确的位置(无论它可能是 Centos 的哪个位置),文件将在你的 X 会话开始时加载,你可以在会话中间使用xrdb -merge filename 重新加载它
  • 还有另一个选项:您可以通过将翻译表资源作为-xrm 选项将翻译添加到一个特定的xterm 实例。使用示例文件中的一小部分进行演示:xterm -xrm 'XTerm.VT100.translations: #override Ctrl<Key>Left: string(0x1b) string("b") \n Ctrl<Key>Right: string(0x1b) string("f")'
  • 为什么不使用 xterm 实际生成的字符序列并将其解释为 Ctrl+F1?这是 xHarbour 的终端库的限制吗?

标签: linux keyboard terminal autohotkey terminfo


【解决方案1】:

xterm 可以通过修改其翻译表配置为在按下某些键时发送自定义字符串。转换表是由xrdb 命令管理的X 资源数据库的一部分。

有一个为 xterm here 定制翻译表的好例子。它可以复制到您的$HOME/.Xdefaults$HOME/.Xresources 中,它将在您下次登录时加载。要立即将其加载到当前会话中,xrdb -merge $HOME/.Xresources。这不会影响任何已经在运行的 xterm。 (您也许可以使用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")'

【讨论】:

  • 知道如何为 Putty 配置这个吗?
  • 最好把它作为一个单独的问题。我对答案并不乐观。 xterm 的灵活性归功于 Xt 工具包,它提供了复杂的键绑定语言。 (xterm 只提供动作函数,在本例中为“字符串”)。没有其他图形工具包如此可配置。 Xt:比它的继任者有了很大的改进
  • stackoverflow.com/questions/11966534/… 这是单独的问题 :)
【解决方案2】:

不是直接回答问题,但ESC O 5 P 是一个终端发送的完全错误的事情。

简而言之:ESC O,也称为SS3 Single Shift 3 的缩写,是一个修改发送的下一个字符的序列,将其放在 G3 图形区域而不是标准图形区域。这将修改 5 并直接发送 P。这不是而且从来都不是一个好主意。

发送Ctrl-F1 的正确内容是CSI 1;5 P,这是CSI P(作为F1 键)的一种形式,第二个参数设置为5(作为修饰符位掩码)。

【讨论】:

  • 谢谢,但我不是终端专家,我关心的是制作终端,以便 xharbour 程序能够理解我的组合键,而 1;5P 则不能。
猜你喜欢
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2016-03-09
  • 1970-01-01
  • 2013-03-31
  • 2022-01-05
相关资源
最近更新 更多