当我在控制台上运行 emacs24 时,两台 Lenovo 笔记本电脑上的 Fn 键都会设置选择标记(与 相同C-SPC
)。这是相当疯狂的行为,因为我需要 Fn 键来更改屏幕亮度、音量等。
如何解除 Fn 键的绑定,使其在 emacs 中不起作用?
编辑:
如果我按下C-h k Fn
emacs ,我会得到与按下完全相同的输出C-h k C-SPC
:
C-@ runs the command set-mark-command, which is an interactive compiledLisp function.
It is bound to C-@, C-SPC.
(set-mark-command ARG)
...
如果我运行 acpi_listen 并按 Fn 键,我会得到输出:
^@
C-SPC
如果按或C-@
(Ctrl+AltGr+2),这与我从 acpi_listen 获得的输出完全相同。也就是说:它们都注册为同一个 acpi 事件。
发现这一点后,我尝试取消设置C-@
。我让它工作的唯一方法是这样的:
(global-set-key (kbd "\C-@") 'ignore)
和这个:
(global-set-key (kbd "\^@") 'ignore)
在这两种情况下,C-SPC
我都尝试重新设置C-SPC
:
(global-set-key (kbd "C-SPC") 'set-mark-command)
但这并不生效。
之后我可以将我的问题细化为:
如果C-SPC
和Fn
被注册为相同的 acpi 事件,我可以让 emacs 区分它们吗?
(请注意,这只是控制台中的问题。Emacs 在我的 X 机器上无法拾取 Fn 键...)
答案1
这种使用 dumpkeys、loadkeys 和 showkey 的解决方案可能适用于 Linux 虚拟控制台中运行的程序以意外方式解释功能键的其他实例。
通过运行以下命令查找导致问题的按键或按键组合的按键代码:
$ sudo showkey
...然后按下键。在我的实例中,点击Fn输出为 143。
要阻止Fn控制台中的程序将其解释为任何内容,请添加此 /etc/rc.local:
(dumpkeys | grep keymaps; echo "keycode 143 =") | loadkeys
143 当然应该替换为相关按键的键码。我还遇到了Fn+ (用于降低音量)输出波浪号的问题LeftArrow,因此我也获得了该组合的代码,并在 /etc/rc.local 中添加了另一行。
请注意,这不会阻止Fn功能的正常行为(更改音量、亮度等),它只会阻止功能键被 emacs 等程序解释为任何内容。