【问题标题】:Mapping Caps Lock to Control from within Emacs on Windows在 Windows 上的 Emacs 中将 Caps Lock 映射到 Control
【发布时间】:2010-10-24 20:07:26
【问题描述】:

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

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

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

这似乎不起作用。

【问题讨论】:

    标签: emacs elisp autohotkey


    【解决方案1】:

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

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

    CapsLock::Ctrl
    LCtrl::Capslock
    

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

    【讨论】:

    • 从我假设的解决方案中备份并找到另一种方法做得很好。我非常简要地查看了 AutoHotKey,并认为它必须需要管理员权限,但它看起来就像一个魅力。我将编辑问题并添加一些相关链接。
    • 如果我错了,请纠正我,但脚本示例第二行中的拼写应该是“LCtrl::CapsLock”而不是“LCtrl::Cpaslock”
    【解决方案2】:

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

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

    【讨论】:

    • 是的,这就是我得到的感觉,但感谢你把它表达得比我能有的更好。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您不一定需要管理员权限才能修改注册表。
      事实上,Windows 注册表是一个分段资源,很像文件系统,您可以对注册表中的各个分支和节点拥有细粒度的权限。 您确定您无法更改注册表的假设是否正确? 我认为默认情况下在 Vista 上是这样,但在以前的 Windows 上不是。

      【讨论】:

      • 密钥重映射的常用方法是非常低级的,并且是每台机器(更改进入 HKLM\SYSTEM),所以管理员权限是必须的。
      猜你喜欢
      • 2015-02-09
      • 2013-03-04
      • 2011-01-11
      • 2020-05-18
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多