将Caps Lock映射到Windows上的Emacs内控制

时间:2009-05-08 15:41:15

标签: emacs elisp autohotkey

在阅读these questionsEmacsWiki article中关于在Windows中的emacs中将Caps Lock映射到控件时,最佳答案似乎涉及注册表。我的问题是当用户无法修改机器的注册表时,用户可以做什么,因为他们没有管理员权限。有没有办法从emacs中进行映射? This article非常接近,甚至说,“正如人们所提到的,你当然可以将Caps-Lock映射到其他键,例如Control键。”但我无法弄清楚如何表示控制键(使用various references看起来相当全面,但可能不是以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)

似乎不起作用。

4 个答案:

答案 0 :(得分:9)

我知道这并没有真正回答你的问题,但Trey Jackson基本上解释了这个问题。要单独检测控制键需要Windows上的低级键盘钩子,我认为Emacs不会实现。

一种方式(涉及外部程序,但不需要管理员权限)是使用AutoHotkey。您只需要以下2行脚本:

CapsLock::Ctrl
LCtrl::Capslock

每当emacs打开时你都需要运行这个脚本,但幸运的是Autohotkey是一个相当低调的应用程序(通常只需要几百Kb的内存)。例如,您可以在.emacs中执行此脚本,以便在打开emacs时交换控制键和大写锁定键。

答案 1 :(得分:6)

我认为它不起作用,因为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](令人困惑,是的)。

这就是我理解的方式。当然欢迎澄清。

答案 2 :(得分:1)

在Windows上重新映射CapsLock的最简单方法是下载此CapsLockChanger实用程序,选择要映射到(控件)的键并将其放在Start-> Startup菜单中。

它保留在您的托盘中,完成密钥重新映射的工作,并且不需要乱用注册表。

答案 3 :(得分:0)

您不一定需要管理员权限才能修改注册表 实际上,Windows注册表是一个分段资源,非常类似于文件系统,您可以在注册表中的各个分支和节点上拥有细化权限。 你确定你不能改变注册表的假设是正确的吗? 我认为在Vista上默认情况下是这样,但在之前的Windows上却没有。