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

Bre*_*ote 10 emacs autohotkey elisp

当阅读这些 问题中的任何一个EmacsWiki文章关于在Windows中的emacs中将Caps Lock映射到Control时,最佳答案似乎涉及注册表.我的问题是当用户无法修改机器的注册表时,用户可以做什么,因为他们没有管理员权限.有没有办法从emacs中进行映射?这篇文章非常接近,甚至说,"正如人们所提到的,你当然可以将Caps-Lock映射到其他键,例如Control键." 但我无法弄清楚如何表示控制键(使用看起来相当全面但可能不是以Windows为中心的各种引用),尝试类似的东西

(setq w32-enable-caps-lock nil)
(global-set-key [capslock] '[control])
Run Code Online (Sandbox Code Playgroud)

(setq w32-enable-caps-lock nil)
(global-set-key [capslock] 'ctl-x-map)
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.

pol*_*lot 9

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

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

CapsLock::Ctrl
LCtrl::Capslock
Run Code Online (Sandbox Code Playgroud)

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


Tre*_*son 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](令人困惑的,是的).

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