我一会写完,你跑一下,反馈给我就行了。
(when (eq window-system "w32")
;; prevent single keypress from activating Start Menu
(setq w32-pass-lwindow-to-system nil)
;; make sure it's not used as a modifier
(setq w32-lwindow-modifier 'hyper)
;; overwrite system hotkey by emacs
(w32-register-hot-key [s-])
(define-key key-translation-map (kbd "<lwindow>")
(lambda(prompt)
(smart-input-source-set-english)
(event-apply-super-modifier prompt))))
跑一下这段代码。
然后看看,按win键是否会自动设置成英文。
另外注意一下,win键按下时起作用,还是释放时起作用。
按下win键时返回错误:
Wrong number of arguments: (lambda nil (smart-input-source-set-english) (event-apply-super-modifier)), 1
而且系统可以识别到win 键盘的命令比如 win+x。
@goumao 跑新的代码出现下面的错误:
Wrong number of arguments: (1 . 1), 0 [5 times]
上面那段代码我改了下,你重新贴过去跑一下
==更新1===
我再看看。等下
===更新2===
@aqua0210
上面代码更新了,再去试下。
我本地测试过,除了跟windows相关的部分,其它都没问题
===更新3===
重新复制跑一下,
刚才把测试按键的配置放在上面了,
不是原始的windows按键。
用最新的代码 跑了, 单独按了win 键盘 会提示 lwindows- 的前缀,但是按和系统有定义过的组合键就会激活系统命令。
更新:
我有个想法,能否监控当用户按下Super按键的时候 就自动切换输入法为英文,按键松开 再恢复状态就行了。就能达到和Ctrl键一样的效果。
我觉得你们可以直接私聊了,这个帖子信息密度太低了🤣
我也觉得,造成这个帖子要重开了。可以到QQ号去交流。
而且会自动切换到英文输入法。
就是说, 系统快捷键的优先级高于emacs快捷键的优先级?
这样设置的话,win键本身成为了一个前缀按键,后面可以接其他按键操作。同时按win+x 或者win+i 会激活系统命令。
没事。现在是高强度开发期,变化很大。
等稳定了,这个帖子也没什么价值了
那个时候,再开新帖就可以了。
哦,这样我觉得更好啊:
比如原来的emacs里,Win-x,
你分开按,
成了win x,
这样emacs按键就跟系统按键分开了,
同时起作用,各不冲突。
只是使用习惯上要稍微适应一下。
我再想想办法吧,这个主要是Windows系统的问题,我看看AHK是否有更好的解决办法。因为我好多命令都依赖这个super键,比较难以适应。
感谢帮忙一起分析,我大概也有点头绪了。
最新的方法,也是跟之前的一样。win 只能作为单个前缀来用,组合起来用就会激活系统命令。
又去读了下emacs的C代码,有眉目了。
只在elisp上,应该可以解决。
我一会写出来,你再测试一下。
(when (eq window-system "w32")
;; prevent single keypress from activating Start Menu
(setq w32-pass-lwindow-to-system nil)
(w32-register-hot-key [s-])
(setq w32-lwindow-modifier nil)
(define-key key-translation-map (kbd "<lwindow>")
(lambda(prompt)
(setq w32-lwindow-modifier 'super)
(smart-input-source-set-english)
(event-apply-super-modifier prompt))))
这个只是个概念验证,不是正式代码,
有效期:单次按win-SOMEKEY
,第二次就无效了。
按一次 Win+x 就直接打开了系统的命令,然后emacs 就崩溃了
更新: 更新后的代码还是一样,直接弹出系统命令。
经过试验,最终搞定了!
在Autohotkey的帮助下。
计划:
- 把autohotkey脚本生成exe文件,用户下载即可使用。
- 用elisp,把输入法、emacs映射和autohotkey都管起来。