【发布时间】:2014-11-13 20:45:18
【问题描述】:
您好,我想在 xfce4-terminal 或在 xfce4 X 环境下运行的任何终端中稍微更改键映射。
我特别想让ctrl-backspace和meta-backspace删除最后一个词,ctrl-delete和meta-delete删除下一个词。
到目前为止的进展:我正在使用 bash,而 bash 使用 readline 库和 bash 内置函数“bind”将键序列映射到 readline 函数。我需要的功能是“shell-kill-word”和“shell-backward-kill-word”。原则上,我应该可以这样做:
"\C-Rubout":shell-backward-kill-word
"\C-Delete":shell-kill-word
"\M-Rubout":shell-backward-kill-word
"\M-Delete":shell-kill-word
但是,xfce4 终端仿真器或进程上游的某些组件(可能是窗口管理器、xfwm4、Xorg 程序本身?)不合作。通常,元键被转换为转义字符,例如这样可以:
"\ey":shell-kill-word <-- Meta + y kills next word
但是使用退格键和删除键我不走运。我测试了两个终端仿真器 xfce4-terminal 和 xterm 的键码,它们是由键盘上的退格键、删除键和控制键组合生成的。正如 emacs 的 C-h C-l 命令所报告的那样,它们在这里:
xterm:
backspace: DEL
delete: \e[3~
\C-backspace: \C-h
\C-delete: \e[3;5~
\M-backspace: y-umlaut (y with two dots over it)
\M-delete: nothing
xfce4-terminal:
backspace: DEL
delete: \e[3~
\C-backspace: DEL
\C-delete: \e[3;5~
\M-backspace: \e DEL
\M-delete: nothing
特别是,在 xfce4-terminal 中,不可能将 \C-backspace 绑定到 shell-backword-kill-word,因为它发送的键码与常规退格键完全相同。并且不可能将 \M-delete 绑定到 shell-kill-word,因为它根本不发送密钥代码。
很遗憾,我不是 X 窗口系统方面的专家。对 Xorg 生态系统有更多了解的人可以为我指明正确的方向吗?也许有一个替代终端仿真器可以做得更好?我正在运行具有 xfce4 窗口管理器和 Xorg 的当前 Debian 发行版。
我发现使用最新的 Linux 软件和典型的现代计算机设置不可能获得这种行为几乎是不可思议的。真的是这样吗?
最后一条信息:在 X 窗口中运行 emacs,它会正确获取除一个键码之外的所有键码:
backspace: <backspace>
delete: <delete>
\C-backspace: <C-backspace>
\C-delete: <C-delete>
\M-backspace: <M-backspace>
\M-delete: nothing
【问题讨论】:
-
没有时间详细说明,但请记住,终端非常陈旧,很难在不破坏任何东西的情况下进行更改。除了 xterm 中的更新支持之外,还有很多无法在传统系统中表示为转义码的击键。更复杂的是 xterm 中的元转义设置和 8 位清洁度设置。
-
@EtanReisner 感谢您的意见。我真的不足以成为专家来发表更多评论(而且我还没有找到解决方案)。在我看来,当操作系统的输入设备无法映射到该操作系统时,出现了问题。
-
某人花费大量时间仔细找出最广泛使用的 Linux 窗口系统/硬件组合之一上的常见问题,并在 SO 上寻找解决方案,但他的努力却遭到了反对?这让我很沮丧。
-
我能想到的最好的结果是,反对票是针对离题的(因为它有点像),但我不知道。
-
啊,好吧。我在 unix.stackexchange 上发帖,但没有在那边找到 sln。如果有足够多的人认为这是题外话,那对我来说没问题。否决票的帮助不大。