windows系统下如何解决emacs部分按键被系统拦截?

新工作需要在windows系统下进行,所以将自己的配置适配到windows系统,在此过程中遇到了些按键相关的问题,希望大家给点意见,谢谢!

前提使用autohotkey交换了一些按键:

LAlt::LCtrl
LCtrl::LWin
LWin::LAlt

并在elisp中设置了如下配置:

     (setq w32-pass-lwindow-to-system nil)
     (setq w32-lwindow-modifier 'super)

     (setq w32-apps-modifier 'hyper)
     (setq w32-pass-alt-to-system nil)

     (w32-register-hot-key [s-])
     (w32-register-hot-key [c-])
     (setq w32-recognize-altgr nil)

具体问题是s前缀(也就是windows系统win键)会被系统拦截,导致在emacs中s前缀的组合键不起作用,其他的一些组合键如:C-;M-g 等也都被系统拦截,大家对于这种情况是怎么解决的?

我记得官方建议是用户自定义的快捷键以C-c开头。如果用户自定义命令取代了系统自建命令,那么可以使用其快捷键。

我个人偏好EVIL(Vim模拟器),结合leader键来自定义快捷键,

另外我的哲学是自定义快捷键不用很多,常用的几个就行了。不常用的就M-x输入命令。诀窍是“常用”的快捷键必须通过长期的(我用keyfreq测了至少一年)测量来发现。

建议看我的专栏“如何提高编程速度”,有详细的讨论。

虽然Emacs很自由,但是如何利用这种自由优化工作流还是有很多套路的。

感谢你的回复。看来我得换种方式来解决现在的问题,看看再优化下我的按键配置。

我的配置和你的差不多:

(when (eq system-type 'windows-nt)
  (setq w32-pass-lwindow-to-system nil)
  (setq w32-lwindow-modifier 'super)
  (setq w32-pass-rwindow-to-system nil)
  (setq w32-rwindow-modifier 'super)
  (w32-register-hot-key [s-])

  (setq w32-pass-apps-to-system nil)
  (define-key key-translation-map (kbd "<apps>") (kbd "C-\\"))
  )

然后通过AHK 模拟了一整套Emacs的按键,在其他应用中大部分也都是Emacs 的按键。我用的Emacs 原生按键,没用 evil。

没遇到你说的 M-g 和 C-; 的冲突。

你的s前缀键不会被系统拦截吗?

不会冲突,除了 s-l ,因为Win+l 组合在Windows 系统的优先级比较高。

(setq w32-pass-lwindow-to-system nil)

上面这条命令就是在Emacs 不返回 win键给系统。你的有问题估计跟 AHK 绑定有关,你可以尝试先不要用AHK,看看是否会冲突。

ps:我现在的配置是放弃了使用super键,因为我发现不大好按。

感谢!我的配置好像有问题,老是识别不了,我再看看。

确实是AHK的问题,那使用AHK咋交换按键?

AHK的话你得看下AHK的文档了。也可以用微软新开发这个工具映射按键,很方便。

好嘞,谢谢啦