当阅读这些问题或EmacsWiki文章有关在Windows中的emacs中将Caps Lock映射到Control时,最好的答案似乎涉及注册表。我的问题是,当用户因为没有管理员权限而无法修改计算机的注册表时可以做什么。有没有办法在 emacs 中进行映射? 这篇文章 非常接近,甚至说:“正如人们提到的,您当然可以将 Caps-Lock 映射到其他键,例如 Control 键。”但我不知道如何表示控制键(使用各种参考,看起来相当全面,但可能不是以 Windows 为中心),尝试类似
(setq w32-enable-caps-lock nil)
(global-set-key [capslock] '[control])
和
(setq w32-enable-caps-lock nil)
(global-set-key [capslock] 'ctl-x-map)
这似乎不起作用。
我知道这并不能真正回答你的问题,但特雷·杰克逊基本上解释了这个问题。要单独检测控制键需要 Windows 上的低级键盘挂钩,我认为 Emacs 没有实现这一点。
一种方法(涉及外部程序,但不需要管理员权限)是使用AutoHotkey。您所需要的只是以下 2 行脚本:
CapsLock::Ctrl
LCtrl::Capslock
每当 emacs 打开时,您都需要运行此脚本,但幸运的是 Autohotkey 是一个非常低调的应用程序(通常仅占用大约几百 Kb 的内存)。例如,您可以在 .emacs 中执行此脚本,以便在打开 emacs 时交换控制键和大写锁定键。
我相信它不起作用,因为 Windows(或 X)不会传递
[capslock]
或 [control]
的实际事件 - 它是一个修饰键,如 [shift]
。 按修饰键不会导致应用程序获得击键,但如果您同时按下修饰键和第二个(非修饰键)键,则会获得击键。
例如
[a]
和 [A]
是两个不同的键,一个是常规的“a”,另一个本质上是“shift-a”。 我确信您可以将 Windows 设置为让“shift-a”实际上发送“z”或其他内容。
因为
[capslock]
、[control]
、[shift]
、[meta]
都是修饰键,因此它们本身不会为应用程序生成按键事件。
简而言之,Emacs 不会获取可重新映射的
[control]
键事件,而是获取 C-a
事件。 这通常是通过 [control]
和 [a]
键的明显组合来完成的。 但是,该事件可以通过不同的击键生成,例如 [F10]
甚至 [y]
(令人困惑,是的)。
我是这么理解的。 当然欢迎澄清。
在 Windows 上重新映射 CapsLock 的最简单方法是下载此 CapsLockChanger 实用程序,选择要映射到的键(Control)并将其放入“开始”->“启动”菜单中。
它保留在您的托盘中,完成按键重新映射的工作,并且不需要弄乱注册表。
您不一定需要管理员权限才能修改注册表。
事实上,Windows 注册表是一个分段资源,很像文件系统,您可以对注册表内的各个分支和节点拥有细粒度的权限。
您确定您无法更改注册表的假设是正确的吗?
我认为在 Vista 上默认是这样,但在以前的 Windows 上则不然。
我使用 Ubuntu 24.10,并且使用这个名为 Gnome-Tweaks 的重要程序 在那里你可以设置大写锁定键->控制键。仅靠 EMACS 是无法做到这一点的。我希望这能对其他人有所帮助。