2009-05-08 66 views
10

当阅读thesequestionsEmacsWiki article关于在Windows中的emacs中将Caps Lock映射为控件时,最好的答案似乎涉及注册表。我的问题是用户无法修改机器的注册表,因为他们没有管理员权限可以执行什么操作。有没有办法从emacs内部进行映射? This article来哦,所以关闭,甚至说,“正如人们已经提到的,你当然可以将Caps-Lock映射到其他键,例如控制键。”但我无法弄清楚如何表示的控制键(使用various references看起来很全面,但可能不是以Windows为中心),试图像在Windows上映射大写锁定以从Emacs内部进行控制

(setq w32-enable-caps-lock nil) 
(global-set-key [capslock] '[control]) 

(setq w32-enable-caps-lock nil) 
(global-set-key [capslock] 'ctl-x-map) 

其不要的东西t似乎工作。

回答

8

我知道这并不能真正回答你的问题,但特雷杰克逊基本上解释了这个问题。单独检测控制键需要Windows上的低级别键盘钩子,我不认为Emacs实现了该键。

单程(涉及外部程序,但不需要管理权限)是使用AutoHotkey。所有你需要的是以下2行脚本:

CapsLock::Ctrl 
LCtrl::Capslock 

您需要每当Emacs是开放的,但幸运的是AutoHotkey的是相当低调的应用程序来运行该脚本(通常只需要大约几百KB的内存)。例如,您可以在.emacs中执行此脚本,以便在打开emacs时交换控制键和大写锁定键。

+0

做好了我假设的解决方案并找到了另一种方法。我对AutoHotKey进行了非常简短的介绍,并假设它必须要求管理员权限,但它看起来像魅力一样工作。我将编辑该问题并添加一些相关链接。 – 2009-05-08 17:06:39

+0

纠正我,如果我错了,但脚本示例的第二行中的拼写应该是“LCtrl :: CapsLock”而不是“LCtrl :: Cpaslock” – 2010-01-07 00:23:08

+0

当然,你是对的。固定。 – polyglot 2010-01-08 01:13:57

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](令人困惑,是的)。

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

+0

是的,这是我得到的感觉,但谢谢你阐述它,比我能有的更好。 – 2009-05-08 17:04:14

1

在Windows上重新映射CapsLock的最简单方法是下载此CapsLockChanger实用程序,选择一个映射到(控制)的密钥并将其放入您的开始 - >启动菜单。

它保留在您的托盘中,做关键重新映射的工作,并不需要与注册表搞混了。

0

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

+0

关键重新映射的常用方法是非常低级的和每台机器(更改到HKLM \ SYSTEM的某处),因此管理员权限是必须的。 – 2009-05-09 19:32:52